From e9ca20bc4ce24ad6aa84e8c63aae61dd92c09828 Mon Sep 17 00:00:00 2001
From: Oliver Wiese <oliver.wiese@fu-berlin.de>
Date: Wed, 17 May 2017 10:05:46 +0200
Subject: [PATCH] still not working finish refactoring

---
 EnzevalosContact+CoreDataClass.swift          | 24 ++++++++---------
 PersistentMail +CoreDataClass.swift           |  4 +--
 .../CNMailAddressesExtension.swift            | 13 +++++++++
 enzevalos_iphone/DataHandler.swift            | 24 ++++++++---------
 enzevalos_iphone/Encryption.swift             | 21 +++++++--------
 .../EnzevalosEncryptionHandler.swift          |  2 +-
 enzevalos_iphone/InboxCellDelegator.swift     |  3 ++-
 enzevalos_iphone/InboxTableViewCell.swift     |  4 +--
 enzevalos_iphone/InboxViewController.swift    |  4 +--
 enzevalos_iphone/KeyRecord.swift              | 13 ++++-----
 enzevalos_iphone/ListViewController.swift     |  8 +++---
 enzevalos_iphone/MailAddress.swift            |  3 +++
 enzevalos_iphone/MailHandlerDelegator.swift   |  3 ++-
 .../Mail_Address+CoreDataClass.swift          |  2 +-
 .../Mail_Address+CoreDataProperties.swift     | 14 +++++-----
 enzevalos_iphone/PGPEncryption.swift          | 25 +++++++++--------
 .../PersistentMail +CoreDataProperties.swift  | 27 ++++++++++++++++---
 enzevalos_iphone/ReadViewController.swift     | 12 ++++-----
 enzevalos_iphone/SendViewController.swift     |  6 ++---
 19 files changed, 125 insertions(+), 87 deletions(-)

diff --git a/EnzevalosContact+CoreDataClass.swift b/EnzevalosContact+CoreDataClass.swift
index 033d2aca..7f50b48f 100644
--- a/EnzevalosContact+CoreDataClass.swift
+++ b/EnzevalosContact+CoreDataClass.swift
@@ -35,15 +35,15 @@ open class EnzevalosContact: NSManagedObject, Contact, Comparable {
     }
     
     
