         func getServiceUuids() -> [CBUUID]? {
             return services.isEmpty ? nil : services.map() { $0.id.uuid }
         }
+
+        public var description : String {
+            var description = "<peripheral \(name) - autoConnect \(autoConnect), autodiscover \(autoDiscover)>"
+            services.forEach { description += "\n\($0)" }
+            return description
+        }
     }
 }
 

        func getCharacteristicUuids() -> [CBUUID]? {
            return characteristics.isEmpty ? nil : characteristics.map() { $0.id.uuid }
        }
    }

    // TODO: Make the subscription CustomStringConvertible
    public struct PeripheralSubscription : Encodable {
        public let name: String
        public let services: [ServiceSubscription] // If empty then all of the peripheral's services, characteristics and descriptors will be discovered
        public let autoConnect: Bool

        public func encode() -> Encodable.Properties {
            return ["name": name ?? "", "uuid": uuid.uuidString]
        }

        public var description : String {
            return "<\(name ?? "<no name>"), \(uuid.uuidString)>"
        }
    }

    public struct CharacteristicSubscription : Encodable, CustomStringConvertible {
        public let id: Identifier

        public init(id: Identifier) {
