         return result
     }
 
-
-    public init?<S : Collection>(data: S) where S.Iterator.Element == Byte, S.SubSequence.Iterator.Element == S.Iterator.Element {
-        /// not enough data
+    public init(timetag: OSCTimeTag, content: [OSCMessage]) {
+        self.timetag = timetag
+        self.content = content
+    }
+
+    public init?<S : Collection>(data: S) where S.Iterator.Element == Byte, S.SubSequence.Iterator.Element == S.Iterator.Element {
+        /// Chechk the header
         guard
             data.count >= 16
         else {


public struct OSCBundle : OSCConvertible {
    public let timetag : OSCTimeTag
    public let messages : [OSCMessage]


    public var oscValue : [Byte] {
        var result = [Byte]()
        result += "#bundle".oscValue
        result += timetag.oscValue

        messages.forEach { msg in
            let v = msg.data
            result += Int32(v.count).oscValue
            result += v

        }
        let bytes = [Byte](data)

        /// Bundle starts with string
        guard
            let marker = String(data: bytes.prefix(8)), 
            marker == "#bundle"
        else {
            return nil
        }

        /// Extract time tag
        guard
            let ts = OSCTimeTag(data: bytes[bytes.startIndex+8..<bytes.startIndex+16])
        else {