-    open var to: [Mail]{
+    open var to: [PersistentMail]{
         get{
-            var mails = [Mail]()
+            var mails = [PersistentMail]()
             if let adrs = addresses{
                 for adr in adrs{
                     let a  = adr as! Mail_Address
                     if a.to != nil {
                         for m in a.to!{
-                            mails.append(m as! Mail)
+                            mails.append(m as! PersistentMail)
                         }
                     }
                 }
@@ -52,15 +52,15 @@ open class EnzevalosContact: NSManagedObject, Contact, Comparable {
         }
     }
     
-    open var bcc: [Mail]{
+    open var bcc: [PersistentMail]{
         get{
-            var mails = [Mail]()
+            var mails = [PersistentMail]()
             if let adrs = addresses{
                 for adr in adrs{
                     let a  = adr as! Mail_Address
                     if a.bcc != nil {
                         for m in a.bcc!{
-                            mails.append(m as! Mail)
+                            mails.append(m as! PersistentMail)
                         }
                     }
                 }
@@ -71,15 +71,15 @@ open class EnzevalosContact: NSManagedObject, Contact, Comparable {
     
     
     
-    open var cc: [Mail]{
+    open var cc: [PersistentMail]{
         get{
-            var mails = [Mail]()
+            var mails = [PersistentMail]()
             if let adrs = addresses{
                 for adr in adrs{
                     let a  = adr as! Mail_Address
                     if a.cc != nil {
                         for m in a.cc!{
-                            mails.append(m as! Mail)
+                            mails.append(m as! PersistentMail)
                         }
                     }
                 }
@@ -88,15 +88,15 @@ open class EnzevalosContact: NSManagedObject, Contact, Comparable {
         }
     }
     
-    open var from: [Mail]{
+    open var from: [PersistentMail]{
         get{
-            var mails = [Mail]()
+            var mails = [PersistentMail]()
             if let adrs = addresses{
                 for adr in adrs{
                     let a  = adr as! Mail_Address
                     if a.from != nil {
                         for m in a.from!{
-                            mails.append(m as! Mail)
+                            mails.append(m as! PersistentMail )
                         }
                     }
                 }
diff --git a/PersistentMail +CoreDataClass.swift b/PersistentMail +CoreDataClass.swift
index 8cae323d..fea73f0c 100644
--- a/PersistentMail +CoreDataClass.swift	
+++ b/PersistentMail +CoreDataClass.swift	
@@ -1,5 +1,5 @@
 //
-//  Mail+CoreDataClass.swift
+//  PersistentMail+CoreDataClass.swift
 //  enzevalos_iphone
 //
 //  Created by Oliver Wiese on 27/12/16.
@@ -13,7 +13,7 @@ import CoreData
 
 @objc(PersistentMail)
 open class PersistentMail: NSManagedObject, Mail {
-
+    
     var showMessage: Bool = false
 
     var isSecure: Bool {
diff --git a/enzevalos_iphone/CNMailAddressesExtension.swift b/enzevalos_iphone/CNMailAddressesExtension.swift
index 9cae6987..bddb1c0e 100644
--- a/enzevalos_iphone/CNMailAddressesExtension.swift
+++ b/enzevalos_iphone/CNMailAddressesExtension.swift
@@ -31,6 +31,19 @@ open class CNMailAddressExtension: MailAddress{
         }
     }
     
+    
+    open var keyID: String?{
+        get{
+            return nil
+        }
+    }
+    
+    open var contact: EnzevalosContact?{
+        get{
+            return nil
+        }
+    }
+    
     init(addr: CNLabeledValue<NSString>){ //FIXME: NSString hier richtig?
         self.label = addr
     }
diff --git a/enzevalos_iphone/DataHandler.swift b/enzevalos_iphone/DataHandler.swift
index 30ca2df3..69d50035 100644
--- a/enzevalos_iphone/DataHandler.swift
+++ b/enzevalos_iphone/DataHandler.swift
@@ -42,7 +42,7 @@ class DataHandler {
     static let handler: DataHandler = DataHandler()
     
     private var managedObjectContext: NSManagedObjectContext
-    lazy var mails: [Mail] = self.readMails()
+    lazy var mails: [PersistentMail] = self.readMails()
     lazy var contacts: [EnzevalosContact] = self.getContacts()
     lazy var currentstate: State = self.getCurrentState()
     
@@ -147,7 +147,7 @@ class DataHandler {
         for c in contacts {
             while c.from.count > MaxMailsPerRecord {
                 let last = c.from.last!
-                print("delete \(last.uid) of \(last.from.address)")
+                print("delete \(last.uid) of \(last.from.mailAddress)")
                 managedObjectContext.delete(last)
                 save()
                 if let index = mails.index(of: last) {
@@ -318,7 +318,7 @@ class DataHandler {
     
     
     // -------- Start handle to, cc, from addresses --------
-    private func handleFromAddress(_ sender: MCOAddress, fromMail: Mail, autocrypt: AutocryptContact?) {
+    private func handleFromAddress(_ sender: MCOAddress, fromMail: PersistentMail, autocrypt: AutocryptContact?) {
         let adr: Mail_Address
         let contact = getContactByMCOAddress(sender)
         adr = contact.getAddressByMCOAddress(sender)!
@@ -329,11 +329,11 @@ class DataHandler {
         fromMail.from = adr
     }
     
-    private func handleToAddresses(_ receivers: [MCOAddress], mail: Mail) {
+    private func handleToAddresses(_ receivers: [MCOAddress], mail: PersistentMail) {
         mail.addToTo(NSSet(array: getMailAddressesByMCOAddresses(receivers)))
     }
     
-    private func handleCCAddresses(_ cc: [MCOAddress], mail: Mail) {
+    private func handleCCAddresses(_ cc: [MCOAddress], mail: PersistentMail) {
         mail.addToCc(NSSet(array: getMailAddressesByMCOAddresses(cc)))
     }
     
@@ -344,11 +344,11 @@ class DataHandler {
     func createMail(_ uid: UInt64, sender: MCOAddress, receivers: [MCOAddress], cc: [MCOAddress], time: Date, received: Bool, subject: String, body: String, flags: MCOMessageFlag, record: KeyRecord?, autocrypt: AutocryptContact?) /*-> Mail*/ {
         
         let finding = findNum("Mail", type: "uid", search: uid)
-        let mail: Mail
+        let mail: PersistentMail
         
         if finding == nil || finding!.count == 0 {
             // create new mail object
-            mail  = NSEntityDescription.insertNewObject(forEntityName: "Mail", into: managedObjectContext) as! Mail
+            mail  = NSEntityDescription.insertNewObject(forEntityName: "Mail", into: managedObjectContext) as! PersistentMail
           
             mail.body = body
             mail.date = time
@@ -391,12 +391,12 @@ class DataHandler {
         //return mail
     }
 
-    private func readMails() -> [Mail] {
-        var mails = [Mail]()
+    private func readMails() -> [PersistentMail] {
+        var mails = [PersistentMail]()
         let result = findAll("Mail")
         if result != nil {
             for r in result! {
-                let m = r as! Mail
+                let m = r as! PersistentMail
                 mails.append(m)
                 if  getCurrentState().maxUID < m.uid {
                     getCurrentState().maxUID = m.uid
@@ -449,7 +449,7 @@ class DataHandler {
         return records
     }
     
-    private func addToRecords(_ m:Mail, records: inout [KeyRecord] ){
+    private func addToRecords(_ m: PersistentMail, records: inout [KeyRecord] ){
     
         var found = false
         for r in records {
@@ -501,7 +501,7 @@ class DataHandler {
         }
     }
     
-    private func addToReceiverRecords(_ m: Mail){
+    private func addToReceiverRecords(_ m: PersistentMail){
         addToRecords(m, records: &receiverRecords)
     }
     
diff --git a/enzevalos_iphone/Encryption.swift b/enzevalos_iphone/Encryption.swift
index be88b293..2be3e277 100644
--- a/enzevalos_iphone/Encryption.swift
+++ b/enzevalos_iphone/Encryption.swift
@@ -7,7 +7,6 @@
 //
 
 public protocol Encryption {
-    
     /**
      * ATTENTION: always have a look at the concrete Encryption you are working with! It my differ in some cases from this definition. e.g. some parameters may be used or unused.
      * In some functions nil is returned, if there is no answer to be made at the moment. An example for this case is the PGPEncryption. You have to decrypt the message before you can see, if there is a signature
@@ -19,41 +18,41 @@ public protocol Encryption {
     init(encHandler: EncryptionHandler)
     
     //check whether this encryption is used in this mail. This means is it used for encryption OR signing.
-    func isUsed(_ mail: Mail) -> Bool
+    func isUsed(_ mail: PersistentMail) -> Bool
     
     //check whether this encryption is used in this text. This means is it used for encryption OR signing. the key is not known to be used. nil is returned, if there is no answer to be made at the moment.
     func isUsed(_ text: String, key: KeyWrapper?) -> Bool
     
     //check whether this encryption is used in this mail for encryption. nil is returned, if there is no answer to be made at the moment.
-    func isUsedForEncryption(_ mail: Mail) -> Bool?
+    func isUsedForEncryption(_ mail: PersistentMail) -> Bool?
     
     //check whether this encryption is used in this text for encryption. the key is not known to be used. nil is returned, if there is no answer to be made at the moment.
     func isUsedForEncryption(_ text: String, key: KeyWrapper?) -> Bool?
     
     //check whether this encryption is used in this mail for signing. nil is returned, if there is no answer to be made at the moment.
-    func isUsedForSignature(_ mail: Mail) -> Bool?
+    func isUsedForSignature(_ mail: PersistentMail) -> Bool?
     
     //check whether this encryption is used in this text for signing. nil is returned, if there is no answer to be made at the moment.
     func isUsedForSignature(_ text: String, key: KeyWrapper?) -> Bool?
     
     //decrypt the mails body. the decryted body will be saved in the mail object.
-    func decrypt(_ mail: Mail) -> String?
+    func decrypt(_ mail: PersistentMail) -> String?
     
     //decrypt the mails body. the decryted body will be saved in the mail object.
     //Signaturechecking included. will be set in mail object too.
-    func decryptAndSignatureCheck(_ mail: Mail)
+    func decryptAndSignatureCheck(_ mail: PersistentMail)
     
     //decrypt the text with the given key and return it.
     func decrypt(_ text: String, keyID: String) -> String?
     
     //check whether the mail is correctly signed with this encryption. nil is returned, if there is no answer to be made at the moment.
-    func isCorrectlySigned(_ mail: Mail) -> Bool?
+    func isCorrectlySigned(_ mail: PersistentMail) -> Bool?
     
     //check whether the text is correctly signed with this encryption.
     func isCorrectlySigned(_ text: String, key: KeyWrapper) -> Bool?
     
     //encrypt mail for contact
-    func encrypt(_ mail: Mail)
+    func encrypt(_ mail: PersistentMail)
     
     func encrypt(_ text: String, mailaddresses: [String]) -> Data?
     
@@ -61,13 +60,13 @@ public protocol Encryption {
     func encrypt(_ text: String, keyIDs: [String]) -> Data?
     
     //sign mail
-    func sign(_ mail: Mail)
+    func sign(_ mail: PersistentMail)
     
     //sign text
     func sign(_ text: String, key: KeyWrapper) -> String
     
     //sign and encrypt mail for contact
-    func signAndEncrypt(_ mail: Mail, forContact: KeyRecord)
+    func signAndEncrypt(_ mail: PersistentMail, forContact: KeyRecord)
     func signAndEncrypt(_ text: String, keyIDs: [String]) -> Data?
     func signAndEncrypt(_ text: String, mailaddresses: [String]) -> Data?
     
@@ -76,7 +75,7 @@ public protocol Encryption {
     @discardableResult func addKey(_ keyData: Data, forMailAddresses: [String]?, discoveryMailUID: UInt64?) -> String?
     
     //key is connected to the senders address, if discoveryMail is set
-    @discardableResult func addKey(_ keyData: Data, discoveryMail: Mail?) -> String?
+    @discardableResult func addKey(_ keyData: Data, discoveryMail: PersistentMail?) -> String?
     
     //will be maybe deleted... because keyWrapper will be added when constructed
     //func addKey(key: KeyWrapper, forMailAddress: [String]?, callBack: ((success: Bool) -> Void)?)
diff --git a/enzevalos_iphone/EnzevalosEncryptionHandler.swift b/enzevalos_iphone/EnzevalosEncryptionHandler.swift
index 1a664fa5..6ee0137f 100644
--- a/enzevalos_iphone/EnzevalosEncryptionHandler.swift
+++ b/enzevalos_iphone/EnzevalosEncryptionHandler.swift
@@ -57,7 +57,7 @@ class EnzevalosEncryptionHandler : EncryptionHandler {
     
     
     
-    static func getEncryptionTypeForMail(_ mail: Mail) -> EncryptionType {
+    static func getEncryptionTypeForMail(_ mail: PersistentMail) -> EncryptionType {
         for (type, enc) in encryptions {
             if enc.isUsed(mail) {
                 return type
diff --git a/enzevalos_iphone/InboxCellDelegator.swift b/enzevalos_iphone/InboxCellDelegator.swift
index 8989b99f..355d6365 100644
--- a/enzevalos_iphone/InboxCellDelegator.swift
+++ b/enzevalos_iphone/InboxCellDelegator.swift
@@ -7,7 +7,8 @@
 //
 
 protocol InboxCellDelegator {
-    func callSegueFromCell(_ mail: Mail?)
+    
+    func callSegueFromCell(_ mail: PersistentMail?)
     func callSegueFromCell2(_ contact: KeyRecord?)
     func callSegueToContact(_ contact: KeyRecord?)
 }
diff --git a/enzevalos_iphone/InboxTableViewCell.swift b/enzevalos_iphone/InboxTableViewCell.swift
index 96456505..34654e20 100644
--- a/enzevalos_iphone/InboxTableViewCell.swift
+++ b/enzevalos_iphone/InboxTableViewCell.swift
@@ -102,7 +102,7 @@ class InboxTableViewCell: UITableViewCell {
         }
     }
 
-    var firstMail: Mail? {
+    var firstMail: PersistentMail? {
         didSet {
             if let mail = firstMail {
                 if !mail.isRead {
@@ -120,7 +120,7 @@ class InboxTableViewCell: UITableViewCell {
         }
     }
 
-    var secondMail: Mail? {
+    var secondMail: PersistentMail? {
         didSet {
             if let mail = secondMail {
                 if !mail.isRead {
diff --git a/enzevalos_iphone/InboxViewController.swift b/enzevalos_iphone/InboxViewController.swift
index 50812ee3..07879cc6 100644
--- a/enzevalos_iphone/InboxViewController.swift
+++ b/enzevalos_iphone/InboxViewController.swift
@@ -144,7 +144,7 @@ class InboxViewController: UITableViewController, InboxCellDelegator {
         return 0.01
     }
 
-    func callSegueFromCell(_ mail: Mail?) {
+    func callSegueFromCell(_ mail: PersistentMail?) {
         performSegue(withIdentifier: "readMailSegue", sender: mail)
     }
 
@@ -160,7 +160,7 @@ class InboxViewController: UITableViewController, InboxCellDelegator {
 
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         if segue.identifier == "readMailSegue" {
-            if let mail = sender as? Mail {
+            if let mail = sender as? PersistentMail {
                 let DestinationViewController: ReadViewController = segue.destination as! ReadViewController
                 DestinationViewController.mail = mail
             }
diff --git a/enzevalos_iphone/KeyRecord.swift b/enzevalos_iphone/KeyRecord.swift
index 6a58dccc..77f76036 100644
--- a/enzevalos_iphone/KeyRecord.swift
+++ b/enzevalos_iphone/KeyRecord.swift
@@ -11,6 +11,7 @@ import Contacts
 import UIKit
 
 open class KeyRecord: Record {
+
     /*
      A record contains a signing key (or none because of insecure communication), a contact (inlucding mail-addresses) and mails.
      For each key we have a different record for mailboxes. Mails and contact are affliate with the key.
@@ -42,7 +43,7 @@ open class KeyRecord: Record {
     }
 
 
-    open var mails: [Mail] = [Mail]()
+    open var mails: [PersistentMail] = [PersistentMail]()
 
 
     open var ezContact: EnzevalosContact
@@ -59,7 +60,7 @@ open class KeyRecord: Record {
     }
 
 
-    public init(mail: Mail) {
+    public init(mail: PersistentMail) {
         self.isSecure = mail.isSecure
         if(mail.isSecure && mail.from.hasKey) {
             self.key = mail.from.keyID
@@ -69,7 +70,7 @@ open class KeyRecord: Record {
         }
         mails.append(mail)
         mails.sort()
-        self.ezContact = mail.from.contact
+        self.ezContact = mail.from.contact!
         _ = addNewAddress(mail.from)
     }
 
@@ -116,7 +117,7 @@ open class KeyRecord: Record {
     open func showInfos() {
         print("-----------------")
         print("Name: \(ezContact.displayname) | State: \(hasKey) | #Mails: \(mails.count)")
-        print("First mail: \(mails.first?.uid) | Adr: \(mails.first?.from.address) | date: \(mails.first?.date.description) ")
+        print("First mail: \(mails.first?.uid) | Adr: \(mails.first?.from.mailAddress) | date: \(mails.first?.date.description) ")
         print("subj: \(mails.first?.subject?.capitalized)")
     }
 
@@ -130,7 +131,7 @@ open class KeyRecord: Record {
         return true
     }
 
-    open func addNewMail(_ mail: Mail) -> Bool {
+    open func addNewMail(_ mail: PersistentMail) -> Bool {
         // TODO: signed only mails are dropped ??
         if mail.isSecure && self.isSecure {
             if mail.from.keyID == self.key {
@@ -146,7 +147,7 @@ open class KeyRecord: Record {
             return false
         }
 
-        if ezContact.getAddress(mail.from.address) != nil {
+        if ezContact.getAddress(mail.from.mailAddress) != nil {
             for m in mails {
                 if m.uid == mail.uid {
                     return true
diff --git a/enzevalos_iphone/ListViewController.swift b/enzevalos_iphone/ListViewController.swift
index 28c7a4cc..2017fc75 100644
--- a/enzevalos_iphone/ListViewController.swift
+++ b/enzevalos_iphone/ListViewController.swift
@@ -46,7 +46,7 @@ fileprivate func >= <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
 
 class ListViewController: UITableViewController {
     let searchController = UISearchController(searchResultsController: nil)
-    var filteredMails = [Mail]()
+    var filteredMails = [PersistentMail]()
     var contact: KeyRecord? {
         didSet {
             self.title = contact!.name
@@ -160,7 +160,7 @@ class ListViewController: UITableViewController {
     }
 
     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
-        let mail: Mail?
+        let mail: PersistentMail?
 
         if searchController.isActive && searchController.searchBar.text != "" {
             mail = filteredMails[indexPath.row]
@@ -186,7 +186,7 @@ class ListViewController: UITableViewController {
     }
 
     override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
-        let mail: Mail?
+        let mail: PersistentMail?
 
         if searchController.isActive && searchController.searchBar.text != "" {
             mail = filteredMails[indexPath.row]
@@ -218,7 +218,7 @@ class ListViewController: UITableViewController {
 
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         if segue.identifier == "readMailSegue" {
-            if let mail = sender as? Mail {
+            if let mail = sender as? PersistentMail {
                 let DestinationViewController: ReadViewController = segue.destination as! ReadViewController
                 DestinationViewController.mail = mail
             }
diff --git a/enzevalos_iphone/MailAddress.swift b/enzevalos_iphone/MailAddress.swift
index 0f2f0a2c..a0362417 100644
--- a/enzevalos_iphone/MailAddress.swift
+++ b/enzevalos_iphone/MailAddress.swift
@@ -14,4 +14,7 @@ public protocol MailAddress {
     var label: CNLabeledValue<NSString>{get} //FIXME: ist der NSString hier wirklich richtig? (http://stackoverflow.com/questions/39648830/how-to-add-new-email-to-cnmutablecontact-in-swift-3)
     var prefEnc: Bool{get set}
     var hasKey: Bool{get}
+    
+    var keyID: String?{get}
+    var contact: EnzevalosContact?{get}
 }
diff --git a/enzevalos_iphone/MailHandlerDelegator.swift b/enzevalos_iphone/MailHandlerDelegator.swift
index a72c196b..2d920f9d 100644
--- a/enzevalos_iphone/MailHandlerDelegator.swift
+++ b/enzevalos_iphone/MailHandlerDelegator.swift
@@ -9,6 +9,7 @@
 import Foundation
 
 protocol MailHandlerDelegator {
-    func addNewMail(_ mail: Mail)
+    
+    func addNewMail(_ mail: PersistentMail)
     func getMailCompleted()
 }
diff --git a/enzevalos_iphone/Mail_Address+CoreDataClass.swift b/enzevalos_iphone/Mail_Address+CoreDataClass.swift
index cdc4d629..b60cb98e 100644
--- a/enzevalos_iphone/Mail_Address+CoreDataClass.swift
+++ b/enzevalos_iphone/Mail_Address+CoreDataClass.swift
@@ -19,7 +19,7 @@ open class Mail_Address: NSManagedObject, MailAddress {
     }
 
     open var label: CNLabeledValue<NSString> { //Wie in MailAddress; Ist der NSString hier richtig? (http://stackoverflow.com/questions/39648830/how-to-add-new-email-to-cnmutablecontact-in-swift-3)
-        if let cnc = self.contact.cnContact {
+        if let cnc = self.contact?.cnContact {
             for adr in cnc.emailAddresses {
                 if adr.value as String == address {
                     return adr
diff --git a/enzevalos_iphone/Mail_Address+CoreDataProperties.swift b/enzevalos_iphone/Mail_Address+CoreDataProperties.swift
index 0bd743e9..3740481d 100644
--- a/enzevalos_iphone/Mail_Address+CoreDataProperties.swift
+++ b/enzevalos_iphone/Mail_Address+CoreDataProperties.swift
@@ -19,7 +19,7 @@ extension Mail_Address {
 
     @NSManaged public var address: String
     @NSManaged public var prefer_encryption: Bool
-    @NSManaged public var contact: EnzevalosContact
+    @NSManaged public var contact: EnzevalosContact?
     
     public var encryptionType: EncryptionType{
         set {
@@ -51,10 +51,10 @@ extension Mail_Address {
 extension Mail_Address {
     
     @objc(addBccObject:)
-    @NSManaged public func addToBcc(_ value: Mail)
+    @NSManaged public func addToBcc(_ value: PersistentMail)
     
     @objc(removeBccObject:)
-    @NSManaged public func removeFromBcc(_ value: Mail)
+    @NSManaged public func removeFromBcc(_ value: PersistentMail)
     
     @objc(addBcc:)
     @NSManaged public func addToBcc(_ values: NSSet)
@@ -68,10 +68,10 @@ extension Mail_Address {
 extension Mail_Address {
     
     @objc(addCcObject:)
-    @NSManaged public func addToCc(_ value: Mail)
+    @NSManaged public func addToCc(_ value: PersistentMail)
     
     @objc(removeCcObject:)
-    @NSManaged public func removeFromCc(_ value: Mail)
+    @NSManaged public func removeFromCc(_ value: PersistentMail)
     
     @objc(addCc:)
     @NSManaged public func addToCc(_ values: NSSet)
@@ -85,10 +85,10 @@ extension Mail_Address {
 extension Mail_Address {
     
     @objc(addToObject:)
-    @NSManaged public func addToTo(_ value: Mail)
+    @NSManaged public func addToTo(_ value: PersistentMail)
     
     @objc(removeToObject:)
-    @NSManaged public func removeFromTo(_ value: Mail)
+    @NSManaged public func removeFromTo(_ value: PersistentMail)
     
     @objc(addTo:)
     @NSManaged public func addToTo(_ values: NSSet)
diff --git a/enzevalos_iphone/PGPEncryption.swift b/enzevalos_iphone/PGPEncryption.swift
index 53d96bf2..a5d8e0fb 100644
--- a/enzevalos_iphone/PGPEncryption.swift
+++ b/enzevalos_iphone/PGPEncryption.swift
@@ -8,7 +8,6 @@
 
 class PGPEncryption : Encryption {
     
-    
     internal let encryptionHandler: EncryptionHandler
     internal let keyManager: PGPKeyManagement
     //internal let keyIDs : []
@@ -28,7 +27,7 @@ class PGPEncryption : Encryption {
         return keyManager
     }
     
-    func isUsed(_ mail: Mail) -> Bool {
+    func isUsed(_ mail: PersistentMail) -> Bool {
         if let plain = mail.body {
             return isUsed(plain, key: nil)
         }
@@ -44,7 +43,7 @@ class PGPEncryption : Encryption {
     }
     
     //check whether this encryption is used in this mail for encryption. nil is returned, if there is no answer to be made at the moment.
-    func isUsedForEncryption(_ mail: Mail) -> Bool? {
+    func isUsedForEncryption(_ mail: PersistentMail) -> Bool? {
         if let plain = mail.body {
             return isUsedForEncryption(plain, key: nil)
         }
@@ -58,7 +57,7 @@ class PGPEncryption : Encryption {
     }
     
     //check whether this encryption is used in this mail for signing. nil is returned, if there is no answer to be made at the moment.
-    func isUsedForSignature(_ mail: Mail) -> Bool?{
+    func isUsedForSignature(_ mail: PersistentMail) -> Bool?{
         //TODO api-check
         //baut auf der Annahme auf, dass der signierte Teil nach dem entschlüsseln noch vorhanden ist.
         if let plain = mail.decryptedBody {
@@ -81,7 +80,7 @@ class PGPEncryption : Encryption {
     
     //TODO
     //decrypt the mails body. the decryted body will be saved in the mail object.
-    func decrypt(_ mail: Mail)-> String?{
+    func decrypt(_ mail: PersistentMail)-> String?{
         if self.isUsed(mail) {
             let bodyData = mail.body!.data(using: String.Encoding.utf8)!
             var data = try? keyManager.pgp.decryptData(bodyData, passphrase: nil)
@@ -122,7 +121,7 @@ class PGPEncryption : Encryption {
         return nil
     }
     
-    func decryptAndSignatureCheck(_ mail: Mail) {
+    func decryptAndSignatureCheck(_ mail: PersistentMail) {
         if self.isUsed(mail) {
             let bodyData = mail.body!.data(using: String.Encoding.utf8)!
             var data: Data?
@@ -152,7 +151,7 @@ class PGPEncryption : Encryption {
             }
                 if let unwrappedData = data {
                     mail.decryptedBody = String(data: unwrappedData, encoding: String.Encoding.utf8)
-                    if let allKeyIDs = self.keyManager.getKeyIDsForMailAddress(mail.from.address), let theirKeyID = temp.incompleteKeyID {
+                    if let allKeyIDs = self.keyManager.getKeyIDsForMailAddress(mail.from.mailAddress), let theirKeyID = temp.incompleteKeyID {
                         maybeUsedKeys = self.getLibaryKeyIDOverlap(theirKeyID, ourKeyIDs: allKeyIDs)
                     }
                     for maybeUsedKey in maybeUsedKeys {
@@ -207,7 +206,7 @@ class PGPEncryption : Encryption {
     
     //TODO
     //check whether the mail is correctly signed with this encryption. nil is returned, if there is no answer to be made at the moment.
-    func isCorrectlySigned(_ mail: Mail) -> Bool?{
+    func isCorrectlySigned(_ mail: PersistentMail) -> Bool?{
         return false
     }
     
@@ -219,7 +218,7 @@ class PGPEncryption : Encryption {
     
     //TODO
     //encrypt mail for contact
-    func encrypt(_ mail: Mail){
+    func encrypt(_ mail: PersistentMail){
         
     }
     
@@ -268,7 +267,7 @@ class PGPEncryption : Encryption {
     
     //TODO
     //sign mail
-    func sign(_ mail: Mail){
+    func sign(_ mail: PersistentMail){
         
     }
     
@@ -280,7 +279,7 @@ class PGPEncryption : Encryption {
     
     //TODO
     //sign and encrypt mail for contact
-    func signAndEncrypt(_ mail: Mail, forContact: KeyRecord){
+    func signAndEncrypt(_ mail: PersistentMail, forContact: KeyRecord){
         
     }
     
@@ -364,12 +363,12 @@ class PGPEncryption : Encryption {
     }
     
     //chooses first key in data. others will be ignored
-    func addKey(_ keyData: Data, discoveryMail: Mail?) -> String? {
+    func addKey(_ keyData: Data, discoveryMail: PersistentMail?) -> String? {
         var discoveryMailUID: UInt64? = nil
         var forMailAddresses: [String]? = nil
         if let mail = discoveryMail {
             discoveryMailUID = mail.uid
-            forMailAddresses = [mail.from.address]
+            forMailAddresses = [mail.from.mailAddress]
         }
         return self.addKey(keyData, forMailAddresses: forMailAddresses, discoveryMailUID: discoveryMailUID)
     }
diff --git a/enzevalos_iphone/PersistentMail +CoreDataProperties.swift b/enzevalos_iphone/PersistentMail +CoreDataProperties.swift
index 30ebf976..7d3bd43c 100644
--- a/enzevalos_iphone/PersistentMail +CoreDataProperties.swift	
+++ b/enzevalos_iphone/PersistentMail +CoreDataProperties.swift	
@@ -1,5 +1,5 @@
 //
-//  Mail+CoreDataProperties.swift
+//  PersistentMail+CoreDataProperties.swift
 //  enzevalos_iphone
 //
 //  Created by Oliver Wiese on 04/01/17.
@@ -13,7 +13,7 @@ import CoreData
 extension PersistentMail {
 
     @nonobjc open override class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult> {
-        return NSFetchRequest(entityName: "Mail");
+        return NSFetchRequest(entityName: "PersistentMail");
     }
 
     @NSManaged public var body: String?
@@ -77,9 +77,30 @@ extension PersistentMail {
             return text!
         }
     }
+    
+    
+    public var from: MailAddress{
+        set {
+            if newValue is Mail_Address{
+                let adr = newValue as! Mail_Address
+                self.willChangeValue(forKey: "from")
+                self.setValue(adr, forKey: "from" )
+                self.didChangeValue(forKey: "from")
+            }
+            
+        }
+        get {
+            self.willAccessValue(forKey: "from")
+            let text = (self.primitiveValue(forKey: "from") as? Mail_Address)
+            self.didAccessValue(forKey: "from")
+            return text as! MailAddress
+        }
+    
+    }
+    
     @NSManaged public var bcc: NSSet?
     @NSManaged public var cc: NSSet?
-    @NSManaged public var from: Mail_Address
+    //@NSManaged public var from: Mail_Address
     @NSManaged public var to: NSSet
 
 }
diff --git a/enzevalos_iphone/ReadViewController.swift b/enzevalos_iphone/ReadViewController.swift
index caf876a0..38416c1a 100644
--- a/enzevalos_iphone/ReadViewController.swift
+++ b/enzevalos_iphone/ReadViewController.swift
@@ -36,7 +36,7 @@ class ReadViewController: UITableViewController {
 
     var VENDelegate: ReadVENDelegate?
 
-    var mail: Mail? = nil
+    var mail: PersistentMail? = nil
 
     override func viewDidLoad() {
         super.viewDidLoad()
@@ -127,7 +127,7 @@ class ReadViewController: UITableViewController {
 
     override func numberOfSections(in tableView: UITableView) -> Int {
         if let mail = mail {
-            if mail.trouble && mail.showMessage || !mail.trouble && !mail.isSecure && mail.from.contact.hasKey || mail.isEncrypted && mail.unableToDecrypt {
+            if mail.trouble && mail.showMessage || !mail.trouble && !mail.isSecure && mail.from.contact!.hasKey || mail.isEncrypted && mail.unableToDecrypt {
                 return 3
             }
         }
@@ -252,10 +252,10 @@ class ReadViewController: UITableViewController {
                 }
             }
 
-            senderTokenField.delegate?.tokenField!(senderTokenField, didEnterText: m.from.contact.displayname!, mail: m.from.address)
+            senderTokenField.delegate?.tokenField!(senderTokenField, didEnterText: (m.from.contact?.displayname!)!, mail: m.from.mailAddress)
 
             for receiver in m.getReceivers() {
-                if let displayname = receiver.contact.displayname {
+                if let displayname = receiver.contact?.displayname {
                     toTokenField.delegate?.tokenField!(toTokenField, didEnterText: displayname, mail: receiver.address)
                 } else {
                     toTokenField.delegate?.tokenField!(toTokenField, didEnterText: receiver.address, mail: receiver.address)
@@ -263,7 +263,7 @@ class ReadViewController: UITableViewController {
             }
 
             for receiver in m.getCCs() {
-                if let displayname = receiver.contact.displayname {
+                if let displayname = receiver.contact?.displayname {
                     toTokenField.delegate?.tokenField!(toTokenField, didEnterText: displayname, mail: receiver.address)
                 } else {
                     toTokenField.delegate?.tokenField!(toTokenField, didEnterText: receiver.address, mail: receiver.address)
@@ -271,7 +271,7 @@ class ReadViewController: UITableViewController {
             }
 
             for receiver in m.getBCCs() {
-                if let displayname = receiver.contact.displayname {
+                if let displayname = receiver.contact?.displayname {
                     toTokenField.delegate?.tokenField!(toTokenField, didEnterText: displayname, mail: receiver.address)
                 } else {
                     toTokenField.delegate?.tokenField!(toTokenField, didEnterText: receiver.address, mail: receiver.address)
diff --git a/enzevalos_iphone/SendViewController.swift b/enzevalos_iphone/SendViewController.swift
index dae69842..7f7a45e2 100644
--- a/enzevalos_iphone/SendViewController.swift
+++ b/enzevalos_iphone/SendViewController.swift
@@ -49,7 +49,7 @@ class SendViewController: UIViewController {
     var collectionDataDelegate = CollectionDataDelegate(suggestionFunc: AddressHandler.frequentAddresses, insertCallback: { (name: String, address: String) -> Void in return })
     var recognizer: UIGestureRecognizer = UIGestureRecognizer.init()
 
-    var answerTo: Mail? = nil
+    var answerTo: PersistentMail? = nil
     var toField: String? = nil
 
     override func viewDidLoad() {
@@ -96,7 +96,7 @@ class SendViewController: UIViewController {
             let ezCon = DataHandler.handler.getContactByAddress(to)
             toText.delegate?.tokenField!(toText, didEnterText: ezCon.name, mail: to)
         } else if answerTo != nil {
-            toText.delegate?.tokenField!(toText, didEnterText: (answerTo?.from.address)!)
+            toText.delegate?.tokenField!(toText, didEnterText: (answerTo?.from.mailAddress)!)
             for r in (answerTo?.getReceivers())! {
                 if r.address != UserManager.loadUserValue(Attribute.userAddr) as! String {
                     ccText.delegate?.tokenField!(ccText, didEnterText: r.address)
@@ -104,7 +104,7 @@ class SendViewController: UIViewController {
             }
             subjectText.setText(NSLocalizedString("Re", comment: "prefix for subjects of answered mails") + ": " + (answerTo?.subject!)!)
             textView.text = NSLocalizedString("mail from", comment: "describing who send the mail") + " "
-            textView.text.append((answerTo?.from.address)!)
+            textView.text.append((answerTo?.from.mailAddress)!)
             textView.text.append(" " + NSLocalizedString("sent at", comment: "describing when the mail was send") + " " + (answerTo?.timeString)!)
             textView.text.append("\n" + NSLocalizedString("to", comment: "describing adressee") + ": ")
             textView.text.append(UserManager.loadUserValue(Attribute.userAddr) as! String)
-- 
GitLab