     else {
       // STREAMING
       if (!nowStreaming) {
-        prepareChannel(address:address, host:host)
-        guard let channel = channel else {
+        prepareService(address:address, host:host)
+        guard let service = service else {
           return
         }
-        call = channel.makeCall("/echo.Echo/Update")
-        guard let call = call else {
-          return
-        }
-        try call.start(metadata:requestMetadata)
+        updateCall = service.update()
+        try updateCall!.start(metadata:requestMetadata)
         try self.receiveMessage()
         nowStreaming = true
       }

  func sendMessage() {
    let requestMessage = self.fileDescriptorSet.makeMessage("EchoRequest")!
    requestMessage.addField("text", value:self.messageField.stringValue)
    let messageData = requestMessage.data()
    if let call = call {
      _ = call.sendMessage(data:messageData)
    }
  }

  func receiveMessage() throws -> Void {
    guard let call = call else {
      return
    }
    try call.receiveMessage() {(data) in
      guard let responseMessage = self.fileDescriptorSet.readMessage("EchoResponse", data:data)
        else {
          return // this stops receiving
      }
      try responseMessage.forOneField("text") {(field) in
        DispatchQueue.main.async {
          self.outputField.stringValue = field.string()
        }
        try self.receiveMessage()
      }
    }
  }

  func sendClose() throws {
    guard let call = call else {
      return
    }
    try call.close() {
      self.nowStreaming = false
    }
  }
}

  @IBOutlet weak var TLSButton: NSButton!

  private var fileDescriptorSet : FileDescriptorSet

  private var service : EchoService?

  private var channel: Channel?
  private var updateCall: EchoUpdateCall?

  private var nowStreaming = false

  required init?(coder:NSCoder) {
