       // NONSTREAMING
       if let requestMessage = self.fileDescriptorSet.makeMessage("EchoRequest") {
         requestMessage.addField("text", value:self.messageField.stringValue)
-        let requestMessageData = requestMessage.data()
-        prepareChannel(address:address, host:host)
-        guard let channel = channel else {
-          return
-        }
-        call = channel.makeCall("/echo.Echo/Get")
-        guard let call = call else {
-          return
-        }
-        try call.perform(message: requestMessageData,
-                         metadata: requestMetadata)
-        {(callResult) in
-          print("Client received status \(callResult.statusCode): \(callResult.statusMessage!)")
-          if let messageData = callResult.resultData,
-            let responseMessage = self.fileDescriptorSet.readMessage("EchoResponse",
-                                                                     data:messageData) {
-            try responseMessage.forOneField("text") {(field) in
+        prepareService(address:address, host:host)
+        if let service = service {
+          let call = service.get()
+          call.perform(request:requestMessage) {(callResult, response) in
+            if let response = response {
+              try! response.forOneField("text") {(field) in
+                DispatchQueue.main.async {
+                  self.outputField.stringValue = field.string()
+                }
+              }
+            } else {
               DispatchQueue.main.async {
-                self.outputField.stringValue = field.string()
+                self.outputField.stringValue = "No message received. gRPC Status \(callResult.statusCode): \(callResult.statusMessage)"
               }
-            }
-          } else {
-            DispatchQueue.main.async {
-              self.outputField.stringValue = "No message received. gRPC Status \(callResult.statusCode): \(callResult.statusMessage)"
             }
           }
         }

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

  @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) {
