         var request = request
         addHeaders(&request)
 
-        let stream: Stream = try connection ?? TCPSSLConnection(to: host, on: port, verifyBundle: verifyBundle, certificate: certificate, privateKey: privateKey, certificateChain: certificateChain)
-
-        try serializer.serialize(request, to: stream)
+        let connection = try self.connection ?? TCPConnection(host: host, port: port)
+        try connection.open()
+
+        try serializer.serialize(request, to: connection)
 
         while true {
-            let data = try stream.receive(upTo: 1024)
+            let data = try connection.receive(upTo: 1024)
             if let response = try parser.parse(data)  {
 
                 if let upgrade = request.upgrade {
-                    try upgrade(response, stream)
+                    try upgrade(response, connection)
                 }
 
                 if !keepAlive {
-                    connection = nil
+                    self.connection = nil
                 }
 
                 return response

}

extension Client {
    public func sendMethod(method: Method, uri: String, headers: Headers = [:], body: Data = [], middleware: Middleware...) throws -> Response {
        return try sendMethod(method, uri: uri, headers: headers, body: body, middleware: middleware)
    }

    public func sendMethod(method: Method, uri: String, headers: Headers = [:], body: DataConvertible, middleware: Middleware...) throws -> Response {
        return try sendMethod(method, uri: uri, headers: headers, body: body, middleware: middleware)
    }
}

extension Client {
    public func get(uri: String, headers: Headers = [:], body: Data = [], middleware: Middleware...) throws -> Response {
        return try sendMethod(.get, uri: uri, headers: headers, body: body, middleware: middleware)
    }

    public func get(uri: String, headers: Headers = [:], body: DataConvertible, middleware: Middleware...) throws -> Response {
        return try sendMethod(.get, uri: uri, headers: headers, body: body, middleware: middleware)
    }
}

extension Client {
    public func post(uri: String, headers: Headers = [:], body: Data = [], middleware: Middleware...) throws -> Response {
        return try sendMethod(.post, uri: uri, headers: headers, body: body, middleware: middleware)
    }

    public func post(uri: String, headers: Headers = [:], body: DataConvertible, middleware: Middleware...) throws -> Response {
        return try sendMethod(.post, uri: uri, headers: headers, body: body, middleware: middleware)
    }
}

extension Client {
    public func put(uri: String, headers: Headers = [:], body: Data = [], middleware: Middleware...) throws -> Response {
        return try sendMethod(.put, uri: uri, headers: headers, body: body, middleware: middleware)
    }

    public func put(uri: String, headers: Headers = [:], body: DataConvertible, middleware: Middleware...) throws -> Response {
        return try sendMethod(.put, uri: uri, headers: headers, body: body, middleware: middleware)
    }
}

extension Client {
    public func patch(uri: String, headers: Headers = [:], body: Data = [], middleware: Middleware...) throws -> Response {
        return try sendMethod(.patch, uri: uri, headers: headers, body: body, middleware: middleware)
    }

    public func patch(uri: String, headers: Headers = [:], body: DataConvertible, middleware: Middleware...) throws -> Response {
        return try sendMethod(.patch, uri: uri, headers: headers, body: body, middleware: middleware)
    }
}

extension Client {
    public func delete(uri: String, headers: Headers = [:], body: Data = [], middleware: Middleware...) throws -> Response {
        return try sendMethod(.delete, uri: uri, headers: headers, body: body, middleware: middleware)
    }

    public func delete(uri: String, headers: Headers = [:], body: DataConvertible, middleware: Middleware...) throws -> Response {
        return try sendMethod(.delete, uri: uri, headers: headers, body: body, middleware: middleware)
    }
}

extension Client {
    private func sendMethod(method: Method, uri: String, headers: Headers = [:], body: Data = [], middleware: [Middleware]) throws -> Response {
        let request = try Request(method: method, uri: uri, headers: headers, body: body)
        return try send(request, middleware: middleware)
    }

    private func sendMethod(method: Method, uri: String, headers: Headers = [:], body: DataConvertible, middleware: [Middleware]) throws -> Response {
        let request = try Request(method: method, uri: uri, headers: headers, body: body)
        return try send(request, middleware: middleware)
    }
}


    public var connection: C7.Connection?

    public init(uri: URI, verifyBundle: String? = nil, certificate: String? = nil, privateKey: String? = nil, certificateChain: String? = nil, serializer: S4.RequestSerializer = RequestSerializer(), parser: S4.ResponseParser = ResponseParser(), keepAlive: Bool = false) throws {
        guard let host = uri.host else {
            throw ClientError.hostRequired
        }

        guard let port = uri.port else {
            throw ClientError.portRequired
        }
        self.host = host
        self.port = port
