diff --git a/wear/tiles/tiles-proto/src/main/proto/requests.proto b/wear/tiles/tiles-proto/src/main/proto/requests.proto
index cf54aab..2b6d7bf 100644
--- a/wear/tiles/tiles-proto/src/main/proto/requests.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/requests.proto
@@ -9,7 +9,7 @@
 option java_package = "androidx.wear.tiles.proto";
 option java_outer_classname = "RequestProto";
 
-// Parameters passed to a Tile provider when the renderer is requesting a new
+// Parameters passed to a Tile Service when the renderer is requesting a new
 // version of the tile.
 message TileRequest {
   // Parameters describing the device requesting the tile update.
@@ -19,7 +19,7 @@
   State state = 2;
 }
 
-// Parameters passed to a Tile provider when the renderer is requesting a
+// Parameters passed to a Tile Service when the renderer is requesting a
 // specific resource version.
 message ResourcesRequest {
   // The version of the resources being fetched. This is the same as the
diff --git a/wear/tiles/tiles-proto/src/main/proto/tile.proto b/wear/tiles/tiles-proto/src/main/proto/tile.proto
index 542fff8..3abfaf8 100644
--- a/wear/tiles/tiles-proto/src/main/proto/tile.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/tile.proto
@@ -28,7 +28,7 @@
   // can be considered to be "fresh". The platform will attempt to refresh
   // your tile at some point in the future after this interval has lapsed. A
   // value of 0 here signifies that auto-refreshes should not be used (i.e. you
-  // will manually request updates via TileProviderService#getRequester).
+  // will manually request updates via TileService#getRequester).
   //
   // This mechanism should not be used to update your tile more frequently than
   // once a minute, and the system may throttle your updates if you request
diff --git a/wear/tiles/tiles-renderer/api/current.txt b/wear/tiles/tiles-renderer/api/current.txt
index cb3df5a..a162ceb 100644
--- a/wear/tiles/tiles-renderer/api/current.txt
+++ b/wear/tiles/tiles-renderer/api/current.txt
@@ -1,7 +1,7 @@
 // Signature format: 4.0
 package androidx.wear.tiles.client {
 
-  public interface TileProviderClient {
+  public interface TileClient {
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> requestApiVersion();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources!> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile!> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest);
@@ -15,9 +15,9 @@
 
 package androidx.wear.tiles.connection {
 
-  public final class DefaultTileProviderClient implements androidx.wear.tiles.client.TileProviderClient {
-    ctor public DefaultTileProviderClient(android.content.Context context, android.content.ComponentName componentName, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
-    ctor public DefaultTileProviderClient(android.content.Context context, android.content.ComponentName componentName, java.util.concurrent.Executor executor);
+  public final class DefaultTileClient implements androidx.wear.tiles.client.TileClient {
+    ctor public DefaultTileClient(android.content.Context context, android.content.ComponentName componentName, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
+    ctor public DefaultTileClient(android.content.Context context, android.content.ComponentName componentName, java.util.concurrent.Executor executor);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer> requestApiVersion();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest requestParams);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest requestParams);
diff --git a/wear/tiles/tiles-renderer/api/public_plus_experimental_current.txt b/wear/tiles/tiles-renderer/api/public_plus_experimental_current.txt
index cb3df5a..a162ceb 100644
--- a/wear/tiles/tiles-renderer/api/public_plus_experimental_current.txt
+++ b/wear/tiles/tiles-renderer/api/public_plus_experimental_current.txt
@@ -1,7 +1,7 @@
 // Signature format: 4.0
 package androidx.wear.tiles.client {
 
-  public interface TileProviderClient {
+  public interface TileClient {
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> requestApiVersion();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources!> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile!> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest);
@@ -15,9 +15,9 @@
 
 package androidx.wear.tiles.connection {
 
-  public final class DefaultTileProviderClient implements androidx.wear.tiles.client.TileProviderClient {
-    ctor public DefaultTileProviderClient(android.content.Context context, android.content.ComponentName componentName, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
-    ctor public DefaultTileProviderClient(android.content.Context context, android.content.ComponentName componentName, java.util.concurrent.Executor executor);
+  public final class DefaultTileClient implements androidx.wear.tiles.client.TileClient {
+    ctor public DefaultTileClient(android.content.Context context, android.content.ComponentName componentName, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
+    ctor public DefaultTileClient(android.content.Context context, android.content.ComponentName componentName, java.util.concurrent.Executor executor);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer> requestApiVersion();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest requestParams);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest requestParams);
diff --git a/wear/tiles/tiles-renderer/api/restricted_current.txt b/wear/tiles/tiles-renderer/api/restricted_current.txt
index cb3df5a..a162ceb 100644
--- a/wear/tiles/tiles-renderer/api/restricted_current.txt
+++ b/wear/tiles/tiles-renderer/api/restricted_current.txt
@@ -1,7 +1,7 @@
 // Signature format: 4.0
 package androidx.wear.tiles.client {
 
-  public interface TileProviderClient {
+  public interface TileClient {
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> requestApiVersion();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources!> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile!> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest);
@@ -15,9 +15,9 @@
 
 package androidx.wear.tiles.connection {
 
-  public final class DefaultTileProviderClient implements androidx.wear.tiles.client.TileProviderClient {
-    ctor public DefaultTileProviderClient(android.content.Context context, android.content.ComponentName componentName, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
-    ctor public DefaultTileProviderClient(android.content.Context context, android.content.ComponentName componentName, java.util.concurrent.Executor executor);
+  public final class DefaultTileClient implements androidx.wear.tiles.client.TileClient {
+    ctor public DefaultTileClient(android.content.Context context, android.content.ComponentName componentName, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
+    ctor public DefaultTileClient(android.content.Context context, android.content.ComponentName componentName, java.util.concurrent.Executor executor);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer> requestApiVersion();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest requestParams);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest requestParams);
diff --git a/wear/tiles/tiles-renderer/src/androidTest/proto/requests.proto b/wear/tiles/tiles-renderer/src/androidTest/proto/requests.proto
index 2075e7c..489c833 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/proto/requests.proto
+++ b/wear/tiles/tiles-renderer/src/androidTest/proto/requests.proto
@@ -9,7 +9,7 @@
 option java_package = "androidx.wear.tiles.testing.proto";
 option java_outer_classname = "RequestProto";
 
-// Parameters passed to a Tile provider when the renderer is requesting a new
+// Parameters passed to a Tile Service when the renderer is requesting a new
 // version of the tile.
 message TileRequest {
   // Parameters describing the device requesting the tile update.
@@ -19,7 +19,7 @@
   State state = 2;
 }
 
-// Parameters passed to a Tile provider when the renderer is requesting a
+// Parameters passed to a Tile Service when the renderer is requesting a
 // specific resource version.
 message ResourcesRequest {
   // The version of the resources being fetched
diff --git a/wear/tiles/tiles-renderer/src/androidTest/proto/tile.proto b/wear/tiles/tiles-renderer/src/androidTest/proto/tile.proto
index 8831717..78215c0 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/proto/tile.proto
+++ b/wear/tiles/tiles-renderer/src/androidTest/proto/tile.proto
@@ -25,6 +25,6 @@
   // can be considered to be "fresh". The platform will attempt to refresh
   // your tile at some point in the future after this interval has lapsed. A
   // value of 0 here signifies that auto-refreshes should not be used (i.e. you
-  // will manually request updates via TileProviderService#getRequester).
+  // will manually request updates via TileService#getRequester).
   uint64 freshness_interval_millis = 4;
 }
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileProviderClient.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileClient.java
similarity index 70%
rename from wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileProviderClient.java
rename to wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileClient.java
index 48ad986..da4a8ec4 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileProviderClient.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileClient.java
@@ -24,36 +24,36 @@
 import com.google.common.util.concurrent.ListenableFuture;
 
 /**
- * Client to connect and interact with a TileProviderService.
+ * Client to connect and interact with a TileService.
  */
-public interface TileProviderClient {
-    /** Gets the API version supported by the connected TileProviderService. */
+public interface TileClient {
+    /** Gets the API version supported by the connected TileService. */
     @NonNull
     ListenableFuture<Integer> requestApiVersion();
 
-    /** Request a tile payload from the connected TileProviderService. */
+    /** Request a tile payload from the connected TileService. */
     @NonNull
     ListenableFuture<TileBuilders.Tile> requestTile(
             @NonNull RequestBuilders.TileRequest requestParams);
 
-    /** Request a resource bundle from the connected TileProviderService. */
+    /** Request a resource bundle from the connected TileService. */
     @NonNull
     ListenableFuture<ResourceBuilders.Resources> requestResources(
             @NonNull RequestBuilders.ResourcesRequest requestParams);
 
-    /** Send a Tile Added notification to the connected TileProviderService. */
+    /** Send a Tile Added notification to the connected TileService. */
     @NonNull
     ListenableFuture<Void> sendOnTileAddedEvent();
 
-    /** Send a Tile Removed notification to the connected TileProviderService. */
+    /** Send a Tile Removed notification to the connected TileService. */
     @NonNull
     ListenableFuture<Void> sendOnTileRemovedEvent();
 
-    /** Send a Tile Enter notification to the connected TileProviderService. */
+    /** Send a Tile Enter notification to the connected TileService. */
     @NonNull
     ListenableFuture<Void> sendOnTileEnterEvent();
 
-    /** Send a Tile Leave notification to the connected TileProviderService. */
+    /** Send a Tile Leave notification to the connected TileService. */
     @NonNull
     ListenableFuture<Void> sendOnTileLeaveEvent();
 }
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/connection/DefaultTileProviderClient.kt b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/connection/DefaultTileClient.kt
similarity index 89%
rename from wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/connection/DefaultTileProviderClient.kt
rename to wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/connection/DefaultTileClient.kt
index 4290e82..dd509d06 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/connection/DefaultTileProviderClient.kt
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/connection/DefaultTileClient.kt
@@ -34,9 +34,9 @@
 import androidx.wear.tiles.TileEnterEventData
 import androidx.wear.tiles.TileLeaveEventData
 import androidx.wear.tiles.TileProvider
-import androidx.wear.tiles.TileProviderService
+import androidx.wear.tiles.TileService
 import androidx.wear.tiles.TileRemoveEventData
-import androidx.wear.tiles.client.TileProviderClient
+import androidx.wear.tiles.client.TileClient
 import androidx.wear.tiles.proto.ResourceProto
 import androidx.wear.tiles.proto.TileProto
 import androidx.wear.tiles.protobuf.InvalidProtocolBufferException
@@ -54,18 +54,18 @@
 import kotlin.coroutines.resumeWithException
 
 /**
- * Implementation of [TileProviderClient] which can connect to a `TileProviderService` in either the
- * local process, or in a remote app.
+ * Implementation of [TileClient] which can connect to a `TileService` in either the local
+ * process, or in a remote app.
  *
  * This implementation will only stay connected for as long as required. Each call will cause this
- * client to connect to the `TileProviderService`, and call the specified remote method. It will
- * then disconnect again after one second of inactivity (so calls in quick succession will share
- * the same binder).
+ * client to connect to the `TileService`, and call the specified remote method. It will then
+ * disconnect again after one second of inactivity (so calls in quick succession will share the
+ * same binder).
  *
- * Note that there is a timeout of 10s when connecting to the `TileProviderService`, and a
- * timeout of 30s for [requestTile] and [requestResources] to return a payload.
+ * Note that there is a timeout of 10s when connecting to the `TileService`, and a timeout of 30s
+ * for [requestTile] and [requestResources] to return a payload.
  */
-public class DefaultTileProviderClient : TileProviderClient {
+public class DefaultTileClient : TileClient {
     internal companion object {
         @VisibleForTesting
         internal const val TIMEOUT_MILLIS = 30000L // 30s
@@ -95,12 +95,12 @@
     private val connectionBinder: TilesConnectionBinder
 
     /**
-     * Build an instance of [DefaultTileProviderClient] for use with a coroutine dispatcher.
+     * Build an instance of [DefaultTileClient] for use with a coroutine dispatcher.
      *
-     * @param context The application context to use when binding to the [TileProviderService].
-     * @param componentName The [ComponentName] of the [TileProviderService] to bind to.
+     * @param context The application context to use when binding to the [TileService].
+     * @param componentName The [ComponentName] of the [TileService] to bind to.
      * @param coroutineScope A [CoroutineScope] to use when dispatching calls to the
-     *   [TileProviderService]. Cancelling the passed [CoroutineScope] will also cancel any pending
+     *   [TileService]. Cancelling the passed [CoroutineScope] will also cancel any pending
      *   work in this class.
      * @param coroutineDispatcher A [CoroutineDispatcher] to use when dispatching work from this
      *   class.
@@ -118,11 +118,11 @@
     }
 
     /**
-     * Build an instance of [DefaultTileProviderClient] for use with a given [Executor].
+     * Build an instance of [DefaultTileClient] for use with a given [Executor].
      *
-     * @param context The application context to use when binding to the [TileProviderService].
-     * @param componentName The [ComponentName] of the [TileProviderService] to bind to.
-     * @param executor An [Executor] to use when dispatching calls to the [TileProviderService].
+     * @param context The application context to use when binding to the [TileService].
+     * @param componentName The [ComponentName] of the [TileService] to bind to.
+     * @param executor An [Executor] to use when dispatching calls to the [TileService].
      */
     public constructor(context: Context, componentName: ComponentName, executor: Executor) {
         this.coroutineDispatcher = executor.asCoroutineDispatcher()
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/connection/TilesConnectionBinder.kt b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/connection/TilesConnectionBinder.kt
index 0ab04c2..cb797f6 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/connection/TilesConnectionBinder.kt
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/connection/TilesConnectionBinder.kt
@@ -22,7 +22,7 @@
 import android.content.ServiceConnection
 import android.os.IBinder
 import androidx.wear.tiles.TileProvider
-import androidx.wear.tiles.TileProviderService
+import androidx.wear.tiles.TileService
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Deferred
@@ -135,7 +135,7 @@
     private suspend fun connectToService(): TileProvider = coroutineScope {
         val bindJob = async(backgroundCoroutineDispatcher) {
             suspendCancellableCoroutine<TileProvider> { continuation ->
-                val bindIntent = Intent(TileProviderService.ACTION_BIND_TILE_PROVIDER)
+                val bindIntent = Intent(TileService.ACTION_BIND_TILE_PROVIDER)
                 bindIntent.component = componentName
 
                 val myConnection = object : ServiceConnection {
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileUiClient.kt b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileUiClient.kt
index 5aa71ab..fe72a24 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileUiClient.kt
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileUiClient.kt
@@ -37,7 +37,7 @@
 import androidx.wear.tiles.StateBuilders
 import androidx.wear.tiles.TimelineBuilders
 import androidx.wear.tiles.checkers.TimelineChecker
-import androidx.wear.tiles.connection.DefaultTileProviderClient
+import androidx.wear.tiles.connection.DefaultTileClient
 import androidx.wear.tiles.renderer.TileRenderer
 import androidx.wear.tiles.timeline.TilesTimelineManager
 import kotlinx.coroutines.CoroutineScope
@@ -51,7 +51,7 @@
 import java.util.concurrent.Executors
 
 /**
- * UI client for a single tile. This handles binding to a Tile Provider, and inflating the given
+ * UI client for a single tile. This handles binding to a Tile Service, and inflating the given
  * tile contents into the provided parentView. This also handles requested updates, re-fetching the
  * tile on-demand.
  *
@@ -73,7 +73,7 @@
     private val coroutineScope = CoroutineScope(Dispatchers.Main + job)
     private val timelineChecker = TimelineChecker()
 
-    private val tilesConnection = DefaultTileProviderClient(
+    private val tilesConnection = DefaultTileClient(
         context = context,
         componentName = component,
         coroutineScope = coroutineScope,
@@ -97,7 +97,7 @@
 
     /**
      * Initialize this {@link TileManager}. This will cause the {@link TileManager} to connect to
-     * the tile provider and request the first tile. It will also trigger any requested updates.
+     * the tile service and request the first tile. It will also trigger any requested updates.
      */
     @MainThread
     public fun connect() {
@@ -117,7 +117,7 @@
 
     /**
      * Shut down this {@link TileManager}. This will cancel any scheduled updates, and close the
-     * connection with the tile provider.
+     * connection with the tile service.
      */
     @MainThread
     override fun close() {
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultAndroidImageResourceByResIdResolver.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultAndroidImageResourceByResIdResolver.java
index c3ab842..06345ca 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultAndroidImageResourceByResIdResolver.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultAndroidImageResourceByResIdResolver.java
@@ -34,7 +34,7 @@
     /**
      * Constructor.
      *
-     * @param androidResources An Android Resources instance for the tile provider's package. This
+     * @param androidResources An Android Resources instance for the tile service's package. This
      *     is normally obtained from {@code PackageManager#getResourcesForApplication}.
      */
     public DefaultAndroidImageResourceByResIdResolver(@NonNull Resources androidResources) {
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceResolvers.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceResolvers.java
index 5c7bd19..f98f776 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceResolvers.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceResolvers.java
@@ -224,7 +224,7 @@
         return errorFuture;
     }
 
-    /** Builder for ResourceProviders */
+    /** Builder for ResourceResolvers */
     public static final class Builder {
         @NonNull private final ResourceProto.Resources mProtoResources;
         @Nullable private AndroidImageResourceByResIdResolver mAndroidImageResourceByResIdResolver;
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/StandardResourceResolvers.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/StandardResourceResolvers.java
index cfcc08f..6308bbf 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/StandardResourceResolvers.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/StandardResourceResolvers.java
@@ -20,6 +20,7 @@
 import android.content.res.Resources;
 
 import androidx.annotation.NonNull;
+import androidx.wear.tiles.TileService;
 import androidx.wear.tiles.proto.ResourceProto;
 
 /** Utility class to get {@link ResourceResolvers} populated with standard options. */
@@ -50,7 +51,7 @@
 
     /**
      * Get a builder pre-populated with resolvers for the resources of a {@link
-     * androidx.wear.tiles.TileProviderService}, hosted within another app on the device.
+     * TileService}, hosted within another app on the device.
      *
      * <p>Use {@code setFooAccessor} calls to change the pre-populated ones or add others.
      *
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/TileRendererInternal.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/TileRendererInternal.java
index 647c94a..9770536 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/TileRendererInternal.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/TileRendererInternal.java
@@ -68,7 +68,7 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.StyleRes;
 import androidx.core.content.ContextCompat;
-import androidx.wear.tiles.TileProviderService;
+import androidx.wear.tiles.TileService;
 import androidx.wear.tiles.proto.ActionProto.Action;
 import androidx.wear.tiles.proto.ActionProto.AndroidActivity;
 import androidx.wear.tiles.proto.ActionProto.AndroidExtra;
@@ -813,7 +813,7 @@
             i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
             if (!clickableId.isEmpty()) {
-                i.putExtra(TileProviderService.EXTRA_CLICKABLE_ID, clickableId);
+                i.putExtra(TileService.EXTRA_CLICKABLE_ID, clickableId);
             }
 
             for (Map.Entry<String, AndroidExtra> entry : activity.getKeyToExtraMap().entrySet()) {
diff --git a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/connection/DefaultTileProviderClientTest.kt b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/connection/DefaultTileClientTest.kt
similarity index 86%
rename from wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/connection/DefaultTileProviderClientTest.kt
rename to wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/connection/DefaultTileClientTest.kt
index b03a20c..44c2ccf 100644
--- a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/connection/DefaultTileProviderClientTest.kt
+++ b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/connection/DefaultTileClientTest.kt
@@ -58,28 +58,28 @@
 @Config(manifest = Config.NONE)
 @OptIn(ExperimentalCoroutinesApi::class, ExperimentalStdlibApi::class)
 @RunWith(TilesTestRunner::class)
-public class DefaultTileProviderClientTest {
+public class DefaultTileClientTest {
     public companion object {
         private val TILE_PROVIDER = ComponentName("HelloWorld", "FooBarBaz")
     }
 
     private lateinit var appContext: Context
-    private lateinit var fakeTileProvider: FakeTileProviderService
+    private lateinit var fakeTileService: FakeTileService
     private lateinit var fakeCoroutineDispatcher: TestCoroutineDispatcher
     private lateinit var fakeCoroutineScope: TestCoroutineScope
-    private lateinit var clientUnderTest: DefaultTileProviderClient
+    private lateinit var clientUnderTest: DefaultTileClient
 
     @Before
     public fun setUp() {
         appContext = ApplicationProvider.getApplicationContext()
-        fakeTileProvider = FakeTileProviderService()
+        fakeTileService = FakeTileService()
         fakeCoroutineDispatcher = TestCoroutineDispatcher()
         fakeCoroutineScope = TestCoroutineScope()
 
         Shadows.shadowOf(appContext as Application)
-            .setComponentNameAndServiceForBindService(TILE_PROVIDER, fakeTileProvider.asBinder())
+            .setComponentNameAndServiceForBindService(TILE_PROVIDER, fakeTileService.asBinder())
 
-        clientUnderTest = DefaultTileProviderClient(
+        clientUnderTest = DefaultTileClient(
             appContext, TILE_PROVIDER,
             fakeCoroutineScope, fakeCoroutineDispatcher
         )
@@ -96,7 +96,7 @@
     @Test
     public fun getTileContents_canGetTileContents(): Unit = fakeCoroutineScope.runBlockingTest {
         val expectedTile = TileBuilders.Tile.Builder().setResourcesVersion("5").build()
-        fakeTileProvider.returnTile = expectedTile.toProto().toByteArray()
+        fakeTileService.returnTile = expectedTile.toProto().toByteArray()
 
         val result = async {
             clientUnderTest.requestTile(RequestBuilders.TileRequest.Builder().build()).await()
@@ -111,7 +111,7 @@
     public fun getTileContents_failsIfUnparsableResult(): Unit =
         fakeCoroutineScope.runBlockingTest {
             // Put some random payload in and see if it breaks.
-            fakeTileProvider.returnTile = byteArrayOf(127)
+            fakeTileService.returnTile = byteArrayOf(127)
 
             val result = async {
                 clientUnderTest.requestTile(RequestBuilders.TileRequest.Builder().build()).await()
@@ -128,8 +128,8 @@
     public fun getTileContents_failsIfVersionMismatch(): Unit = fakeCoroutineScope.runBlockingTest {
         // Put some random payload in and see if it breaks.
         val expectedTile = TileProto.Tile.newBuilder().setResourcesVersion("5").build()
-        fakeTileProvider.returnTile = expectedTile.toByteArray()
-        fakeTileProvider.returnTileVersion = -1
+        fakeTileService.returnTile = expectedTile.toByteArray()
+        fakeTileService.returnTileVersion = -1
 
         val result = async {
             clientUnderTest.requestTile(RequestBuilders.TileRequest.Builder().build()).await()
@@ -144,8 +144,8 @@
     @Test
     public fun getTileContents_failsOnTimeout(): Unit = fakeCoroutineScope.runBlockingTest {
         val expectedTile = TileProto.Tile.newBuilder().setResourcesVersion("5").build()
-        fakeTileProvider.returnTile = expectedTile.toByteArray()
-        fakeTileProvider.shouldReturnTile = false
+        fakeTileService.returnTile = expectedTile.toByteArray()
+        fakeTileService.shouldReturnTile = false
 
         // This has to be dispatched on the correct dispatcher, so we can fully control its timing.
         val result = async(fakeCoroutineDispatcher) {
@@ -155,10 +155,10 @@
 
         assertThat(result.isCompleted).isFalse()
 
-        fakeCoroutineDispatcher.advanceTimeBy(DefaultTileProviderClient.TIMEOUT_MILLIS / 2)
+        fakeCoroutineDispatcher.advanceTimeBy(DefaultTileClient.TIMEOUT_MILLIS / 2)
         assertThat(result.isCompleted).isFalse()
 
-        fakeCoroutineDispatcher.advanceTimeBy(DefaultTileProviderClient.TIMEOUT_MILLIS / 2)
+        fakeCoroutineDispatcher.advanceTimeBy(DefaultTileClient.TIMEOUT_MILLIS / 2)
         assertThat(result.isCompleted).isTrue()
 
         assertThat(result.getCompletionExceptionOrNull())
@@ -168,7 +168,7 @@
     @Test
     public fun getResources_canGetResources(): Unit = fakeCoroutineScope.runBlockingTest {
         val expectedResources = ResourceBuilders.Resources.Builder().setVersion("5").build()
-        fakeTileProvider.returnResources = expectedResources.toProto().toByteArray()
+        fakeTileService.returnResources = expectedResources.toProto().toByteArray()
 
         val result = async {
             clientUnderTest.requestResources(
@@ -182,7 +182,7 @@
 
     @Test
     public fun getResources_failsIfUnparsableResult(): Unit = fakeCoroutineScope.runBlockingTest {
-        fakeTileProvider.returnResources = byteArrayOf(127)
+        fakeTileService.returnResources = byteArrayOf(127)
 
         val result = async {
             clientUnderTest.requestResources(
@@ -200,8 +200,8 @@
     @Test
     public fun getResources_failsIfVersionMismatch(): Unit = fakeCoroutineScope.runBlockingTest {
         val expectedResources = ResourceBuilders.Resources.Builder().setVersion("5").build()
-        fakeTileProvider.returnResources = expectedResources.toProto().toByteArray()
-        fakeTileProvider.returnResourcesVersion = -2
+        fakeTileService.returnResources = expectedResources.toProto().toByteArray()
+        fakeTileService.returnResourcesVersion = -2
 
         val result = async {
             clientUnderTest.requestResources(
@@ -218,8 +218,8 @@
     @Test
     public fun getResources_failsOnTimeout(): Unit = fakeCoroutineScope.runBlockingTest {
         val expectedResources = ResourceBuilders.Resources.Builder().setVersion("5").build()
-        fakeTileProvider.returnResources = expectedResources.toProto().toByteArray()
-        fakeTileProvider.shouldReturnResources = false
+        fakeTileService.returnResources = expectedResources.toProto().toByteArray()
+        fakeTileService.shouldReturnResources = false
 
         // This has to be dispatched on the correct dispatcher, so we can fully control its timing.
         val result = async(fakeCoroutineDispatcher) {
@@ -231,10 +231,10 @@
 
         assertThat(result.isCompleted).isFalse()
 
-        fakeCoroutineDispatcher.advanceTimeBy(DefaultTileProviderClient.TIMEOUT_MILLIS / 2)
+        fakeCoroutineDispatcher.advanceTimeBy(DefaultTileClient.TIMEOUT_MILLIS / 2)
         assertThat(result.isCompleted).isFalse()
 
-        fakeCoroutineDispatcher.advanceTimeBy(DefaultTileProviderClient.TIMEOUT_MILLIS / 2)
+        fakeCoroutineDispatcher.advanceTimeBy(DefaultTileClient.TIMEOUT_MILLIS / 2)
         assertThat(result.isCompleted).isTrue()
 
         assertThat(result.getCompletionExceptionOrNull())
@@ -250,7 +250,7 @@
         Shadows.shadowOf(Looper.getMainLooper()).idle() // Ensure it actually binds...
         job.join()
 
-        assertThat(fakeTileProvider.onTileAddCalled).isTrue()
+        assertThat(fakeTileService.onTileAddCalled).isTrue()
     }
 
     @Test
@@ -262,7 +262,7 @@
         Shadows.shadowOf(Looper.getMainLooper()).idle() // Ensure it actually binds...
         job.join()
 
-        assertThat(fakeTileProvider.onTileRemoveCalled).isTrue()
+        assertThat(fakeTileService.onTileRemoveCalled).isTrue()
     }
 
     @Test
@@ -274,7 +274,7 @@
         Shadows.shadowOf(Looper.getMainLooper()).idle() // Ensure it actually binds...
         job.join()
 
-        assertThat(fakeTileProvider.onTileEnterCalled).isTrue()
+        assertThat(fakeTileService.onTileEnterCalled).isTrue()
     }
 
     @Test
@@ -286,10 +286,10 @@
         Shadows.shadowOf(Looper.getMainLooper()).idle() // Ensure it actually binds...
         job.join()
 
-        assertThat(fakeTileProvider.onTileLeaveCalled).isTrue()
+        assertThat(fakeTileService.onTileLeaveCalled).isTrue()
     }
 
-    private class FakeTileProviderService : TileProvider.Stub() {
+    private class FakeTileService : TileProvider.Stub() {
         var shouldReturnTile = true
         var returnTile = ByteArray(0)
         var returnTileVersion = TileData.VERSION_PROTOBUF
diff --git a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/connection/TilesConnectionBinderTest.kt b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/connection/TilesConnectionBinderTest.kt
index d0d0d63..953a3ee 100644
--- a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/connection/TilesConnectionBinderTest.kt
+++ b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/connection/TilesConnectionBinderTest.kt
@@ -56,7 +56,7 @@
     }
 
     private lateinit var appContext: Context
-    private lateinit var fakeTileProvider: FakeTileProviderService
+    private lateinit var fakeTileService: FakeTileService
     private lateinit var fakeCoroutineDispatcher: TestCoroutineDispatcher
     private lateinit var fakeCoroutineScope: TestCoroutineScope
     private lateinit var connectionBinderUnderTest: TilesConnectionBinder
@@ -64,12 +64,12 @@
     @Before
     public fun setUp() {
         appContext = getApplicationContext()
-        fakeTileProvider = FakeTileProviderService()
+        fakeTileService = FakeTileService()
         fakeCoroutineDispatcher = TestCoroutineDispatcher()
         fakeCoroutineScope = TestCoroutineScope()
 
         shadowOf(appContext as Application)
-            .setComponentNameAndServiceForBindService(TILE_PROVIDER, fakeTileProvider.asBinder())
+            .setComponentNameAndServiceForBindService(TILE_PROVIDER, fakeTileService.asBinder())
 
         connectionBinderUnderTest = TilesConnectionBinder(
             appContext, TILE_PROVIDER,
@@ -286,7 +286,7 @@
         result1.await()
     }
 
-    private class FakeTileProviderService : TileProvider.Stub() {
+    private class FakeTileService : TileProvider.Stub() {
         override fun getApiVersion(): Int {
             return 5
         }
diff --git a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/renderer/internal/TileRendererInternalTest.java b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/renderer/internal/TileRendererInternalTest.java
index 720732c..68914be 100644
--- a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/renderer/internal/TileRendererInternalTest.java
+++ b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/renderer/internal/TileRendererInternalTest.java
@@ -38,7 +38,7 @@
 import android.widget.TextView;
 
 import androidx.core.content.ContextCompat;
-import androidx.wear.tiles.TileProviderService;
+import androidx.wear.tiles.TileService;
 import androidx.wear.tiles.TilesTestRunner;
 import androidx.wear.tiles.proto.ActionProto.Action;
 import androidx.wear.tiles.proto.ActionProto.AndroidActivity;
@@ -982,7 +982,7 @@
 
         Intent i = TileRendererInternal.buildLaunchActionIntent(launchAction, testId);
 
-        expect.that(i.getStringExtra(TileProviderService.EXTRA_CLICKABLE_ID)).isEqualTo(testId);
+        expect.that(i.getStringExtra(TileService.EXTRA_CLICKABLE_ID)).isEqualTo(testId);
     }
 
     @Test
@@ -995,7 +995,7 @@
 
         Intent i = TileRendererInternal.buildLaunchActionIntent(launchAction, "");
 
-        expect.that(i.hasExtra(TileProviderService.EXTRA_CLICKABLE_ID)).isFalse();
+        expect.that(i.hasExtra(TileService.EXTRA_CLICKABLE_ID)).isFalse();
     }
 
     @Test
diff --git a/wear/tiles/tiles-testing/api/current.txt b/wear/tiles/tiles-testing/api/current.txt
index b53b21c..353b0c6 100644
--- a/wear/tiles/tiles-testing/api/current.txt
+++ b/wear/tiles/tiles-testing/api/current.txt
@@ -1,9 +1,9 @@
 // Signature format: 4.0
 package androidx.wear.tiles.testing {
 
-  public final class TestTileProviderClient<T extends androidx.wear.tiles.TileProviderService> implements androidx.wear.tiles.client.TileProviderClient {
-    ctor public TestTileProviderClient(T service, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
-    ctor public TestTileProviderClient(T service, java.util.concurrent.Executor executor);
+  public final class TestTileClient<T extends androidx.wear.tiles.TileService> implements androidx.wear.tiles.client.TileClient {
+    ctor public TestTileClient(T service, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
+    ctor public TestTileClient(T service, java.util.concurrent.Executor executor);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer> requestApiVersion();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest requestParams);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest requestParams);
diff --git a/wear/tiles/tiles-testing/api/public_plus_experimental_current.txt b/wear/tiles/tiles-testing/api/public_plus_experimental_current.txt
index b53b21c..353b0c6 100644
--- a/wear/tiles/tiles-testing/api/public_plus_experimental_current.txt
+++ b/wear/tiles/tiles-testing/api/public_plus_experimental_current.txt
@@ -1,9 +1,9 @@
 // Signature format: 4.0
 package androidx.wear.tiles.testing {
 
-  public final class TestTileProviderClient<T extends androidx.wear.tiles.TileProviderService> implements androidx.wear.tiles.client.TileProviderClient {
-    ctor public TestTileProviderClient(T service, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
-    ctor public TestTileProviderClient(T service, java.util.concurrent.Executor executor);
+  public final class TestTileClient<T extends androidx.wear.tiles.TileService> implements androidx.wear.tiles.client.TileClient {
+    ctor public TestTileClient(T service, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
+    ctor public TestTileClient(T service, java.util.concurrent.Executor executor);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer> requestApiVersion();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest requestParams);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest requestParams);
diff --git a/wear/tiles/tiles-testing/api/restricted_current.txt b/wear/tiles/tiles-testing/api/restricted_current.txt
index b53b21c..353b0c6 100644
--- a/wear/tiles/tiles-testing/api/restricted_current.txt
+++ b/wear/tiles/tiles-testing/api/restricted_current.txt
@@ -1,9 +1,9 @@
 // Signature format: 4.0
 package androidx.wear.tiles.testing {
 
-  public final class TestTileProviderClient<T extends androidx.wear.tiles.TileProviderService> implements androidx.wear.tiles.client.TileProviderClient {
-    ctor public TestTileProviderClient(T service, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
-    ctor public TestTileProviderClient(T service, java.util.concurrent.Executor executor);
+  public final class TestTileClient<T extends androidx.wear.tiles.TileService> implements androidx.wear.tiles.client.TileClient {
+    ctor public TestTileClient(T service, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
+    ctor public TestTileClient(T service, java.util.concurrent.Executor executor);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer> requestApiVersion();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest requestParams);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest requestParams);
diff --git a/wear/tiles/tiles-testing/src/main/java/androidx/wear/tiles/testing/TestTileProviderClient.kt b/wear/tiles/tiles-testing/src/main/java/androidx/wear/tiles/testing/TestTileClient.kt
similarity index 72%
rename from wear/tiles/tiles-testing/src/main/java/androidx/wear/tiles/testing/TestTileProviderClient.kt
rename to wear/tiles/tiles-testing/src/main/java/androidx/wear/tiles/testing/TestTileClient.kt
index 7ae8b81..5fd722d 100644
--- a/wear/tiles/tiles-testing/src/main/java/androidx/wear/tiles/testing/TestTileProviderClient.kt
+++ b/wear/tiles/tiles-testing/src/main/java/androidx/wear/tiles/testing/TestTileClient.kt
@@ -24,9 +24,9 @@
 import androidx.wear.tiles.RequestBuilders
 import androidx.wear.tiles.ResourceBuilders
 import androidx.wear.tiles.TileBuilders
-import androidx.wear.tiles.TileProviderService
-import androidx.wear.tiles.client.TileProviderClient
-import androidx.wear.tiles.connection.DefaultTileProviderClient
+import androidx.wear.tiles.TileService
+import androidx.wear.tiles.client.TileClient
+import androidx.wear.tiles.connection.DefaultTileClient
 import com.google.common.util.concurrent.ListenableFuture
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
@@ -35,29 +35,30 @@
 import java.util.concurrent.Executor
 
 /**
- * TileProviderClient for testing purposes. This will pass calls through to the given instance of
- * [TileProviderService], handling all the service binding (via Robolectric), and
+ * [TileClient] for testing purposes. This will pass calls through to the given instance of
+ * [TileService], handling all the service binding (via Robolectric), and
  * serialization/deserialization.
  *
  * Note that this class will not drive the full service lifecycle for the passed service instance.
  * On the first call to any of these methods, it will call your service's [Service.onCreate] method,
- * however, it will never call [Service.onDestroy]. Equally, where [DefaultTileProviderClient] will
+ * however, it will never call [Service.onDestroy]. Equally, where [DefaultTileClient] will
  * unbind after a period of time, potentially destroying the service, this class wil Client will
  * unbind, but not destroy the service. If you wish to test service destruction, you can instead
  * call [Service.onDestroy] on the passed in `service` instance.
  */
-public class TestTileProviderClient<T : TileProviderService> : TileProviderClient {
+public class TestTileClient<T : TileService> :
+    TileClient {
     private val controller: ServiceController<T>
     private val componentName: ComponentName
-    private val innerTileProvider: DefaultTileProviderClient
+    private val innerTileService: DefaultTileClient
     private var hasBound = false
 
     /**
-     * Build a [TestTileProviderClient] for use with a coroutine dispatcher.
+     * Build a [TestTileClient] for use with a coroutine dispatcher.
      *
-     * @param service An instance of the [TileProviderService] class to bind to.
+     * @param service An instance of the [TileService] class to bind to.
      * @param coroutineScope A [CoroutineScope] to use when dispatching calls to the
-     *   [TileProviderService]. Cancelling the passed [CoroutineScope] will also cancel any pending
+     *   [TileService]. Cancelling the passed [CoroutineScope] will also cancel any pending
      *   work in this class.
      * @param coroutineDispatcher A [CoroutineDispatcher] to use when dispatching work from this
      *   class.
@@ -67,13 +68,13 @@
         coroutineScope: CoroutineScope,
         coroutineDispatcher: CoroutineDispatcher
     ) {
-        val bindIntent = Intent(TileProviderService.ACTION_BIND_TILE_PROVIDER)
+        val bindIntent = Intent(TileService.ACTION_BIND_TILE_PROVIDER)
         this.componentName = ComponentName(getApplicationContext(), service.javaClass)
 
         bindIntent.component = componentName
         this.controller = ServiceController.of(service, bindIntent)
 
-        this.innerTileProvider = DefaultTileProviderClient(
+        this.innerTileService = DefaultTileClient(
             getApplicationContext(),
             componentName,
             coroutineScope,
@@ -82,19 +83,19 @@
     }
 
     /**
-     * Build a [TestTileProviderClient] for use with a given [Executor]
+     * Build a [TestTileClient] for use with a given [Executor]
      *
-     * @param service An instance of the [TileProviderService] class to bind to.
-     * @param executor An [Executor] to use when dispatching calls to the [TileProviderService].
+     * @param service An instance of the [TileService] class to bind to.
+     * @param executor An [Executor] to use when dispatching calls to the [TileService].
      */
     public constructor(service: T, executor: Executor) {
-        val bindIntent = Intent(TileProviderService.ACTION_BIND_TILE_PROVIDER)
+        val bindIntent = Intent(TileService.ACTION_BIND_TILE_PROVIDER)
         this.componentName = ComponentName(getApplicationContext(), service.javaClass)
 
         bindIntent.component = componentName
         this.controller = ServiceController.of(service, bindIntent)
 
-        this.innerTileProvider = DefaultTileProviderClient(
+        this.innerTileService = DefaultTileClient(
             getApplicationContext(),
             componentName,
             executor
@@ -103,41 +104,41 @@
 
     override fun requestApiVersion(): ListenableFuture<Int> {
         maybeBind()
-        return innerTileProvider.requestApiVersion()
+        return innerTileService.requestApiVersion()
     }
 
     override fun requestTile(
         requestParams: RequestBuilders.TileRequest
     ): ListenableFuture<TileBuilders.Tile> {
         maybeBind()
-        return innerTileProvider.requestTile(requestParams)
+        return innerTileService.requestTile(requestParams)
     }
 
     override fun requestResources(
         requestParams: RequestBuilders.ResourcesRequest
     ): ListenableFuture<ResourceBuilders.Resources> {
         maybeBind()
-        return innerTileProvider.requestResources(requestParams)
+        return innerTileService.requestResources(requestParams)
     }
 
     override fun sendOnTileAddedEvent(): ListenableFuture<Void?> {
         maybeBind()
-        return innerTileProvider.sendOnTileAddedEvent()
+        return innerTileService.sendOnTileAddedEvent()
     }
 
     override fun sendOnTileRemovedEvent(): ListenableFuture<Void?> {
         maybeBind()
-        return innerTileProvider.sendOnTileRemovedEvent()
+        return innerTileService.sendOnTileRemovedEvent()
     }
 
     override fun sendOnTileEnterEvent(): ListenableFuture<Void?> {
         maybeBind()
-        return innerTileProvider.sendOnTileEnterEvent()
+        return innerTileService.sendOnTileEnterEvent()
     }
 
     override fun sendOnTileLeaveEvent(): ListenableFuture<Void?> {
         maybeBind()
-        return innerTileProvider.sendOnTileLeaveEvent()
+        return innerTileService.sendOnTileLeaveEvent()
     }
 
     private fun maybeBind() {
diff --git a/wear/tiles/tiles-testing/src/test/java/androidx/wear/tiles/testing/TestTileProviderClientTest.kt b/wear/tiles/tiles-testing/src/test/java/androidx/wear/tiles/testing/TestTileClientTest.kt
similarity index 76%
rename from wear/tiles/tiles-testing/src/test/java/androidx/wear/tiles/testing/TestTileProviderClientTest.kt
rename to wear/tiles/tiles-testing/src/test/java/androidx/wear/tiles/testing/TestTileClientTest.kt
index 5c57c59..9cf99ca 100644
--- a/wear/tiles/tiles-testing/src/test/java/androidx/wear/tiles/testing/TestTileProviderClientTest.kt
+++ b/wear/tiles/tiles-testing/src/test/java/androidx/wear/tiles/testing/TestTileClientTest.kt
@@ -23,7 +23,7 @@
 import androidx.wear.tiles.ResourceBuilders
 import androidx.wear.tiles.TileBuilders
 import androidx.wear.tiles.TileProvider
-import androidx.wear.tiles.TileProviderService
+import androidx.wear.tiles.TileService
 import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.ListenableFuture
 import org.junit.Before
@@ -35,17 +35,17 @@
 
 @RunWith(TilesTestingTestRunner::class)
 @DoNotInstrument
-public class TestTileProviderClientTest {
+public class TestTileClientTest {
     private companion object {
         private val RESOURCES_VERSION = "10"
     }
-    private val fakeTileProvider = FakeTileProviderService()
-    private lateinit var clientUnderTest: TestTileProviderClient<FakeTileProviderService>
+    private val fakeTileService = FakeTileService()
+    private lateinit var clientUnderTest: TestTileClient<FakeTileService>
 
     @Before
     public fun setUp() {
         val executor = InlineExecutorService()
-        clientUnderTest = TestTileProviderClient(fakeTileProvider, executor)
+        clientUnderTest = TestTileClient(fakeTileService, executor)
     }
 
     @Test
@@ -84,10 +84,10 @@
         shadowOf(Looper.getMainLooper()).idle()
 
         assertThat(f.isDone).isTrue()
-        assertThat(fakeTileProvider.onTileAddFired).isTrue()
-        assertThat(fakeTileProvider.onTileRemoveFired).isFalse()
-        assertThat(fakeTileProvider.onTileEnterFired).isFalse()
-        assertThat(fakeTileProvider.onTileLeaveFired).isFalse()
+        assertThat(fakeTileService.onTileAddFired).isTrue()
+        assertThat(fakeTileService.onTileRemoveFired).isFalse()
+        assertThat(fakeTileService.onTileEnterFired).isFalse()
+        assertThat(fakeTileService.onTileLeaveFired).isFalse()
     }
 
     @Test
@@ -97,10 +97,10 @@
         shadowOf(Looper.getMainLooper()).idle()
 
         assertThat(f.isDone).isTrue()
-        assertThat(fakeTileProvider.onTileAddFired).isFalse()
-        assertThat(fakeTileProvider.onTileRemoveFired).isTrue()
-        assertThat(fakeTileProvider.onTileEnterFired).isFalse()
-        assertThat(fakeTileProvider.onTileLeaveFired).isFalse()
+        assertThat(fakeTileService.onTileAddFired).isFalse()
+        assertThat(fakeTileService.onTileRemoveFired).isTrue()
+        assertThat(fakeTileService.onTileEnterFired).isFalse()
+        assertThat(fakeTileService.onTileLeaveFired).isFalse()
     }
 
     @Test
@@ -110,10 +110,10 @@
         shadowOf(Looper.getMainLooper()).idle()
 
         assertThat(f.isDone).isTrue()
-        assertThat(fakeTileProvider.onTileAddFired).isFalse()
-        assertThat(fakeTileProvider.onTileRemoveFired).isFalse()
-        assertThat(fakeTileProvider.onTileEnterFired).isTrue()
-        assertThat(fakeTileProvider.onTileLeaveFired).isFalse()
+        assertThat(fakeTileService.onTileAddFired).isFalse()
+        assertThat(fakeTileService.onTileRemoveFired).isFalse()
+        assertThat(fakeTileService.onTileEnterFired).isTrue()
+        assertThat(fakeTileService.onTileLeaveFired).isFalse()
     }
 
     @Test
@@ -123,13 +123,13 @@
         shadowOf(Looper.getMainLooper()).idle()
 
         assertThat(f.isDone).isTrue()
-        assertThat(fakeTileProvider.onTileAddFired).isFalse()
-        assertThat(fakeTileProvider.onTileRemoveFired).isFalse()
-        assertThat(fakeTileProvider.onTileEnterFired).isFalse()
-        assertThat(fakeTileProvider.onTileLeaveFired).isTrue()
+        assertThat(fakeTileService.onTileAddFired).isFalse()
+        assertThat(fakeTileService.onTileRemoveFired).isFalse()
+        assertThat(fakeTileService.onTileEnterFired).isFalse()
+        assertThat(fakeTileService.onTileLeaveFired).isTrue()
     }
 
-    public inner class FakeTileProviderService : TileProviderService() {
+    public inner class FakeTileService : TileService() {
         internal var onTileAddFired = false
         internal var onTileRemoveFired = false
         internal var onTileEnterFired = false
diff --git a/wear/tiles/tiles/api/current.txt b/wear/tiles/tiles/api/current.txt
index 6bfd76f..6c21e92 100644
--- a/wear/tiles/tiles/api/current.txt
+++ b/wear/tiles/tiles/api/current.txt
@@ -963,8 +963,8 @@
     method public androidx.wear.tiles.TileBuilders.Tile.Builder setTimeline(androidx.wear.tiles.TimelineBuilders.Timeline);
   }
 
-  public abstract class TileProviderService extends android.app.Service {
-    ctor public TileProviderService();
+  public abstract class TileService extends android.app.Service {
+    ctor public TileService();
     method public static androidx.wear.tiles.TileUpdateRequester getUpdater(android.content.Context);
     method public android.os.IBinder? onBind(android.content.Intent);
     method @MainThread protected abstract com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources!> onResourcesRequest(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
@@ -979,7 +979,7 @@
   }
 
   public interface TileUpdateRequester {
-    method public void requestUpdate(Class<? extends androidx.wear.tiles.TileProviderService>);
+    method public void requestUpdate(Class<? extends androidx.wear.tiles.TileService>);
   }
 
   public final class TimelineBuilders {
diff --git a/wear/tiles/tiles/api/public_plus_experimental_current.txt b/wear/tiles/tiles/api/public_plus_experimental_current.txt
index 5c4ad7e..499702d 100644
--- a/wear/tiles/tiles/api/public_plus_experimental_current.txt
+++ b/wear/tiles/tiles/api/public_plus_experimental_current.txt
@@ -979,8 +979,8 @@
     method public androidx.wear.tiles.TileBuilders.Tile.Builder setTimeline(androidx.wear.tiles.TimelineBuilders.Timeline);
   }
 
-  public abstract class TileProviderService extends android.app.Service {
-    ctor public TileProviderService();
+  public abstract class TileService extends android.app.Service {
+    ctor public TileService();
     method public static androidx.wear.tiles.TileUpdateRequester getUpdater(android.content.Context);
     method public android.os.IBinder? onBind(android.content.Intent);
     method @MainThread protected abstract com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources!> onResourcesRequest(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
@@ -995,7 +995,7 @@
   }
 
   public interface TileUpdateRequester {
-    method public void requestUpdate(Class<? extends androidx.wear.tiles.TileProviderService>);
+    method public void requestUpdate(Class<? extends androidx.wear.tiles.TileService>);
   }
 
   @RequiresOptIn(level=androidx.annotation.RequiresOptIn.Level.ERROR) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) public @interface TilesExperimental {
diff --git a/wear/tiles/tiles/api/restricted_current.txt b/wear/tiles/tiles/api/restricted_current.txt
index 6bfd76f..6c21e92 100644
--- a/wear/tiles/tiles/api/restricted_current.txt
+++ b/wear/tiles/tiles/api/restricted_current.txt
@@ -963,8 +963,8 @@
     method public androidx.wear.tiles.TileBuilders.Tile.Builder setTimeline(androidx.wear.tiles.TimelineBuilders.Timeline);
   }
 
-  public abstract class TileProviderService extends android.app.Service {
-    ctor public TileProviderService();
+  public abstract class TileService extends android.app.Service {
+    ctor public TileService();
     method public static androidx.wear.tiles.TileUpdateRequester getUpdater(android.content.Context);
     method public android.os.IBinder? onBind(android.content.Intent);
     method @MainThread protected abstract com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources!> onResourcesRequest(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
@@ -979,7 +979,7 @@
   }
 
   public interface TileUpdateRequester {
-    method public void requestUpdate(Class<? extends androidx.wear.tiles.TileProviderService>);
+    method public void requestUpdate(Class<? extends androidx.wear.tiles.TileService>);
   }
 
   public final class TimelineBuilders {
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java
index c97773d..2233b74 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java
@@ -34,9 +34,9 @@
     }
 
     @Override
-    public void requestUpdate(@NonNull Class<? extends TileProviderService> tileProvider) {
+    public void requestUpdate(@NonNull Class<? extends TileService> tileService) {
         for (TileUpdateRequester requester : mUpdateRequesters) {
-            requester.requestUpdate(tileProvider);
+            requester.requestUpdate(tileService);
         }
     }
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/RequestBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/RequestBuilders.java
index 0fb7806..8b397d6 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/RequestBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/RequestBuilders.java
@@ -31,7 +31,7 @@
     private RequestBuilders() {}
 
     /**
-     * Parameters passed to a {@link androidx.wear.tiles.TileBuilders.Tile} provider when the
+     * Parameters passed to a {@link androidx.wear.tiles.TileBuilders.Tile} service when the
      * renderer is requesting a new version of the tile.
      */
     public static final class TileRequest {
@@ -105,7 +105,7 @@
     }
 
     /**
-     * Parameters passed to a {@link androidx.wear.tiles.TileBuilders.Tile} provider when the
+     * Parameters passed to a {@link androidx.wear.tiles.TileBuilders.Tile} service when the
      * renderer is requesting a specific resource version.
      */
     public static final class ResourcesRequest {
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java
index 331026a..e416459 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for Tiles' ResourceRequest class, to be parceled and transferred to a Tile Provider.
+ * Holder for Tiles' ResourceRequest class, to be parceled and transferred to a Tile Service.
  *
  * <p>All this does is to serialize ResourceRequest as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
index c1d54c8..075b1bc 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
@@ -64,9 +64,9 @@
     }
 
     @Override
-    public void requestUpdate(@NonNull Class<? extends TileProviderService> tileProvider) {
+    public void requestUpdate(@NonNull Class<? extends TileService> tileService) {
         synchronized (mLock) {
-            mPendingServices.add(tileProvider);
+            mPendingServices.add(tileService);
 
             if (mBindInProgress) {
                 // Something else kicked off the bind; let that carry on binding.
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
index f54e03e..feef838 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for Tiles' TileAddEvent class, to be parceled and transferred to a tile provider.
+ * Holder for Tiles' TileAddEvent class, to be parceled and transferred to a tile service.
  *
  * <p>All this does is to serialize TileAddEvent as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
index 99e0dbc..4dae195 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for Tiles' TileEnterEvent class, to be parceled and transferred to a tile provider.
+ * Holder for Tiles' TileEnterEvent class, to be parceled and transferred to a tile service.
  *
  * <p>All this does is to serialize TileEnterEvent as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java
index bbc7ae6..6dd75e6 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for Tiles' TileLeaveEvent class, to be parceled and transferred to a tile provider.
+ * Holder for Tiles' TileLeaveEvent class, to be parceled and transferred to a tile service.
  *
  * <p>All this does is to serialize TileLeaveEvent as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
index 904c86e..921a74b 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for Tiles' TileRemoveEvent class, to be parceled and transferred to a tile provider.
+ * Holder for Tiles' TileRemoveEvent class, to be parceled and transferred to a tile service.
  *
  * <p>All this does is to serialize TileRemoveEvent as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java
index 8e2b2f6..04f63c6 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for Tiles' TileRequest class, to be parceled and transferred to a Tile Provider.
+ * Holder for Tiles' TileRequest class, to be parceled and transferred to a Tile Service.
  *
  * <p>All this does is to serialize TileRequest as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileProviderService.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileService.java
similarity index 86%
rename from wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileProviderService.java
rename to wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileService.java
index 2dff303..e277215 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileProviderService.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileService.java
@@ -51,22 +51,22 @@
 /**
  * Base class for a service providing data for an app tile.
  *
- * <p>A provider service must implement {@link #onTileRequest} and {@link #onResourcesRequest} to
+ * <p>A tile service must implement {@link #onTileRequest} and {@link #onResourcesRequest} to
  * respond to requests for updates from the system.
  *
- * <p>The manifest declaration of this service must include an intent filter for {@link
- * #ACTION_BIND_TILE_PROVIDER}.
+ * <p>The manifest declaration of this service must include an intent filter for
+ * {@code androidx.wear.tiles.action.BIND_TILE_PROVIDER}.
  *
- * <p>The manifest entry should also include {@code
- * android:permission="com.google.android.wearable.permission.BIND_TILE_PROVIDER"} to ensure that
- * only the system can bind to it.
+ * <p>The manifest entry should also include
+ * {@code android:permission="com.google.android.wearable.permission.BIND_TILE_PROVIDER"} to
+ * ensure that only the system can bind to it.
  */
-public abstract class TileProviderService extends Service {
+public abstract class TileService extends Service {
 
-    private static final String TAG = "TileProviderService";
+    private static final String TAG = "TileService";
 
     /**
-     * The intent action used to send update requests to the provider. Tile provider services must
+     * The intent action used to send update requests to the service. Tile services must
      * declare an intent filter for this action in the manifest.
      */
     public static final String ACTION_BIND_TILE_PROVIDER =
@@ -82,7 +82,7 @@
     public static final String METADATA_PREVIEW_KEY = "androidx.wear.tiles.PREVIEW";
 
     /**
-     * Called when the system is requesting a new timeline from this Tile Provider. The returned
+     * Called when the system is requesting a new timeline from this Tile Service. The returned
      * future must complete after at most 10 seconds from the moment this method is called (exact
      * timeout length subject to change).
      *
@@ -95,7 +95,7 @@
     protected abstract ListenableFuture<Tile> onTileRequest(@NonNull TileRequest requestParams);
 
     /**
-     * Called when the system is requesting a resource bundle from this Tile Provider. The returned
+     * Called when the system is requesting a resource bundle from this Tile Service. The returned
      * future must complete after at most 10 seconds from the moment this method is called (exact
      * timeout length subject to change).
      *
@@ -110,7 +110,7 @@
             @NonNull ResourcesRequest requestParams);
 
     /**
-     * Called when a tile provided by this Tile Provider is added to the carousel.
+     * Called when a tile provided by this Tile Service is added to the carousel.
      *
      * <p>Note that this is called from your app's main thread, which is usually also the UI thread.
      *
@@ -120,7 +120,7 @@
     protected void onTileAddEvent(@NonNull TileAddEvent requestParams) {}
 
     /**
-     * Called when a tile provided by this Tile Provider is removed from the carousel.
+     * Called when a tile provided by this Tile Service is removed from the carousel.
      *
      * <p>Note that this is called from your app's main thread, which is usually also the UI thread.
      *
@@ -130,7 +130,7 @@
     protected void onTileRemoveEvent(@NonNull TileRemoveEvent requestParams) {}
 
     /**
-     * Called when a tile provided by this Tile Provider becomes into view, on screen.
+     * Called when a tile provided by this Tile Service becomes into view, on screen.
      *
      * <p>Note that this is called from your app's main thread, which is usually also the UI thread.
      *
@@ -140,7 +140,7 @@
     protected void onTileEnterEvent(@NonNull TileEnterEvent requestParams) {}
 
     /**
-     * Called when a tile provided by this Tile Provider goes out of view, on screen.
+     * Called when a tile provided by this Tile Service goes out of view, on screen.
      *
      * <p>Note that this is called from your app's main thread, which is usually also the UI thread.
      *
@@ -150,8 +150,8 @@
     protected void onTileLeaveEvent(@NonNull TileLeaveEvent requestParams) {}
 
     /**
-     * Gets an instance of {@link TileUpdateRequester} to allow a Tile Provider to notify the tile's
-     * renderer that it should request a new Timeline from this {@link TileProviderService}.
+     * Gets an instance of {@link TileUpdateRequester} to allow a Tile Service to notify the tile's
+     * renderer that it should request a new Timeline from this {@link TileService}.
      *
      * @param context The application context.
      */
@@ -183,11 +183,11 @@
     @SuppressWarnings("ExecutorTaskName")
     private static class TileProviderWrapper extends TileProvider.Stub {
 
-        private final WeakReference<TileProviderService> mServiceRef;
+        private final WeakReference<TileService> mServiceRef;
         private final Handler mHandler;
 
-        TileProviderWrapper(TileProviderService tileProviderService, Handler handler) {
-            mServiceRef = new WeakReference<>(tileProviderService);
+        TileProviderWrapper(TileService tileService, Handler handler) {
+            mServiceRef = new WeakReference<>(tileService);
             this.mHandler = handler;
         }
 
@@ -201,8 +201,8 @@
                 int tileId, TileRequestData requestParams, TileCallback callback) {
             mHandler.post(
                     () -> {
-                        TileProviderService tileProviderService = mServiceRef.get();
-                        if (tileProviderService != null) {
+                        TileService tileService = mServiceRef.get();
+                        if (tileService != null) {
                             if (requestParams.getVersion() != TileRequestData.VERSION_PROTOBUF) {
                                 Log.e(
                                         TAG,
@@ -224,7 +224,7 @@
                             }
 
                             ListenableFuture<Tile> tileFuture =
-                                    tileProviderService.onTileRequest(tileRequest);
+                                    tileService.onTileRequest(tileRequest);
 
                             tileFuture.addListener(
                                     () -> {
@@ -258,8 +258,8 @@
                 int tileId, ResourcesRequestData requestParams, ResourcesCallback callback) {
             mHandler.post(
                     () -> {
-                        TileProviderService tileProviderService = mServiceRef.get();
-                        if (tileProviderService != null) {
+                        TileService tileService = mServiceRef.get();
+                        if (tileService != null) {
                             if (requestParams.getVersion()
                                     != ResourcesRequestData.VERSION_PROTOBUF) {
                                 Log.e(
@@ -282,7 +282,7 @@
                             }
 
                             ListenableFuture<Resources> resourcesFuture =
-                                    tileProviderService.onResourcesRequest(req);
+                                    tileService.onResourcesRequest(req);
 
                             resourcesFuture.addListener(
                                     () -> {
@@ -313,9 +313,9 @@
         public void onTileAddEvent(TileAddEventData data) {
             mHandler.post(
                     () -> {
-                        TileProviderService tileProviderService = mServiceRef.get();
+                        TileService tileService = mServiceRef.get();
 
-                        if (tileProviderService != null) {
+                        if (tileService != null) {
                             if (data.getVersion() != TileAddEventData.VERSION_PROTOBUF) {
                                 Log.e(
                                         TAG,
@@ -329,7 +329,7 @@
                                         TileAddEvent.fromProto(
                                                 EventProto.TileAddEvent.parseFrom(
                                                         data.getContents()));
-                                tileProviderService.onTileAddEvent(evt);
+                                tileService.onTileAddEvent(evt);
                             } catch (InvalidProtocolBufferException ex) {
                                 Log.e(TAG, "Error deserializing TileAddEvent payload.", ex);
                             }
@@ -341,9 +341,9 @@
         public void onTileRemoveEvent(TileRemoveEventData data) {
             mHandler.post(
                     () -> {
-                        TileProviderService tileProviderService = mServiceRef.get();
+                        TileService tileService = mServiceRef.get();
 
-                        if (tileProviderService != null) {
+                        if (tileService != null) {
                             if (data.getVersion() != TileRemoveEventData.VERSION_PROTOBUF) {
                                 Log.e(
                                         TAG,
@@ -357,7 +357,7 @@
                                         TileRemoveEvent.fromProto(
                                                 EventProto.TileRemoveEvent.parseFrom(
                                                         data.getContents()));
-                                tileProviderService.onTileRemoveEvent(evt);
+                                tileService.onTileRemoveEvent(evt);
                             } catch (InvalidProtocolBufferException ex) {
                                 Log.e(TAG, "Error deserializing TileRemoveEvent payload.", ex);
                             }
@@ -369,9 +369,9 @@
         public void onTileEnterEvent(TileEnterEventData data) {
             mHandler.post(
                     () -> {
-                        TileProviderService tileProviderService = mServiceRef.get();
+                        TileService tileService = mServiceRef.get();
 
-                        if (tileProviderService != null) {
+                        if (tileService != null) {
                             if (data.getVersion() != TileEnterEventData.VERSION_PROTOBUF) {
                                 Log.e(
                                         TAG,
@@ -385,7 +385,7 @@
                                         TileEnterEvent.fromProto(
                                                 EventProto.TileEnterEvent.parseFrom(
                                                         data.getContents()));
-                                tileProviderService.onTileEnterEvent(evt);
+                                tileService.onTileEnterEvent(evt);
                             } catch (InvalidProtocolBufferException ex) {
                                 Log.e(TAG, "Error deserializing TileEnterEvent payload.", ex);
                             }
@@ -397,9 +397,9 @@
         public void onTileLeaveEvent(TileLeaveEventData data) {
             mHandler.post(
                     () -> {
-                        TileProviderService tileProviderService = mServiceRef.get();
+                        TileService tileService = mServiceRef.get();
 
-                        if (tileProviderService != null) {
+                        if (tileService != null) {
                             if (data.getVersion() != TileLeaveEventData.VERSION_PROTOBUF) {
                                 Log.e(
                                         TAG,
@@ -413,7 +413,7 @@
                                         TileLeaveEvent.fromProto(
                                                 EventProto.TileLeaveEvent.parseFrom(
                                                         data.getContents()));
-                                tileProviderService.onTileLeaveEvent(evt);
+                                tileService.onTileLeaveEvent(evt);
                             } catch (InvalidProtocolBufferException ex) {
                                 Log.e(TAG, "Error deserializing TileLeaveEvent payload.", ex);
                             }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java
index 02e3640..23f8def 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java
@@ -19,10 +19,10 @@
 import androidx.annotation.NonNull;
 
 /**
- * Interface used for a Tile Provider to notify a Tile Renderer that it should fetch a new Timeline
+ * Interface used for a Tile Service to notify a Tile Renderer that it should fetch a new Timeline
  * from it.
  */
 public interface TileUpdateRequester {
-    /** Notify the Tile Renderer that it should fetch a new Timeline from this Tile Provider. */
-    void requestUpdate(@NonNull Class<? extends TileProviderService> tileProvider);
+    /** Notify the Tile Renderer that it should fetch a new Timeline from this Tile Service. */
+    void requestUpdate(@NonNull Class<? extends TileService> tileService);
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java
index 6ac26b7..cffb82d 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java
@@ -40,7 +40,7 @@
     }
 
     @Override
-    public void requestUpdate(@NonNull Class<? extends TileProviderService> tileProvider) {
+    public void requestUpdate(@NonNull Class<? extends TileService> tileService) {
         mContext.sendBroadcast(buildUpdateIntent(mContext.getPackageName()));
     }
 
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/package-info.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/package-info.java
index 622c725..5892405 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/package-info.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/package-info.java
@@ -15,7 +15,7 @@
  */
 
 /**
- * Contains {@link androidx.wear.tiles.TileProviderService}, which all apps using the Tiles API
+ * Contains {@link androidx.wear.tiles.TileService}, which all apps using the Tiles API
  * should extend in order to provide tile data.
  */
 package androidx.wear.tiles;
diff --git a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java
index 4f00c4f..e47c05a 100644
--- a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java
+++ b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java
@@ -62,15 +62,15 @@
     }
 
     private class FakeUpdateRequester implements TileUpdateRequester {
-        @Nullable Class<? extends TileProviderService> mCalledService = null;
+        @Nullable Class<? extends TileService> mCalledService = null;
 
         @Override
-        public void requestUpdate(@NonNull Class<? extends TileProviderService> tileProvider) {
-            this.mCalledService = tileProvider;
+        public void requestUpdate(@NonNull Class<? extends TileService> tileService) {
+            this.mCalledService = tileService;
         }
     }
 
-    private class FakeService extends TileProviderService {
+    private class FakeService extends TileService {
         @NonNull
         @Override
         protected ListenableFuture<TileBuilders.Tile> onTileRequest(
diff --git a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileProviderServiceTest.java b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileServiceTest.java
similarity index 83%
rename from wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileProviderServiceTest.java
rename to wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileServiceTest.java
index e8df68f..a4e00d1 100644
--- a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileProviderServiceTest.java
+++ b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileServiceTest.java
@@ -55,21 +55,21 @@
 
 @RunWith(RobolectricTestRunner.class)
 @DoNotInstrument
-public class TileProviderServiceTest {
+public class TileServiceTest {
     private static final int TILE_ID = 42;
 
     @Rule public final Expect expect = Expect.create();
 
     // This is a little nasty, but we need to ensure that the version is injected by
-    // TileProviderService. For that, we need the builder form (for DummyTileProviderService to
-    // return), and the protobuf form (to compare against, which also includes the version).
+    // TileService. For that, we need the builder form (for FakeTileProviderService to return),
+    // and the protobuf form (to compare against, which also includes the version).
     private static final TileBuilders.Tile DUMMY_TILE_TO_RETURN =
             new TileBuilders.Tile.Builder().setResourcesVersion("5").build();
     private static final Tile DUMMY_TILE_PROTOBUF =
             Tile.newBuilder().setResourcesVersion("5").setSchemaVersion(Version.CURRENT).build();
 
     private TileProvider mTileProviderServiceStub;
-    private ServiceController<DummyTileProviderService> mDummyTileProviderServiceServiceController;
+    private ServiceController<FakeTileService> mFakeTileServiceController;
 
     @Mock private TileCallback mMockTileCallback;
     @Mock private ResourcesCallback mMockResourcesCallback;
@@ -79,16 +79,16 @@
         mMockTileCallback = mock(TileCallback.class);
         mMockResourcesCallback = mock(ResourcesCallback.class);
 
-        mDummyTileProviderServiceServiceController =
-                Robolectric.buildService(DummyTileProviderService.class);
+        mFakeTileServiceController =
+                Robolectric.buildService(FakeTileService.class);
 
-        Intent i = new Intent(TileProviderService.ACTION_BIND_TILE_PROVIDER);
-        IBinder binder = mDummyTileProviderServiceServiceController.get().onBind(i);
+        Intent i = new Intent(TileService.ACTION_BIND_TILE_PROVIDER);
+        IBinder binder = mFakeTileServiceController.get().onBind(i);
         mTileProviderServiceStub = TileProvider.Stub.asInterface(binder);
     }
 
     @Test
-    public void tileProvider_tileRequest() throws Exception {
+    public void tileService_tileRequest() throws Exception {
         mTileProviderServiceStub.onTileRequest(
                 5,
                 new TileRequestData(
@@ -109,7 +109,7 @@
 
     @Ignore("Disabled due to b/179074319")
     @Test
-    public void tileProvider_resourcesRequest() throws Exception {
+    public void tileService_resourcesRequest() throws Exception {
         final String resourcesVersion = "HELLO WORLD";
 
         ResourcesRequestData resourcesRequestData =
@@ -135,49 +135,49 @@
     }
 
     @Test
-    public void tileProvider_onTileAdd() throws Exception {
+    public void tileService_onTileAdd() throws Exception {
         EventProto.TileAddEvent addRequest = EventProto.TileAddEvent.getDefaultInstance();
         mTileProviderServiceStub.onTileAddEvent(
                 new TileAddEventData(addRequest.toByteArray(), TileAddEventData.VERSION_PROTOBUF));
         shadowOf(Looper.getMainLooper()).idle();
 
-        expect.that(mDummyTileProviderServiceServiceController.get().mOnTileAddCalled).isTrue();
+        expect.that(mFakeTileServiceController.get().mOnTileAddCalled).isTrue();
     }
 
     @Test
-    public void tileProvider_onTileRemove() throws Exception {
+    public void tileService_onTileRemove() throws Exception {
         EventProto.TileRemoveEvent removeRequest = EventProto.TileRemoveEvent.getDefaultInstance();
         mTileProviderServiceStub.onTileRemoveEvent(
                 new TileRemoveEventData(
                         removeRequest.toByteArray(), TileRemoveEventData.VERSION_PROTOBUF));
         shadowOf(Looper.getMainLooper()).idle();
 
-        expect.that(mDummyTileProviderServiceServiceController.get().mOnTileRemoveCalled).isTrue();
+        expect.that(mFakeTileServiceController.get().mOnTileRemoveCalled).isTrue();
     }
 
     @Test
-    public void tileProvider_onTileEnter() throws Exception {
+    public void tileService_onTileEnter() throws Exception {
         EventProto.TileEnterEvent enterRequest = EventProto.TileEnterEvent.getDefaultInstance();
         mTileProviderServiceStub.onTileEnterEvent(
                 new TileEnterEventData(
                         enterRequest.toByteArray(), TileEnterEventData.VERSION_PROTOBUF));
         shadowOf(Looper.getMainLooper()).idle();
 
-        expect.that(mDummyTileProviderServiceServiceController.get().mOnTileEnterCalled).isTrue();
+        expect.that(mFakeTileServiceController.get().mOnTileEnterCalled).isTrue();
     }
 
     @Test
-    public void tileProvider_onTileLeave() throws Exception {
+    public void tileService_onTileLeave() throws Exception {
         EventProto.TileLeaveEvent leaveRequest = EventProto.TileLeaveEvent.getDefaultInstance();
         mTileProviderServiceStub.onTileLeaveEvent(
                 new TileLeaveEventData(
                         leaveRequest.toByteArray(), TileLeaveEventData.VERSION_PROTOBUF));
         shadowOf(Looper.getMainLooper()).idle();
 
-        expect.that(mDummyTileProviderServiceServiceController.get().mOnTileLeaveCalled).isTrue();
+        expect.that(mFakeTileServiceController.get().mOnTileLeaveCalled).isTrue();
     }
 
-    public static class DummyTileProviderService extends TileProviderService {
+    public static class FakeTileService extends TileService {
         boolean mOnTileAddCalled = false;
         boolean mOnTileRemoveCalled = false;
         boolean mOnTileEnterCalled = false;
