diff --git a/garnet/bin/terminal/BUILD.gn b/garnet/bin/terminal/BUILD.gn
index 68d76ec7d87f7efb9ca9f06cb617f6b74a4d8637..1c5d4bfea51af4c69d2f64d1f330f14f8082b285 100644
--- a/garnet/bin/terminal/BUILD.gn
+++ b/garnet/bin/terminal/BUILD.gn
@@ -18,8 +18,8 @@ rustc_binary("bin") {
     "//garnet/bin/terminal/third_party/term-model",
     "//garnet/public/lib/fidl/rust/fidl",
     "//garnet/public/rust/carnelian",
-    "//garnet/public/rust/fuchsia-app",
     "//garnet/public/rust/fuchsia-async",
+    "//garnet/public/rust/fuchsia-component",
     "//garnet/public/rust/fuchsia-scenic",
     "//garnet/public/rust/fuchsia-zircon",
     "//garnet/public/rust/shared-buffer",
diff --git a/garnet/bin/terminal/src/app.rs b/garnet/bin/terminal/src/app.rs
index 88323030c2c028139e0de2a7fd5e2dd9258de6c8..983e51e1c20afb9e850c6adb37bb598067a45aed 100644
--- a/garnet/bin/terminal/src/app.rs
+++ b/garnet/bin/terminal/src/app.rs
@@ -1,12 +1,12 @@
 use crate::view_controller::{FontFacePtr, ViewController, ViewControllerPtr};
 use carnelian::FontFace;
 use failure::Error;
-use fidl::endpoints::{create_endpoints, create_proxy, RequestStream};
+use fidl::endpoints::{create_endpoints, create_proxy};
 use fidl_fuchsia_ui_app::{ViewProviderRequest, ViewProviderRequestStream};
 use fidl_fuchsia_ui_scenic::{ScenicMarker, ScenicProxy};
 use fidl_fuchsia_ui_views::ViewToken;
-use fuchsia_app::client::connect_to_service;
 use fuchsia_async as fasync;
+use fuchsia_component::client::connect_to_service;
 use fuchsia_scenic::Session;
 use futures::{TryFutureExt, TryStreamExt};
 use parking_lot::Mutex;
@@ -33,10 +33,10 @@ impl App {
         })))
     }
 
-    pub fn spawn_view_provider_server(app: &AppPtr, chan: fasync::Channel) {
+    pub fn spawn_view_provider_server(app: &AppPtr, stream: ViewProviderRequestStream) {
         let app = app.clone();
         fasync::spawn(
-            ViewProviderRequestStream::from_channel(chan)
+            stream
                 .try_for_each(move |req| {
                     let ViewProviderRequest::CreateView { token, .. } = req;
                     let view_token = ViewToken { value: token };
diff --git a/garnet/bin/terminal/src/main.rs b/garnet/bin/terminal/src/main.rs
index 9eb1c9f1512a0da0a8ee1d1b7cd4af555980aefe..cc8e527286c23c2969e672f20feb6df6cd7486b0 100644
--- a/garnet/bin/terminal/src/main.rs
+++ b/garnet/bin/terminal/src/main.rs
@@ -10,9 +10,8 @@ mod view_controller;
 
 use app::App;
 use failure::{Error, ResultExt};
-use fidl::endpoints::ServiceMarker;
-use fidl_fuchsia_ui_app::ViewProviderMarker;
 use fuchsia_async as fasync;
+use futures::StreamExt;
 use std::env;
 
 fn main() -> Result<(), Error> {
@@ -21,13 +20,10 @@ fn main() -> Result<(), Error> {
     let mut executor = fasync::Executor::new().context("Error creating executor")?;
     let app = App::new()?;
 
-    let fut = fuchsia_app::server::ServicesServer::new()
-        .add_service((ViewProviderMarker::NAME, move |chan| {
-            App::spawn_view_provider_server(&app, chan)
-        }))
-        .start()
-        .context("Error starting view provider server")?;
+    let mut fs = fuchsia_component::server::ServiceFs::new_local();
+    fs.dir("public").add_fidl_service(|stream| App::spawn_view_provider_server(&app, stream));
+    fs.take_and_serve_directory_handle()?;
 
-    executor.run_singlethreaded(fut)?;
+    let () = executor.run_singlethreaded(fs.collect());
     Ok(())
 }
diff --git a/garnet/bin/terminal/src/view_controller.rs b/garnet/bin/terminal/src/view_controller.rs
index 4384f3a3d3d897a0c37e117528150058edc02248..4a927041930f87af156ec165f05cb3bbb2a6769a 100644
--- a/garnet/bin/terminal/src/view_controller.rs
+++ b/garnet/bin/terminal/src/view_controller.rs
@@ -10,8 +10,8 @@ use fidl_fuchsia_ui_input::{
 };
 use fidl_fuchsia_ui_scenic::{self as scenic, SessionListenerMarker, SessionListenerRequest};
 use fidl_fuchsia_ui_views::ViewToken;
-use fuchsia_app::client::connect_to_service;
 use fuchsia_async as fasync;
+use fuchsia_component::client::connect_to_service;
 use fuchsia_scenic::{EntityNode, HostImageCycler, SessionPtr, View};
 use futures::{FutureExt, TryFutureExt, TryStreamExt};
 use parking_lot::Mutex;