     internal class InsertData : ChangeData {
         var attributesAndValues: ValueContainerType?
 
-        required convenience init?(coder aDecoder: NSCoder) {
-            self.init()
+        required override init() {
+            super.init()
+        }
+
+        required init?(coder aDecoder: NSCoder) {
+            super.init(coder: aDecoder)
             
             attributesAndValues = aDecoder.decodeObject() as? ValueContainerType
         }
         override func encode(with aCoder: NSCoder) {
             aCoder.encode(attributesAndValues)
+            super.encode(with: aCoder)
         }
-
     }
 
     internal class UpdateData : ChangeData  {
         var attributesAndValues: ValueContainerType?
         var updatedAttributes:   [String]?
 
-        required convenience init?(coder aDecoder: NSCoder) {
-            self.init()
+        required override init() {
+            super.init()
+        }
+
+        required init?(coder aDecoder: NSCoder) {
+            super.init(coder: aDecoder)
             
             attributesAndValues = aDecoder.decodeObject() as? ValueContainerType
             updatedAttributes   = aDecoder.decodeObject() as? [String]

        override func encode(with aCoder: NSCoder) {
            aCoder.encode(attributesAndValues)
            aCoder.encode(updatedAttributes)
        }

    }

    internal class DeleteData : ChangeData   {
        required convenience init?(coder aDecoder: NSCoder) {
            self.init()
        }
        override func encode(with aCoder: NSCoder) {}
    }
}

    typealias ValueContainerType = [AnyHashable: Any]

    internal class ChangeData : NSObject, NSCoding  {
        required override init() {}
        required init?(coder aDecoder: NSCoder) {}
        func encode(with aCoder: NSCoder) {}
    }
    /**
        NOTE: the attributes in this class are all public because
