Internal change.

PiperOrigin-RevId: 284082730
Change-Id: I1c6f4d69da9f09cafffe5bf02e37d279f5dbb3be
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/BUILD b/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/BUILD
deleted file mode 100644
index 5d2cd68..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/BUILD
+++ /dev/null
@@ -1,14 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "knowncontent",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-        "//src/main/java/com/google/android/libraries/feed/common/logging",
-        "//src/main/proto/search/now/ui/stream:stream_java_proto_lite",
-        "@com_google_code_findbugs_jsr305//jar",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/ContentMetadata.java b/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/ContentMetadata.java
deleted file mode 100644
index 75bd4e3..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/ContentMetadata.java
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.client.knowncontent;
-
-import com.google.android.libraries.feed.common.logging.Logger;
-import com.google.search.now.ui.stream.StreamStructureProto.OfflineMetadata;
-import com.google.search.now.ui.stream.StreamStructureProto.RepresentationData;
-
-/** Metadata for content. */
-public final class ContentMetadata {
-
-  static final long UNKNOWN_TIME_PUBLISHED = -1L;
-
-  private static final String TAG = "ContentMetadata";
-
-  private final String url;
-  private final String title;
-  private final long timePublished;
-  /*@Nullable*/ private final String imageUrl;
-  /*@Nullable*/ private final String publisher;
-  /*@Nullable*/ private final String faviconUrl;
-  /*@Nullable*/ private final String snippet;
-
-  /*@Nullable*/
-  public static ContentMetadata maybeCreateContentMetadata(
-      OfflineMetadata offlineMetadata, RepresentationData representationData) {
-    if (!representationData.hasUri()) {
-      Logger.w(TAG, "Can't build ContentMetadata with no URL");
-      return null;
-    }
-
-    if (!offlineMetadata.hasTitle()) {
-      Logger.w(TAG, "Can't build ContentMetadata with no title");
-      return null;
-    }
-
-    String imageUrl = offlineMetadata.hasImageUrl() ? offlineMetadata.getImageUrl() : null;
-    String publisher = offlineMetadata.hasPublisher() ? offlineMetadata.getPublisher() : null;
-    String faviconUrl = offlineMetadata.hasFaviconUrl() ? offlineMetadata.getFaviconUrl() : null;
-    String snippet = offlineMetadata.hasSnippet() ? offlineMetadata.getSnippet() : null;
-    long publishedTimeSeconds =
-        representationData.hasPublishedTimeSeconds()
-            ? representationData.getPublishedTimeSeconds()
-            : UNKNOWN_TIME_PUBLISHED;
-
-    return new ContentMetadata(
-        representationData.getUri(),
-        offlineMetadata.getTitle(),
-        publishedTimeSeconds,
-        imageUrl,
-        publisher,
-        faviconUrl,
-        snippet);
-  }
-
-  public ContentMetadata(
-      String url,
-      String title,
-      long timePublished,
-      /*@Nullable*/ String imageUrl,
-      /*@Nullable*/ String publisher,
-      /*@Nullable*/ String faviconUrl,
-      /*@Nullable*/ String snippet) {
-    this.url = url;
-    this.title = title;
-    this.imageUrl = imageUrl;
-    this.publisher = publisher;
-    this.faviconUrl = faviconUrl;
-    this.snippet = snippet;
-    this.timePublished = timePublished;
-  }
-
-  public String getUrl() {
-    return url;
-  }
-
-  /** Title for the content. */
-  public String getTitle() {
-    return title;
-  }
-
-  /*@Nullable*/
-  public String getImageUrl() {
-    return imageUrl;
-  }
-
-  /** {@link String} representation of the publisher. */
-  /*@Nullable*/
-  public String getPublisher() {
-    return publisher;
-  }
-
-  /**
-   * Seconds of UTC time since the Unix Epoch 1970-01-01 T00:00:00Z or {@code
-   * UNKNOWN_TIME_PUBLISHED} if unknown.
-   */
-  public long getTimePublished() {
-    return timePublished;
-  }
-
-  /*@Nullable*/
-  public String getFaviconUrl() {
-    return faviconUrl;
-  }
-
-  /** A {@link String} that can be displayed that is part of the content, typically the start. */
-  /*@Nullable*/
-  public String getSnippet() {
-    return snippet;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/ContentRemoval.java b/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/ContentRemoval.java
deleted file mode 100644
index 6158570..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/ContentRemoval.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.client.knowncontent;
-
-/** Information on the removal of a piece of content. */
-public final class ContentRemoval {
-
-  private final String url;
-  private final boolean requestedByUser;
-
-  public ContentRemoval(String url, boolean requestedByUser) {
-    this.url = url;
-    this.requestedByUser = requestedByUser;
-  }
-
-  /** Url for removed content. */
-  public String getUrl() {
-    return url;
-  }
-
-  /** Whether the removal was performed through an action of the user. */
-  public boolean isRequestedByUser() {
-    return requestedByUser;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/KnownContent.java b/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/KnownContent.java
deleted file mode 100644
index 8f9c866..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/KnownContent.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.client.knowncontent;
-
-import com.google.android.libraries.feed.common.functional.Consumer;
-import java.util.List;
-
-/** Allows the host to request and subscribe to information about the Feed's content. */
-public interface KnownContent {
-  /**
-   * Async call to get the list of all content that is known about by the Feed. The list will be in
-   * the same order that the content will appear.
-   *
-   * <p>Note: This method can be expensive. As such it should not be called at latency critical
-   * moments, namely during startup.
-   */
-  void getKnownContent(Consumer<List<ContentMetadata>> knownContentConsumer);
-
-  /** Adds listener for new content. */
-  void addListener(Listener listener);
-
-  /** Removes listener for new content. */
-  void removeListener(Listener listener);
-
-  /** Listener for when content is added or removed. */
-  interface Listener {
-    /**
-     * Called when content is removed.
-     *
-     * @param contentRemoved {@link List} of removed content.
-     */
-    void onContentRemoved(List<ContentRemoval> contentRemoved);
-
-    /**
-     * Notifies host that new content has been received.
-     *
-     * @param isNewRefresh {@code true} if the content is from a new refresh, {@code false}
-     *     otherwise, such as from a pagination request.
-     * @param contentCreationDateTimeMs the date/time of when the content was added in milliseconds.
-     */
-    void onNewContentReceived(boolean isNewRefresh, long contentCreationDateTimeMs);
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/lifecycle/AppLifecycleListener.java b/src/main/java/com/google/android/libraries/feed/api/client/lifecycle/AppLifecycleListener.java
deleted file mode 100644
index 2a95330..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/lifecycle/AppLifecycleListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.client.lifecycle;
-
-/**
- * Interface to allow host applications to communicate changes in state to Feed.
- *
- * <p>Note that these are related to app lifecycle, not UI lifecycle
- */
-public interface AppLifecycleListener {
-  /** Called after critical loading has completed but before Feed is rendered. */
-  void onEnterForeground();
-
-  /** Called when the app is backgrounded, will perform clean up. */
-  void onEnterBackground();
-
-  /**
-   * Called when host wants to clear all data. Will delete content without changing opt-in / opt-out
-   * status.
-   */
-  void onClearAll();
-
-  /** Called to clear all data then initiate a refresh. */
-  void onClearAllWithRefresh();
-
-  /**
-   * Called when the host wants the Feed to perform any heavyweight initialization it might need to
-   * do. This is the only trigger for the initialization process; if it’s not called, the host
-   * should not expect the Feed to be able to render cards.
-   */
-  void initialize();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/lifecycle/BUILD b/src/main/java/com/google/android/libraries/feed/api/client/lifecycle/BUILD
deleted file mode 100644
index 7f9dd6f..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/lifecycle/BUILD
+++ /dev/null
@@ -1,8 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "lifecycle",
-    srcs = glob(["*.java"]),
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/requestmanager/BUILD b/src/main/java/com/google/android/libraries/feed/api/client/requestmanager/BUILD
deleted file mode 100644
index 87f5408..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/requestmanager/BUILD
+++ /dev/null
@@ -1,10 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "requestmanager",
-    srcs = glob(["*.java"]),
-    deps = [
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/requestmanager/RequestManager.java b/src/main/java/com/google/android/libraries/feed/api/client/requestmanager/RequestManager.java
deleted file mode 100644
index 8868ca2..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/requestmanager/RequestManager.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.client.requestmanager;
-
-/** Creates and issues requests to the server. */
-public interface RequestManager {
-
-  /** Issues a request to refresh the entire feed. */
-  void triggerScheduledRefresh();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/scope/BUILD b/src/main/java/com/google/android/libraries/feed/api/client/scope/BUILD
deleted file mode 100644
index c22b070..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/scope/BUILD
+++ /dev/null
@@ -1,103 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "processscope",
-    srcs = ["ProcessScope.java"],
-    deps = [
-        ":streamscopebuilder",
-        "//src/main/java/com/google/android/libraries/feed/api/client/knowncontent",
-        "//src/main/java/com/google/android/libraries/feed/api/client/lifecycle",
-        "//src/main/java/com/google/android/libraries/feed/api/client/requestmanager",
-        "//src/main/java/com/google/android/libraries/feed/api/host/action",
-        "//src/main/java/com/google/android/libraries/feed/api/host/imageloader",
-        "//src/main/java/com/google/android/libraries/feed/api/host/offlineindicator",
-        "//src/main/java/com/google/android/libraries/feed/api/host/stream",
-        "//src/main/java/com/google/android/libraries/feed/basicstream",
-        "//src/main/java/com/google/android/libraries/feed/common/concurrent",
-        "//src/main/java/com/google/android/libraries/feed/common/logging",
-    ],
-)
-
-android_library(
-    name = "processscopebuilder",
-    srcs = ["ProcessScopeBuilder.java"],
-    deps = [
-        ":processscope",
-        "//src/main/java/com/google/android/libraries/feed/api/host/config",
-        "//src/main/java/com/google/android/libraries/feed/api/host/logging",
-        "//src/main/java/com/google/android/libraries/feed/api/host/network",
-        "//src/main/java/com/google/android/libraries/feed/api/host/proto",
-        "//src/main/java/com/google/android/libraries/feed/api/host/scheduler",
-        "//src/main/java/com/google/android/libraries/feed/api/host/storage",
-        "//src/main/java/com/google/android/libraries/feed/api/host/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/actionmanager",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/common",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/knowncontent",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/protocoladapter",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/requestmanager",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/scope",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/scope:feedprocessscope",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/sessionmanager",
-        "//src/main/java/com/google/android/libraries/feed/basicstream",
-        "//src/main/java/com/google/android/libraries/feed/common",
-        "//src/main/java/com/google/android/libraries/feed/common/concurrent",
-        "//src/main/java/com/google/android/libraries/feed/common/protoextensions",
-        "//src/main/java/com/google/android/libraries/feed/common/time",
-        "//src/main/java/com/google/android/libraries/feed/feedactionmanager",
-        "//src/main/java/com/google/android/libraries/feed/feedactionreader",
-        "//src/main/java/com/google/android/libraries/feed/feedapplifecyclelistener",
-        "//src/main/java/com/google/android/libraries/feed/feedknowncontent",
-        "//src/main/java/com/google/android/libraries/feed/feedprotocoladapter",
-        "//src/main/java/com/google/android/libraries/feed/feedrequestmanager",
-        "//src/main/java/com/google/android/libraries/feed/feedsessionmanager",
-        "//src/main/java/com/google/android/libraries/feed/feedstore",
-        "//src/main/java/com/google/android/libraries/feed/hostimpl/network",
-        "//src/main/java/com/google/android/libraries/feed/hostimpl/scheduler",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/piet",
-        "@com_google_code_findbugs_jsr305//jar",
-        "@maven//:com_android_support_support_annotations",
-    ],
-)
-
-android_library(
-    name = "streamscope",
-    srcs = ["StreamScope.java"],
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/client/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/modelprovider",
-    ],
-)
-
-android_library(
-    name = "streamscopebuilder",
-    srcs = ["StreamScopeBuilder.java"],
-    deps = [
-        ":streamscope",
-        "//src/main/java/com/google/android/libraries/feed/api/client/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/host/action",
-        "//src/main/java/com/google/android/libraries/feed/api/host/config",
-        "//src/main/java/com/google/android/libraries/feed/api/host/imageloader",
-        "//src/main/java/com/google/android/libraries/feed/api/host/logging",
-        "//src/main/java/com/google/android/libraries/feed/api/host/offlineindicator",
-        "//src/main/java/com/google/android/libraries/feed/api/host/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/actionmanager",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/actionparser",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/common",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/knowncontent",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/modelprovider",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/protocoladapter",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/scope:feedstreamscope",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/sessionmanager",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/stream",
-        "//src/main/java/com/google/android/libraries/feed/common",
-        "//src/main/java/com/google/android/libraries/feed/common/concurrent",
-        "//src/main/java/com/google/android/libraries/feed/common/protoextensions",
-        "//src/main/java/com/google/android/libraries/feed/common/time",
-        "//src/main/java/com/google/android/libraries/feed/feedactionparser",
-        "//src/main/java/com/google/android/libraries/feed/feedmodelprovider",
-        "//src/main/java/com/google/android/libraries/feed/piet/host",
-        "@com_google_code_findbugs_jsr305//jar",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/scope/ProcessScope.java b/src/main/java/com/google/android/libraries/feed/api/client/scope/ProcessScope.java
deleted file mode 100644
index 5043c0a..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/scope/ProcessScope.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.client.scope;
-
-import android.content.Context;
-import com.google.android.libraries.feed.api.client.knowncontent.KnownContent;
-import com.google.android.libraries.feed.api.client.lifecycle.AppLifecycleListener;
-import com.google.android.libraries.feed.api.client.requestmanager.RequestManager;
-import com.google.android.libraries.feed.api.host.action.ActionApi;
-import com.google.android.libraries.feed.api.host.imageloader.ImageLoaderApi;
-import com.google.android.libraries.feed.api.host.offlineindicator.OfflineIndicatorApi;
-import com.google.android.libraries.feed.api.host.stream.CardConfiguration;
-import com.google.android.libraries.feed.api.host.stream.SnackbarApi;
-import com.google.android.libraries.feed.api.host.stream.StreamConfiguration;
-import com.google.android.libraries.feed.api.host.stream.TooltipApi;
-import com.google.android.libraries.feed.common.concurrent.TaskQueue;
-import com.google.android.libraries.feed.common.logging.Dumpable;
-
-/** Allows interaction with the Feed library at the process leve. */
-public interface ProcessScope extends Dumpable {
-
-  /** Returns the Feed library request manager. */
-  RequestManager getRequestManager();
-
-  /** Returns the Feed library task queue. */
-  TaskQueue getTaskQueue();
-
-  /** Returns the Feed library lifecycle listener. */
-  AppLifecycleListener getAppLifecycleListener();
-
-  /** Returns the Feed library known content. */
-  KnownContent getKnownContent();
-
-  /** Returns a {@link StreamScopeBuilder.Builder}. */
-  StreamScopeBuilder createStreamScopeBuilder(
-      Context context,
-      ImageLoaderApi imageLoaderApi,
-      ActionApi actionApi,
-      StreamConfiguration streamConfiguration,
-      CardConfiguration cardConfiguration,
-      SnackbarApi snackbarApi,
-      OfflineIndicatorApi offlineIndicatorApi,
-      TooltipApi tooltipApi);
-
-  /** Called to destroy the scope object. */
-  void onDestroy();
-}
-
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/scope/ProcessScopeBuilder.java b/src/main/java/com/google/android/libraries/feed/api/client/scope/ProcessScopeBuilder.java
deleted file mode 100644
index 8bc9dad..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/scope/ProcessScopeBuilder.java
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.client.scope;
-
-import android.content.Context;
-import android.support.annotation.VisibleForTesting;
-import com.google.android.libraries.feed.api.host.config.ApplicationInfo;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.config.Configuration.ConfigKey;
-import com.google.android.libraries.feed.api.host.config.DebugBehavior;
-import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
-import com.google.android.libraries.feed.api.host.network.NetworkClient;
-import com.google.android.libraries.feed.api.host.proto.ProtoExtensionProvider;
-import com.google.android.libraries.feed.api.host.scheduler.SchedulerApi;
-import com.google.android.libraries.feed.api.host.storage.ContentStorage;
-import com.google.android.libraries.feed.api.host.storage.ContentStorageDirect;
-import com.google.android.libraries.feed.api.host.storage.JournalStorage;
-import com.google.android.libraries.feed.api.host.storage.JournalStorageDirect;
-import com.google.android.libraries.feed.api.host.stream.TooltipSupportedApi;
-import com.google.android.libraries.feed.api.internal.actionmanager.ActionManager;
-import com.google.android.libraries.feed.api.internal.actionmanager.ActionReader;
-import com.google.android.libraries.feed.api.internal.common.ThreadUtils;
-import com.google.android.libraries.feed.api.internal.knowncontent.FeedKnownContent;
-import com.google.android.libraries.feed.api.internal.protocoladapter.ProtocolAdapter;
-import com.google.android.libraries.feed.api.internal.requestmanager.ActionUploadRequestManager;
-import com.google.android.libraries.feed.api.internal.requestmanager.FeedRequestManager;
-import com.google.android.libraries.feed.api.internal.scope.ClearAllListener;
-import com.google.android.libraries.feed.api.internal.scope.FeedProcessScope;
-import com.google.android.libraries.feed.api.internal.sessionmanager.FeedSessionManager;
-import com.google.android.libraries.feed.common.Validators;
-import com.google.android.libraries.feed.common.concurrent.DirectHostSupported;
-import com.google.android.libraries.feed.common.concurrent.MainThreadRunner;
-import com.google.android.libraries.feed.common.concurrent.TaskQueue;
-import com.google.android.libraries.feed.common.protoextensions.FeedExtensionRegistry;
-import com.google.android.libraries.feed.common.time.Clock;
-import com.google.android.libraries.feed.common.time.SystemClockImpl;
-import com.google.android.libraries.feed.common.time.TimingUtils;
-import com.google.android.libraries.feed.feedactionmanager.FeedActionManagerImpl;
-import com.google.android.libraries.feed.feedactionreader.FeedActionReader;
-import com.google.android.libraries.feed.feedapplifecyclelistener.FeedAppLifecycleListener;
-import com.google.android.libraries.feed.feedknowncontent.FeedKnownContentImpl;
-import com.google.android.libraries.feed.feedprotocoladapter.FeedProtocolAdapter;
-import com.google.android.libraries.feed.feedrequestmanager.FeedActionUploadRequestManager;
-import com.google.android.libraries.feed.feedrequestmanager.FeedRequestManagerImpl;
-import com.google.android.libraries.feed.feedrequestmanager.RequestManagerImpl;
-import com.google.android.libraries.feed.feedsessionmanager.FeedSessionManagerFactory;
-import com.google.android.libraries.feed.feedstore.ContentStorageDirectImpl;
-import com.google.android.libraries.feed.feedstore.FeedStore;
-import com.google.android.libraries.feed.feedstore.JournalStorageDirectImpl;
-import com.google.android.libraries.feed.hostimpl.network.NetworkClientWrapper;
-import com.google.android.libraries.feed.hostimpl.scheduler.SchedulerApiWrapper;
-import com.google.android.libraries.feed.sharedstream.piet.PietRequiredContentAdapter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.concurrent.Executor;
-
-/** Creates an instance of {@link ProcessScope} */
-public final class ProcessScopeBuilder {
-  // Required fields.
-  private final Configuration configuration;
-  private final Executor sequencedExecutor;
-  private final BasicLoggingApi basicLoggingApi;
-  private final TooltipSupportedApi tooltipSupportedApi;
-  private final NetworkClient unwrappedNetworkClient;
-  private final SchedulerApi unwrappedSchedulerApi;
-  private final DebugBehavior debugBehavior;
-  private final Context context;
-  private final ApplicationInfo applicationInfo;
-
-  // Optional fields - if they are not provided, we will use default implementations.
-  /*@MonotonicNonNull*/ private ProtoExtensionProvider protoExtensionProvider = null;
-  /*@MonotonicNonNull*/ private Clock clock;
-
-  // Either contentStorage or rawContentStorage must be provided.
-  /*@MonotonicNonNull*/ ContentStorageDirect contentStorage = null;
-  /*@MonotonicNonNull*/ private ContentStorage rawContentStorage = null;
-
-  // Either journalStorage or rawJournalStorage must be provided.
-  /*@MonotonicNonNull*/ JournalStorageDirect journalStorage = null;
-  /*@MonotonicNonNull*/ private JournalStorage rawJournalStorage = null;
-
-  /** The APIs are all required to construct the scope. */
-  public ProcessScopeBuilder(
-      Configuration configuration,
-      Executor sequencedExecutor,
-      BasicLoggingApi basicLoggingApi,
-      NetworkClient networkClient,
-      SchedulerApi schedulerApi,
-      DebugBehavior debugBehavior,
-      Context context,
-      ApplicationInfo applicationInfo,
-      TooltipSupportedApi tooltipSupportedApi) {
-    this.configuration = configuration;
-    this.sequencedExecutor = sequencedExecutor;
-    this.basicLoggingApi = basicLoggingApi;
-    this.debugBehavior = debugBehavior;
-    this.context = context;
-    this.applicationInfo = applicationInfo;
-    this.unwrappedNetworkClient = networkClient;
-    this.unwrappedSchedulerApi = schedulerApi;
-    this.tooltipSupportedApi = tooltipSupportedApi;
-  }
-
-  public ProcessScopeBuilder setProtoExtensionProvider(
-      ProtoExtensionProvider protoExtensionProvider) {
-    this.protoExtensionProvider = protoExtensionProvider;
-    return this;
-  }
-
-  public ProcessScopeBuilder setContentStorage(ContentStorage contentStorage) {
-    rawContentStorage = contentStorage;
-    return this;
-  }
-
-  public ProcessScopeBuilder setContentStorageDirect(ContentStorageDirect contentStorage) {
-    this.contentStorage = contentStorage;
-    return this;
-  }
-
-  public ProcessScopeBuilder setJournalStorage(JournalStorage journalStorage) {
-    rawJournalStorage = journalStorage;
-    return this;
-  }
-
-  public ProcessScopeBuilder setJournalStorageDirect(JournalStorageDirect journalStorage) {
-    this.journalStorage = journalStorage;
-    return this;
-  }
-
-  @VisibleForTesting
-  ContentStorageDirect buildContentStorage(MainThreadRunner mainThreadRunner) {
-    if (contentStorage == null) {
-      boolean useDirect = configuration.getValueOrDefault(ConfigKey.USE_DIRECT_STORAGE, false);
-      if (useDirect
-          && rawContentStorage != null
-          && rawContentStorage instanceof ContentStorageDirect) {
-        contentStorage = (ContentStorageDirect) rawContentStorage;
-      } else if (rawContentStorage != null) {
-        contentStorage = new ContentStorageDirectImpl(rawContentStorage, mainThreadRunner);
-      } else {
-        throw new IllegalStateException(
-            "one of ContentStorage, ContentStorageDirect must be provided");
-      }
-    }
-    return contentStorage;
-  }
-
-  @VisibleForTesting
-  JournalStorageDirect buildJournalStorage(MainThreadRunner mainThreadRunner) {
-    if (journalStorage == null) {
-      boolean useDirect = configuration.getValueOrDefault(ConfigKey.USE_DIRECT_STORAGE, false);
-      if (useDirect
-          && rawJournalStorage != null
-          && rawJournalStorage instanceof JournalStorageDirect) {
-        journalStorage = (JournalStorageDirect) rawJournalStorage;
-      } else if (rawJournalStorage != null) {
-        journalStorage = new JournalStorageDirectImpl(rawJournalStorage, mainThreadRunner);
-      } else {
-        throw new IllegalStateException(
-            "one of JournalStorage, JournalStorageDirect must be provided");
-      }
-    }
-    return journalStorage;
-  }
-
-  public ProcessScope build() {
-    MainThreadRunner mainThreadRunner = new MainThreadRunner();
-    contentStorage = buildContentStorage(mainThreadRunner);
-    journalStorage = buildJournalStorage(mainThreadRunner);
-
-    ThreadUtils threadUtils = new ThreadUtils();
-
-    boolean directHostCallEnabled =
-        configuration.getValueOrDefault(ConfigKey.USE_DIRECT_STORAGE, false);
-    NetworkClient networkClient;
-    SchedulerApi schedulerApi;
-    if (unwrappedNetworkClient instanceof DirectHostSupported && directHostCallEnabled) {
-      networkClient = unwrappedNetworkClient;
-    } else {
-      networkClient =
-          new NetworkClientWrapper(unwrappedNetworkClient, threadUtils, mainThreadRunner);
-    }
-    if (unwrappedSchedulerApi instanceof DirectHostSupported && directHostCallEnabled) {
-      schedulerApi = unwrappedSchedulerApi;
-    } else {
-      schedulerApi = new SchedulerApiWrapper(unwrappedSchedulerApi, threadUtils, mainThreadRunner);
-    }
-
-    // Build default component instances if necessary.
-    if (protoExtensionProvider == null) {
-      // Return an empty list of extensions by default.
-      protoExtensionProvider = ArrayList::new;
-    }
-    FeedExtensionRegistry extensionRegistry = new FeedExtensionRegistry(protoExtensionProvider);
-    if (clock == null) {
-      clock = new SystemClockImpl();
-    }
-    TimingUtils timingUtils = new TimingUtils();
-    TaskQueue taskQueue =
-        new TaskQueue(basicLoggingApi, sequencedExecutor, mainThreadRunner, clock);
-    FeedStore store =
-        new FeedStore(
-            configuration,
-            timingUtils,
-            extensionRegistry,
-            contentStorage,
-            journalStorage,
-            threadUtils,
-            taskQueue,
-            clock,
-            basicLoggingApi,
-            mainThreadRunner);
-
-    FeedAppLifecycleListener lifecycleListener = new FeedAppLifecycleListener(threadUtils);
-    lifecycleListener.registerObserver(store);
-
-    ProtocolAdapter protocolAdapter =
-        new FeedProtocolAdapter(
-            Collections.singletonList(new PietRequiredContentAdapter()), timingUtils);
-    ActionReader actionReader =
-        new FeedActionReader(store, clock, protocolAdapter, taskQueue, configuration);
-    FeedRequestManager feedRequestManager =
-        new FeedRequestManagerImpl(
-            configuration,
-            networkClient,
-            protocolAdapter,
-            extensionRegistry,
-            schedulerApi,
-            taskQueue,
-            timingUtils,
-            threadUtils,
-            actionReader,
-            context,
-            applicationInfo,
-            mainThreadRunner,
-            basicLoggingApi,
-            tooltipSupportedApi);
-    ActionUploadRequestManager actionUploadRequestManager =
-        new FeedActionUploadRequestManager(
-            configuration,
-            networkClient,
-            protocolAdapter,
-            extensionRegistry,
-            taskQueue,
-            threadUtils,
-            store,
-            clock);
-    FeedSessionManagerFactory fsmFactory =
-        new FeedSessionManagerFactory(
-            taskQueue,
-            store,
-            timingUtils,
-            threadUtils,
-            protocolAdapter,
-            feedRequestManager,
-            actionUploadRequestManager,
-            schedulerApi,
-            configuration,
-            clock,
-            lifecycleListener,
-            mainThreadRunner,
-            basicLoggingApi);
-    FeedSessionManager feedSessionManager = fsmFactory.create();
-    RequestManagerImpl clientRequestManager =
-        new RequestManagerImpl(feedRequestManager, feedSessionManager);
-    ActionManager actionManager =
-        new FeedActionManagerImpl(
-            feedSessionManager, store, threadUtils, taskQueue, mainThreadRunner, clock);
-
-    FeedKnownContent feedKnownContent =
-        new FeedKnownContentImpl(feedSessionManager, mainThreadRunner, threadUtils);
-
-    ClearAllListener clearAllListener =
-        new ClearAllListener(taskQueue, feedSessionManager, store, threadUtils, lifecycleListener);
-    return new FeedProcessScope(
-        basicLoggingApi,
-        networkClient,
-        Validators.checkNotNull(protocolAdapter),
-        Validators.checkNotNull(clientRequestManager),
-        Validators.checkNotNull(feedSessionManager),
-        store,
-        timingUtils,
-        threadUtils,
-        taskQueue,
-        mainThreadRunner,
-        lifecycleListener,
-        clock,
-        debugBehavior,
-        actionManager,
-        configuration,
-        feedKnownContent,
-        extensionRegistry,
-        clearAllListener,
-        tooltipSupportedApi,
-        applicationInfo);
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/scope/StreamScope.java b/src/main/java/com/google/android/libraries/feed/api/client/scope/StreamScope.java
deleted file mode 100644
index a297577..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/scope/StreamScope.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.client.scope;
-
-import com.google.android.libraries.feed.api.client.stream.Stream;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProviderFactory;
-
-/** Allows interacting with the Feed library on a per-stream level */
-public interface StreamScope {
-
-  /** Returns the current {@link Stream}. */
-  Stream getStream();
-
-  /** Returns the current {@link ModelProviderFactory}. */
-  ModelProviderFactory getModelProviderFactory();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/scope/StreamScopeBuilder.java b/src/main/java/com/google/android/libraries/feed/api/client/scope/StreamScopeBuilder.java
deleted file mode 100644
index 18f8496..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/scope/StreamScopeBuilder.java
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.client.scope;
-
-import android.content.Context;
-import com.google.android.libraries.feed.api.client.stream.Stream;
-import com.google.android.libraries.feed.api.host.action.ActionApi;
-import com.google.android.libraries.feed.api.host.config.ApplicationInfo;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.config.DebugBehavior;
-import com.google.android.libraries.feed.api.host.imageloader.ImageLoaderApi;
-import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
-import com.google.android.libraries.feed.api.host.offlineindicator.OfflineIndicatorApi;
-import com.google.android.libraries.feed.api.host.stream.CardConfiguration;
-import com.google.android.libraries.feed.api.host.stream.SnackbarApi;
-import com.google.android.libraries.feed.api.host.stream.StreamConfiguration;
-import com.google.android.libraries.feed.api.host.stream.TooltipApi;
-import com.google.android.libraries.feed.api.host.stream.TooltipSupportedApi;
-import com.google.android.libraries.feed.api.internal.actionmanager.ActionManager;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionParserFactory;
-import com.google.android.libraries.feed.api.internal.common.ThreadUtils;
-import com.google.android.libraries.feed.api.internal.knowncontent.FeedKnownContent;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProviderFactory;
-import com.google.android.libraries.feed.api.internal.protocoladapter.ProtocolAdapter;
-import com.google.android.libraries.feed.api.internal.scope.FeedStreamScope;
-import com.google.android.libraries.feed.api.internal.sessionmanager.FeedSessionManager;
-import com.google.android.libraries.feed.api.internal.stream.BasicStreamFactory;
-import com.google.android.libraries.feed.api.internal.stream.StreamFactory;
-import com.google.android.libraries.feed.common.Validators;
-import com.google.android.libraries.feed.common.concurrent.MainThreadRunner;
-import com.google.android.libraries.feed.common.concurrent.TaskQueue;
-import com.google.android.libraries.feed.common.protoextensions.FeedExtensionRegistry;
-import com.google.android.libraries.feed.common.time.Clock;
-import com.google.android.libraries.feed.common.time.TimingUtils;
-import com.google.android.libraries.feed.feedactionparser.FeedActionParserFactory;
-import com.google.android.libraries.feed.feedmodelprovider.FeedModelProviderFactory;
-import com.google.android.libraries.feed.piet.host.CustomElementProvider;
-import com.google.android.libraries.feed.piet.host.HostBindingProvider;
-import com.google.android.libraries.feed.piet.host.ThrowingCustomElementProvider;
-
-/** A builder that creates a {@link StreamScope}. */
-public final class StreamScopeBuilder {
-
-  // Required external dependencies.
-  private final Context context;
-  private final ActionApi actionApi;
-  private final ImageLoaderApi imageLoaderApi;
-
-  private final ProtocolAdapter protocolAdapter;
-  private final FeedSessionManager feedSessionManager;
-  private final ThreadUtils threadUtils;
-  private final TimingUtils timingUtils;
-  private final TaskQueue taskQueue;
-  private final MainThreadRunner mainThreadRunner;
-  private final Clock clock;
-  private final ActionManager actionManager;
-  private final CardConfiguration cardConfiguration;
-  private final StreamConfiguration streamConfiguration;
-  private final DebugBehavior debugBehavior;
-  private final Configuration config;
-  private final SnackbarApi snackbarApi;
-  private final BasicLoggingApi basicLoggingApi;
-  private final OfflineIndicatorApi offlineIndicatorApi;
-  private final FeedKnownContent feedKnownContent;
-  private final TooltipApi tooltipApi;
-  private final ApplicationInfo applicationInfo;
-  private final FeedExtensionRegistry feedExtensionRegistry;
-  private boolean isBackgroundDark;
-
-  // Optional internal components to override the default implementations.
-  /*@MonotonicNonNull*/ private ActionParserFactory actionParserFactory;
-  /*@MonotonicNonNull*/ private ModelProviderFactory modelProviderFactory;
-  /*@MonotonicNonNull*/ private Stream stream;
-  /*@MonotonicNonNull*/ private StreamFactory streamFactory;
-  /*@MonotonicNonNull*/ private CustomElementProvider customElementProvider;
-  /*@MonotonicNonNull*/ private HostBindingProvider hostBindingProvider;
-
-  /** Construct this builder using {@link ProcessScope#createStreamScopeBuilder} */
-  public StreamScopeBuilder(
-      Context context,
-      ActionApi actionApi,
-      ImageLoaderApi imageLoaderApi,
-      ProtocolAdapter protocolAdapter,
-      FeedSessionManager feedSessionManager,
-      ThreadUtils threadUtils,
-      TimingUtils timingUtils,
-      TaskQueue taskQueue,
-      MainThreadRunner mainThreadRunner,
-      Clock clock,
-      DebugBehavior debugBehavior,
-      StreamConfiguration streamConfiguration,
-      CardConfiguration cardConfiguration,
-      ActionManager actionManager,
-      Configuration config,
-      SnackbarApi snackbarApi,
-      BasicLoggingApi basicLoggingApi,
-      OfflineIndicatorApi offlineIndicatorApi,
-      FeedKnownContent feedKnownContent,
-      TooltipApi tooltipApi,
-      TooltipSupportedApi tooltipSupportedApi,
-      ApplicationInfo applicationInfo,
-      FeedExtensionRegistry feedExtensionRegistry) {
-    this.context = context;
-    this.actionApi = actionApi;
-    this.imageLoaderApi = imageLoaderApi;
-    this.protocolAdapter = protocolAdapter;
-    this.feedSessionManager = feedSessionManager;
-    this.threadUtils = threadUtils;
-    this.timingUtils = timingUtils;
-    this.taskQueue = taskQueue;
-    this.mainThreadRunner = mainThreadRunner;
-    this.streamConfiguration = streamConfiguration;
-    this.cardConfiguration = cardConfiguration;
-    this.clock = clock;
-    this.debugBehavior = debugBehavior;
-    this.actionManager = actionManager;
-    this.config = config;
-    this.snackbarApi = snackbarApi;
-    this.basicLoggingApi = basicLoggingApi;
-    this.offlineIndicatorApi = offlineIndicatorApi;
-    this.feedKnownContent = feedKnownContent;
-    this.tooltipApi = tooltipApi;
-    this.applicationInfo = applicationInfo;
-    this.feedExtensionRegistry = feedExtensionRegistry;
-  }
-
-  public StreamScopeBuilder setIsBackgroundDark(boolean isBackgroundDark) {
-    this.isBackgroundDark = isBackgroundDark;
-    return this;
-  }
-
-  public StreamScopeBuilder setStreamFactory(StreamFactory streamFactory) {
-    this.streamFactory = streamFactory;
-    return this;
-  }
-
-  public StreamScopeBuilder setModelProviderFactory(ModelProviderFactory modelProviderFactory) {
-    this.modelProviderFactory = modelProviderFactory;
-    return this;
-  }
-
-  public StreamScopeBuilder setCustomElementProvider(CustomElementProvider customElementProvider) {
-    this.customElementProvider = customElementProvider;
-    return this;
-  }
-
-  public StreamScopeBuilder setHostBindingProvider(HostBindingProvider hostBindingProvider) {
-    this.hostBindingProvider = hostBindingProvider;
-    return this;
-  }
-
-  public StreamScope build() {
-    if (modelProviderFactory == null) {
-      modelProviderFactory =
-          new FeedModelProviderFactory(
-              feedSessionManager,
-              threadUtils,
-              timingUtils,
-              taskQueue,
-              mainThreadRunner,
-              config,
-              basicLoggingApi);
-    }
-    if (actionParserFactory == null) {
-      actionParserFactory = new FeedActionParserFactory(protocolAdapter, basicLoggingApi);
-    }
-    if (customElementProvider == null) {
-      customElementProvider = new ThrowingCustomElementProvider();
-    }
-    if (hostBindingProvider == null) {
-      hostBindingProvider = new HostBindingProvider();
-    }
-    if (streamFactory == null) {
-      streamFactory = new BasicStreamFactory();
-    }
-    stream =
-        streamFactory.build(
-            Validators.checkNotNull(actionParserFactory),
-            context,
-            applicationInfo.getBuildType(),
-            cardConfiguration,
-            imageLoaderApi,
-            Validators.checkNotNull(customElementProvider),
-            debugBehavior,
-            clock,
-            Validators.checkNotNull(modelProviderFactory),
-            Validators.checkNotNull(hostBindingProvider),
-            offlineIndicatorApi,
-            config,
-            actionApi,
-            actionManager,
-            snackbarApi,
-            streamConfiguration,
-            feedExtensionRegistry,
-            basicLoggingApi,
-            mainThreadRunner,
-            isBackgroundDark,
-            tooltipApi,
-            threadUtils,
-            feedKnownContent);
-    return new FeedStreamScope(
-        Validators.checkNotNull(stream), Validators.checkNotNull(modelProviderFactory));
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/stream/BUILD b/src/main/java/com/google/android/libraries/feed/api/client/stream/BUILD
deleted file mode 100644
index 8106bc8..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/stream/BUILD
+++ /dev/null
@@ -1,12 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "stream",
-    srcs = glob(["*.java"]),
-    deps = [
-        "@com_google_code_findbugs_jsr305//jar",
-        "@maven//:com_android_support_support_annotations",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/stream/Header.java b/src/main/java/com/google/android/libraries/feed/api/client/stream/Header.java
deleted file mode 100644
index 7d0e260..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/stream/Header.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.client.stream;
-
-import android.view.View;
-
-/** Interface users can implement to define a header to display above Stream content. */
-public interface Header {
-
-  /** Returns the view representing the header. */
-  View getView();
-
-  /** Returns true if the header can be dismissed. */
-  boolean isDismissible();
-
-  /** Called when the header has been dismissed. */
-  void onDismissed();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/stream/NonDismissibleHeader.java b/src/main/java/com/google/android/libraries/feed/api/client/stream/NonDismissibleHeader.java
deleted file mode 100644
index 4feb73d..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/stream/NonDismissibleHeader.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.client.stream;
-
-import android.view.View;
-
-/**
- * Class providing a default implementation for {@link Header} instances that are not dismissible.
- */
-public class NonDismissibleHeader implements Header {
-
-  private final View view;
-
-  public NonDismissibleHeader(View view) {
-    this.view = view;
-  }
-
-  @Override
-  public View getView() {
-    return view;
-  }
-
-  @Override
-  public boolean isDismissible() {
-    return false;
-  }
-
-  @Override
-  public void onDismissed() {}
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/client/stream/Stream.java b/src/main/java/com/google/android/libraries/feed/api/client/stream/Stream.java
deleted file mode 100644
index f72d9f1..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/client/stream/Stream.java
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.client.stream;
-
-import android.os.Bundle;
-import android.support.annotation.IntDef;
-import android.view.View;
-import java.util.List;
-
-/** Interface used for interacting with the Stream library in order to render a stream of cards. */
-public interface Stream {
-  /** Constant used to notify host that a view's position on screen is not known. */
-  int POSITION_NOT_KNOWN = Integer.MIN_VALUE;
-
-  /**
-   * Called when the Stream is being created. This method should only be called once. {@code
-   * savedInstanceState} should be a previous bundle returned from {@link #getSavedInstanceState()}.
-   * The Stream will restore from this bundle as it starts up. This maps similarly to {@link
-   * android.app.Activity#onCreate(Bundle)}.
-   *
-   * @param savedInstanceState state to restore to.
-   * @throws IllegalStateException if method is called multiple times.
-   */
-  void onCreate(/*@Nullable*/ Bundle savedInstanceState);
-
-  /**
-   * Called when the Stream is being created. This method functions identically to {@link
-   * #onCreate(Bundle)} but allows a host to provide a String instead of a Bundle. This method
-   * should only be called once. If this method is used, {@link #onCreate(Bundle)} should not be
-   * used. {@code savedInstanceState} should be a previous string returned from {@link
-   * #getSavedInstanceStateString()}.
-   *
-   * @param savedInstanceState state to restore to.
-   * @throws IllegalStateException if method is called multiple times.
-   */
-  void onCreate(/*@Nullable*/ String savedInstanceState);
-
-  /**
-   * Called when the Stream is visible on the screen, may be partially obscured or about to be
-   * displayed. This maps similarly to {@link android.app.Activity#onStart()}.
-   *
-   * <p>This will cause the Stream to start pre-warming feed services.
-   */
-  void onShow();
-
-  /**
-   * Called when the Stream's view is completely visible and may be acted on by a user. This maps
-   * similarly to {@link android.app.Activity#onResume()}.
-   */
-  void onActive();
-  /**
-   * Called when the Stream view may not be acted on by a user. Generally when the Stream is no
-   * longer fully visible. Should also be called when the Activity hosting the Stream is not the
-   * active activity even though Stream may be fully visible. This maps similarly to {@link
-   * android.app.Activity#onPause()}.
-   */
-  void onInactive();
-
-  /**
-   * Called when the Stream is no longer visible on screen. This should act similarly to {@link
-   * android.app.Activity#onStop()}.
-   */
-  void onHide();
-
-  /**
-   * Called when the Stream is destroyed. This should act similarly to {@link
-   * android.app.Activity#onDestroy()}.
-   */
-  void onDestroy();
-
-  /**
-   * Called during {@link android.app.Activity#onSaveInstanceState(Bundle)}. The returned bundle
-   * should be passed to {@link #onCreate(Bundle)} when the activity is recreated and the stream
-   * needs to be recreated.
-   */
-  Bundle getSavedInstanceState();
-
-  /**
-   * Call during {@link android.app.Activity#onSaveInstanceState(Bundle)}. The returned string
-   * should be passed to {@link #onCreate(String)} when the activity is recreated and the stream
-   * needs to be recreated.
-   */
-  String getSavedInstanceStateString();
-
-  /**
-   * Return the root view which holds all card stream views. The Feed library builds Views when this
-   * method is called (caches as needed). This must be called after {@link #onCreate(Bundle)}.
-   * Multiple calls to this method will return the same View.
-   *
-   * @throws IllegalStateException when called before {@link #onCreate(Bundle)}.
-   */
-  View getView();
-
-  /**
-   * Set headers on the stream. Headers will be added to the top of the stream in the order they are
-   * in the list. The headers are not sticky and will scroll with content. Headers can be cleared by
-   * passing in an empty list.
-   */
-  void setHeaderViews(List<Header> headers);
-
-  /**
-   * Sets whether or not the Stream should show Feed content. Header views will still be shown if
-   * set.
-   */
-  void setStreamContentVisibility(boolean visible);
-
-  /**
-   * Notifies the Stream to purge unnecessary memory. This just purges recycling pools for now. Can
-   * expand out as needed.
-   */
-  void trim();
-
-  /**
-   * Called by the host to scroll the Stream by a certain amount. If the Stream is unable to scroll
-   * the desired amount, it will scroll as much as possible.
-   *
-   * @param dx amount in pixels for Stream to scroll horizontally
-   * @param dy amount in pixels for Stream to scroll vertically
-   */
-  void smoothScrollBy(int dx, int dy);
-
-  /**
-   * Returns the top position in pixels of the View at the {@code position} in the vertical
-   * hierarchy. This should act similarly to {@code RecyclerView.getChildAt(position).getTop()}.
-   *
-   * <p>Returns {@link #POSITION_NOT_KNOWN} if position is not known. This could be returned if
-   * {@code position} it not a valid position or the actual child has not been placed on screen and
-   * rendered.
-   */
-  int getChildTopAt(int position);
-
-  /**
-   * Returns true if the child at the position is visible on screen. The view could be partially
-   * visible and this would still return true.
-   */
-  boolean isChildAtPositionVisible(int position);
-
-  void addScrollListener(ScrollListener listener);
-
-  void removeScrollListener(ScrollListener listener);
-
-  void addOnContentChangedListener(ContentChangedListener listener);
-
-  void removeOnContentChangedListener(ContentChangedListener listener);
-
-  /**
-   * Allow the container to trigger a refresh of the stream.
-   *
-   * <p>Note: this will assume {@link RequestReason.HOST_REQUESTED}.
-   */
-  void triggerRefresh();
-
-  /**
-   * Interface users can implement to know when content in the Stream has changed content on screen.
-   */
-  interface ContentChangedListener {
-    /**
-     * Called by Stream when content being shown has changed. This could be new cards being created,
-     * the content of a card changing, etc...
-     */
-    void onContentChanged();
-  }
-
-  /** Interface users can implement to be told about changes to scrolling in the Stream. */
-  interface ScrollListener {
-
-    /**
-     * Constant used to denote that a scroll was performed but scroll delta could not be calculated.
-     * This normally maps to a programmatic scroll.
-     */
-    int UNKNOWN_SCROLL_DELTA = Integer.MIN_VALUE;
-
-    void onScrollStateChanged(@ScrollState int state);
-
-    /**
-     * Called when a scroll happens and provides the amount of pixels scrolled. {@link
-     * #UNKNOWN_SCROLL_DELTA} will be specified if scroll delta would not be determined. An example
-     * of this would be a scroll initiated programmatically.
-     */
-    void onScrolled(int dx, int dy);
-
-    /**
-     * Possible scroll states.
-     *
-     * <p>When adding new values, the value of {@link ScrollState#NEXT_VALUE} should be used and
-     * incremented. When removing values, {@link ScrollState#NEXT_VALUE} should not be changed, and
-     * those values should not be reused.
-     */
-    @IntDef({ScrollState.IDLE, ScrollState.DRAGGING, ScrollState.SETTLING, ScrollState.NEXT_VALUE})
-    @interface ScrollState {
-      /** Stream is not scrolling */
-      int IDLE = 0;
-
-      /** Stream is currently scrolling through external means such as user input. */
-      int DRAGGING = 1;
-
-      /** Stream is animating to a final position. */
-      int SETTLING = 2;
-
-      /** The next value that should be used when adding additional values to the IntDef. */
-      int NEXT_VALUE = 3;
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/common/BUILD b/src/main/java/com/google/android/libraries/feed/api/common/BUILD
deleted file mode 100644
index 646a1c0..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/common/BUILD
+++ /dev/null
@@ -1,12 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "common",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "@com_google_code_findbugs_jsr305//jar",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/common/MutationContext.java b/src/main/java/com/google/android/libraries/feed/api/common/MutationContext.java
deleted file mode 100644
index 8f038fe..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/common/MutationContext.java
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.common;
-
-import com.google.search.now.feed.client.StreamDataProto.StreamToken;
-import com.google.search.now.feed.client.StreamDataProto.UiContext;
-
-/**
- * This tracks the context of a mutation. When a request is made, this will track the reason for the
- * request and pass this information back with the response.
- */
-public final class MutationContext {
-  /*@Nullable*/ private final StreamToken continuationToken;
-  /*@Nullable*/ private final String requestingSessionId;
-  private final boolean userInitiated;
-
-  /** Static used to represent an empty Mutation Context */
-  public static final MutationContext EMPTY_CONTEXT =
-      new MutationContext(null, null, UiContext.getDefaultInstance(), false);
-
-  private final UiContext uiContext;
-
-  private MutationContext(
-      /*@Nullable*/ StreamToken continuationToken,
-      /*@Nullable*/ String requestingSessionId,
-      UiContext uiContext,
-      boolean userInitiated) {
-    this.continuationToken = continuationToken;
-    this.requestingSessionId = requestingSessionId;
-    this.userInitiated = userInitiated;
-    this.uiContext = uiContext;
-  }
-
-  /** Returns the continuation token used to make the request. */
-  /*@Nullable*/
-  public StreamToken getContinuationToken() {
-    return continuationToken;
-  }
-
-  /** Returns the session which made the request. */
-  /*@Nullable*/
-  public String getRequestingSessionId() {
-    return requestingSessionId;
-  }
-
-  /**
-   * Returns the {@link UiContext} which made the request or {@link UiContext#getDefaultInstance()}
-   * if none was present.
-   */
-  public UiContext getUiContext() {
-    return uiContext;
-  }
-
-  /** Returns {@code true} if the mutation was user initiated. */
-  public boolean isUserInitiated() {
-    return userInitiated;
-  }
-
-  /** Builder for creating a {@link com.google.android.libraries.feed.api.common.MutationContext */
-  public static final class Builder {
-    /*@MonotonicNonNull*/ private StreamToken continuationToken;
-    /*@MonotonicNonNull*/ private String requestingSessionId;
-    private UiContext uiContext = UiContext.getDefaultInstance();
-    private boolean userInitiated = false;
-
-    public Builder() {}
-
-    public Builder setContinuationToken(StreamToken continuationToken) {
-      this.continuationToken = continuationToken;
-      return this;
-    }
-
-    public Builder setRequestingSessionId(String requestingSessionId) {
-      this.requestingSessionId = requestingSessionId;
-      return this;
-    }
-
-    public Builder setUserInitiated(boolean userInitiated) {
-      this.userInitiated = userInitiated;
-      return this;
-    }
-
-    public Builder setUiContext(UiContext uiContext) {
-      this.uiContext = uiContext;
-      return this;
-    }
-
-    public MutationContext build() {
-      return new MutationContext(continuationToken, requestingSessionId, uiContext, userInitiated);
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/action/ActionApi.java b/src/main/java/com/google/android/libraries/feed/api/host/action/ActionApi.java
deleted file mode 100644
index 5ef6ef7..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/action/ActionApi.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.action;
-
-/**
- * The ActionApi combines the {@link ActionPeformerApi} and the {@link ActionEnabledApi} to allow
- * the Feed to query the host as to what actions can be performed and instruct the host to perform
- * such actions.
- */
-public interface ActionApi extends ActionEnabledApi, ActionPeformerApi {}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/action/ActionEnabledApi.java b/src/main/java/com/google/android/libraries/feed/api/host/action/ActionEnabledApi.java
deleted file mode 100644
index 6fd822f..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/action/ActionEnabledApi.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.action;
-
-/** Allows the Feed to query the host as to what actions are enabled. */
-public interface ActionEnabledApi {
-
-  /** Whether the host can open a URL. */
-  boolean canOpenUrl();
-
-  /** Whether the host can open a URL in incognito mode. */
-  boolean canOpenUrlInIncognitoMode();
-
-  /** Whether the host can open a URL in a new tab. */
-  boolean canOpenUrlInNewTab();
-
-  /** Whether the host can open a URL in a new window. */
-  boolean canOpenUrlInNewWindow();
-
-  /** Whether the host can download a URL. */
-  boolean canDownloadUrl();
-
-  /** Whether the host can open the Google Product Help page. */
-  boolean canLearnMore();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/action/ActionPeformerApi.java b/src/main/java/com/google/android/libraries/feed/api/host/action/ActionPeformerApi.java
deleted file mode 100644
index 3608d78..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/action/ActionPeformerApi.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.action;
-
-import com.google.android.libraries.feed.api.client.knowncontent.ContentMetadata;
-
-/**
- * Allows the Feed instruct the host to perform actions. In the case that an action is triggered
- * that is not enabled the host has one of two options:
- *
- * <ol>
- *   <li>The host can ignore the action.
- *   <li>The host can throw an exception which the Stream will not catch, crashing the app.
- * </ol>
- */
-public interface ActionPeformerApi {
-
-  /** Opens the given URL. */
-  void openUrl(String url);
-
-  /** Opens the given URL in incognito mode. */
-  void openUrlInIncognitoMode(String url);
-
-  /** Opens the given URL in a new tab. */
-  void openUrlInNewTab(String url);
-
-  /** Opens the given URL in a new window. */
-  void openUrlInNewWindow(String url);
-
-  /**
-   * Downloads the given url.
-   *
-   * @param contentMetadata The {@link ContentMetadata} defining the content to be downloaded.
-   */
-  void downloadUrl(ContentMetadata contentMetadata);
-
-  /** Opens the Google Product Help page for the Feed. */
-  void learnMore();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/action/BUILD b/src/main/java/com/google/android/libraries/feed/api/host/action/BUILD
deleted file mode 100644
index aca6a2f..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/action/BUILD
+++ /dev/null
@@ -1,16 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "action",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/client/knowncontent",
-        "//src/main/java/com/google/android/libraries/feed/api/host/logging",
-        "//src/main/java/com/google/android/libraries/feed/api/host/stream",
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "//src/main/proto/search/now/ui/action:feed_action_java_proto_lite",
-        "//src/main/proto/search/now/wire/feed:feed_java_proto_lite",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/action/StreamActionApi.java b/src/main/java/com/google/android/libraries/feed/api/host/action/StreamActionApi.java
deleted file mode 100644
index 31cec8b..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/action/StreamActionApi.java
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.action;
-
-import android.view.View;
-import com.google.android.libraries.feed.api.host.logging.ActionType;
-import com.google.android.libraries.feed.api.host.stream.TooltipInfo;
-import com.google.search.now.feed.client.StreamDataProto.StreamDataOperation;
-import com.google.search.now.ui.action.FeedActionProto.OpenContextMenuData;
-import com.google.search.now.ui.action.FeedActionProto.UndoAction;
-import com.google.search.now.wire.feed.ActionPayloadProto.ActionPayload;
-import java.util.List;
-
-/**
- * Allows the {@link com.google.android.libraries.feed.internalapi.actionparser.ActionParser} to
- * communicate actions back to the Stream after parsing.
- */
-public interface StreamActionApi extends ActionApi {
-
-  /** Whether or not a context menu can be opened */
-  boolean canOpenContextMenu();
-
-  /** Opens context menu. */
-  void openContextMenu(OpenContextMenuData openContextMenuData, View anchorView);
-
-  /** Whether or not a card can be dismissed. */
-  boolean canDismiss();
-
-  /** Dismisses card. */
-  void dismiss(
-      String contentId,
-      List<StreamDataOperation> dataOperations,
-      UndoAction undoAction,
-      ActionPayload payload);
-
-  /** Whether or not the not interested in action can be handled. */
-  boolean canHandleNotInterestedIn();
-
-  /** Handles the Not interested in <source> action. */
-  void handleNotInterestedIn(
-      List<StreamDataOperation> dataOperations,
-      UndoAction undoAction,
-      ActionPayload payload,
-      int interestType);
-
-  /** Called when a client action has been performed. */
-  void onClientAction(@ActionType int actionType);
-
-  /** Whether or not the not view actions can be handled. */
-  boolean canHandleElementView();
-
-  /** Whether or not the not hide actions can be handled. */
-  boolean canHandleElementHide();
-
-  /** Whether or not the not click actions can be handled. */
-  boolean canHandleElementClick();
-
-  /**
-   * Called when a view action has been performed on a server-defined {@link
-   * com.google.search.now.ui.action.FeedActionProto.FeedActionMetadata.ElementType} value.
-   */
-  void onElementView(int elementType);
-
-  /**
-   * Called when a hide action has been performed on a server-defined {@link
-   * com.google.search.now.ui.action.FeedActionProto.FeedActionMetadata.ElementType} value.
-   */
-  void onElementHide(int elementType);
-
-  /**
-   * Called when a click action has been performed on a server-defined {@link
-   * com.google.search.now.ui.action.FeedActionProto.FeedActionMetadata.ElementType} value.
-   */
-  void onElementClick(int elementType);
-
-  /** Whether or not show tooltip actions can be handled. */
-  boolean canShowTooltip();
-
-  /**
-   * Called when the show tooltip action has been preformed. Tooltip might not be shown if it does
-   * not meet triggering conditions.
-   */
-  void maybeShowTooltip(TooltipInfo tooltipInfo, View view);
-
-  /* Called to open a url after uploading actions and attaching the consistency token to it. */
-  void openUrl(String url, String consistencyTokenQueryParamName);
-
-  /**
-   * Opens the given URL in incognito mode after uploading actions and attaching the consistency
-   * token to it.
-   */
-  void openUrlInIncognitoMode(String url, String consistencyTokenQueryParamName);
-
-  /**
-   * Opens the given URL in a new tab after uploading actions and attaching the consistency token to
-   * it.
-   */
-  void openUrlInNewTab(String url, String consistencyTokenQueryParamName);
-
-  /**
-   * Opens the given URL in a new windowafter uploading actions and attaching the consistency token
-   * to it.
-   */
-  void openUrlInNewWindow(String url, String consistencyTokenQueryParamName);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/config/ApplicationInfo.java b/src/main/java/com/google/android/libraries/feed/api/host/config/ApplicationInfo.java
deleted file mode 100644
index ac64feb..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/config/ApplicationInfo.java
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.config;
-
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.support.annotation.IntDef;
-import com.google.android.libraries.feed.common.logging.Logger;
-
-/** API to allow the Feed to get information about the host application. */
-// TODO: This can't be final because we mock it
-public class ApplicationInfo {
-
-  @IntDef({AppType.UNKNOWN_APP, AppType.SEARCH_APP, AppType.CHROME, AppType.TEST_APP})
-  public @interface AppType {
-    int UNKNOWN_APP = 0;
-    int SEARCH_APP = 1;
-    int CHROME = 2;
-    int TEST_APP = 3;
-  }
-
-  @IntDef({
-    Architecture.UNKNOWN_ACHITECTURE,
-    Architecture.ARM,
-    Architecture.ARM64,
-    Architecture.MIPS,
-    Architecture.MIPS64,
-    Architecture.X86,
-    Architecture.X86_64,
-  })
-  public @interface Architecture {
-    int UNKNOWN_ACHITECTURE = 0;
-    int ARM = 1;
-    int ARM64 = 2;
-    int MIPS = 3;
-    int MIPS64 = 4;
-    int X86 = 5;
-    int X86_64 = 6;
-  }
-
-  @IntDef({
-    BuildType.UNKNOWN_BUILD_TYPE,
-    BuildType.DEV,
-    BuildType.ALPHA,
-    BuildType.BETA,
-    BuildType.RELEASE
-  })
-  public @interface BuildType {
-    int UNKNOWN_BUILD_TYPE = 0;
-    int DEV = 1;
-    int ALPHA = 2;
-    int BETA = 3;
-    int RELEASE = 4;
-  }
-
-  @AppType private final int appType;
-  @Architecture private final int architecture;
-  @BuildType private final int buildType;
-  private final String versionString;
-
-  private ApplicationInfo(int appType, int architecture, int buildType, String versionString) {
-    this.appType = appType;
-    this.architecture = architecture;
-    this.buildType = buildType;
-    this.versionString = versionString;
-  }
-
-  @AppType
-  public int getAppType() {
-    return appType;
-  }
-
-  @Architecture
-  public int getArchitecture() {
-    return architecture;
-  }
-
-  @BuildType
-  public int getBuildType() {
-    return buildType;
-  }
-
-  public String getVersionString() {
-    return versionString;
-  }
-
-  /** Builder class used to create {@link ApplicationInfo} objects. */
-  public static final class Builder {
-    private static final String TAG = "Builder";
-
-    private final Context context;
-    @AppType private int appType = AppType.UNKNOWN_APP;
-    @Architecture private int architecture = Architecture.UNKNOWN_ACHITECTURE;
-    @BuildType private int buildType = BuildType.UNKNOWN_BUILD_TYPE;
-
-    private String versionString;
-
-    public Builder(Context context) {
-      this.context = context;
-    }
-
-    /** Sets the type of client application. */
-    public Builder setAppType(@AppType int appType) {
-      this.appType = appType;
-      return this;
-    }
-
-    /** Sets the CPU architecture that the client application was built for. */
-    public Builder setArchitecture(@Architecture int architecture) {
-      this.architecture = architecture;
-      return this;
-    }
-
-    /** Sets the release stage of the build for the client application. */
-    public Builder setBuildType(@BuildType int buildType) {
-      this.buildType = buildType;
-      return this;
-    }
-
-    /**
-     * Sets the major/minor/build/revision numbers of the application version from the given string.
-     * A version string typically looks like: 'major.minor.build.revision'. If not set here, it will
-     * be retrieved from the application's versionName string defined in the manifest (see
-     * https://developer.android.com/studio/publish/versioning).
-     */
-    public Builder setVersionString(String versionString) {
-      this.versionString = versionString;
-      return this;
-    }
-
-    public ApplicationInfo build() {
-      if (versionString == null) {
-        versionString = getDefaultVersionString();
-      }
-      return new ApplicationInfo(appType, architecture, buildType, versionString);
-    }
-
-    private String getDefaultVersionString() {
-      try {
-        PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
-        return pInfo.versionName;
-      } catch (NameNotFoundException e) {
-        Logger.w(TAG, e, "Cannot find package name.");
-      }
-      return "";
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/config/BUILD b/src/main/java/com/google/android/libraries/feed/api/host/config/BUILD
index fc5689e..1371a52 100644
--- a/src/main/java/com/google/android/libraries/feed/api/host/config/BUILD
+++ b/src/main/java/com/google/android/libraries/feed/api/host/config/BUILD
@@ -5,8 +5,4 @@
 android_library(
     name = "config",
     srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/common/logging",
-        "@maven//:com_android_support_support_annotations",
-    ],
 )
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/config/Configuration.java b/src/main/java/com/google/android/libraries/feed/api/host/config/Configuration.java
deleted file mode 100644
index 54c3bf7..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/config/Configuration.java
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.config;
-
-import android.support.annotation.StringDef;
-import java.util.HashMap;
-
-/**
- * Contains an immutable collection of {@link ConfigKey} {@link String}, {@link Object} pairs.
- *
- * <p>Note: this class should not be mocked. Use the {@link Builder} instead.
- */
-// TODO: This can't be final because we mock it
-public class Configuration {
-  /** A unique string identifier for a config value */
-  @StringDef({
-    // Keep sorted.
-    // Configuration to have Stream abort restores if user is past configured fold count.
-    ConfigKey.ABANDON_RESTORE_BELOW_FOLD,
-    // Configuration on threshold of cards which abandons a restore if scroll is past that content
-    // count.
-    ConfigKey.ABANDON_RESTORE_BELOW_FOLD_THRESHOLD,
-    // Boolean which if true, will allow tooltips to show.
-    ConfigKey.CARD_MENU_TOOLTIP_ELIGIBLE,
-    // Boolean which causes synthetic tokens to be consumed when they are found.
-    ConfigKey.CONSUME_SYNTHETIC_TOKENS,
-    // Boolean which causes synthetic tokens to be automatically consume when restoring.  This will
-    // not cause synthetic tokens to be consumed when opening with a new session.
-    ConfigKey.CONSUME_SYNTHETIC_TOKENS_WHILE_RESTORING,
-    ConfigKey.DEFAULT_ACTION_TTL_SECONDS,
-    // When enabled, will ask server to add carousels in response.
-    ConfigKey.ENABLE_CAROUSELS,
-    // Time in ms to wait for image loading before showing a fade in animation.
-    ConfigKey.FADE_IMAGE_THRESHOLD_MS,
-    // Maximum number of times we will try to upload an action before deleting it.
-    ConfigKey.FEED_ACTION_MAX_UPLOAD_ATTEMPTS,
-    // The endpoint used for recording uploaded actions to the server.
-    ConfigKey.FEED_ACTION_SERVER_ENDPOINT,
-    // Maximum number of actions to be uploaded to the enpoint in a single request.
-    ConfigKey.FEED_ACTION_SERVER_MAX_ACTIONS_PER_REQUEST,
-    // Maximum size of the request to be uploaded to the enpoint in a single request.
-    ConfigKey.FEED_ACTION_SERVER_MAX_SIZE_PER_REQUEST,
-    // The method call to the feed action server  (put/post/etc)
-    ConfigKey.FEED_ACTION_SERVER_METHOD,
-    // If the feedActionServer response is length prefixed
-    ConfigKey.FEED_ACTION_SERVER_RESPONSE_LENGTH_PREFIXED,
-    // Ttl of an action that has failed to be uploaded.
-    ConfigKey.FEED_ACTION_TTL_SECONDS,
-    ConfigKey.FEED_SERVER_ENDPOINT,
-    ConfigKey.FEED_SERVER_METHOD,
-    ConfigKey.FEED_SERVER_RESPONSE_LENGTH_PREFIXED,
-    // Boolean which if true, will ask the server for the feed ui response.
-    ConfigKey.FEED_UI_ENABLED,
-    ConfigKey.INITIAL_NON_CACHED_PAGE_SIZE,
-    // Only update HEAD and the session making a page request
-    ConfigKey.LIMIT_PAGE_UPDATES,
-    // Do not update HEAD when making a page request
-    ConfigKey.LIMIT_PAGE_UPDATES_IN_HEAD,
-    // Time in ms that content should be rendered in order to be considered an immediate open
-    ConfigKey.LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS,
-    // Boolean which if true, will ask the server for an menu option to launch the interest
-    // management customize page.
-    ConfigKey.MANAGE_INTERESTS_ENABLED,
-    // The maximum number of times that the GC task can re-enqueue itself.
-    ConfigKey.MAXIMUM_GC_ATTEMPTS,
-    ConfigKey.MINIMUM_VALID_ACTION_RATIO,
-    ConfigKey.NON_CACHED_MIN_PAGE_SIZE,
-    ConfigKey.NON_CACHED_PAGE_SIZE,
-    ConfigKey.SESSION_LIFETIME_MS,
-    // Boolean which if true, will ask the server for a snippet from the article.
-    ConfigKey.SNIPPETS_ENABLED,
-    // Delay before a spinner should be shown after content is requested. Only used for feed wide
-    // spinners, not for more button spinners.
-    ConfigKey.SPINNER_DELAY_MS,
-    // Minimum time before a spinner should show before disappearing. Only used for feed wide
-    // spinners, not for more button spinners.
-    ConfigKey.SPINNER_MINIMUM_SHOW_TIME_MS,
-    // The number of items that can be missing from a call to FeedStore before failing.
-    ConfigKey.STORAGE_MISS_THRESHOLD,
-    // Time in ms for the length of the timeout
-    ConfigKey.TIMEOUT_TIMEOUT_MS,
-    ConfigKey.TRIGGER_IMMEDIATE_PAGINATION,
-    // Turn on the Timeout Scheduler
-    // Boolean which if true, will ask the server for not interested in actions and a durable
-    // dismiss action.
-    ConfigKey.UNDOABLE_ACTIONS_ENABLED,
-    // Use direct storage
-    ConfigKey.USE_DIRECT_STORAGE,
-    // Boolean which if true, will ask the server for a different pagination strategy.
-    ConfigKey.USE_SECONDARY_PAGE_REQUEST,
-    ConfigKey.USE_TIMEOUT_SCHEDULER,
-    // Percentage of the view that should be on screen to log a view
-    ConfigKey.VIEW_LOG_THRESHOLD,
-    // Time in ms for the minimum amount of time a view must be onscreen to count as a view.
-    ConfigKey.VIEW_MIN_TIME_MS,
-  })
-  public @interface ConfigKey {
-    // Keep sorted.
-    String ABANDON_RESTORE_BELOW_FOLD = "abandon_restore_below_fold";
-    String ABANDON_RESTORE_BELOW_FOLD_THRESHOLD = "abandon_restore_below_fold_threshold";
-    String CARD_MENU_TOOLTIP_ELIGIBLE = "card_menu_tooltip_eligible";
-    String CONSUME_SYNTHETIC_TOKENS = "consume_synthetic_tokens_bool";
-    String CONSUME_SYNTHETIC_TOKENS_WHILE_RESTORING =
-        "consume_synthetic_tokens_while_restoring_bool";
-    String DEFAULT_ACTION_TTL_SECONDS = "default_action_ttl_seconds";
-    String ENABLE_CAROUSELS = "enable_carousels";
-    String FADE_IMAGE_THRESHOLD_MS = "fade_image_threshold_ms";
-    String FEED_ACTION_MAX_UPLOAD_ATTEMPTS = "feed_action_max_upload_attempts";
-    String FEED_ACTION_SERVER_ENDPOINT = "feed_action_server_endpoint";
-    String FEED_ACTION_SERVER_MAX_ACTIONS_PER_REQUEST =
-        "feed_action_server_max_actions_per_request";
-    String FEED_ACTION_SERVER_MAX_SIZE_PER_REQUEST = "feed_action_server_max_size_per_request";
-    String FEED_ACTION_SERVER_METHOD = "feed_action_server_method";
-    String FEED_ACTION_SERVER_RESPONSE_LENGTH_PREFIXED =
-        "feed_action_server_response_length_prefixed";
-    String FEED_ACTION_TTL_SECONDS = "feed_action_ttl_seconds";
-    String FEED_SERVER_ENDPOINT = "feed_server_endpoint";
-    String FEED_SERVER_METHOD = "feed_server_method";
-    String FEED_SERVER_RESPONSE_LENGTH_PREFIXED = "feed_server_response_length_prefixed";
-    String FEED_UI_ENABLED = "feed_ui_enabled";
-    String INITIAL_NON_CACHED_PAGE_SIZE = "initial_non_cached_page_size";
-    String LIMIT_PAGE_UPDATES = "limit_page_updates";
-    String LIMIT_PAGE_UPDATES_IN_HEAD = "limit_page_updates_in_head";
-    String LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS = "logging_immediate_content_threshold_ms";
-    String MANAGE_INTERESTS_ENABLED = "manage_interests_enabled";
-    String MAXIMUM_GC_ATTEMPTS = "maximum_gc_attempts";
-    String MINIMUM_VALID_ACTION_RATIO = "minimum_valid_action_ratio";
-    String NON_CACHED_MIN_PAGE_SIZE = "non_cached_min_page_size";
-    String NON_CACHED_PAGE_SIZE = "non_cached_page_size";
-    String SESSION_LIFETIME_MS = "session_lifetime_ms";
-    String SNIPPETS_ENABLED = "snippets_enabled";
-    String SPINNER_DELAY_MS = "spinner_delay";
-    String SPINNER_MINIMUM_SHOW_TIME_MS = "spinner_minimum_show_time";
-    String STORAGE_MISS_THRESHOLD = "storage_miss_threshold";
-    String TIMEOUT_TIMEOUT_MS = "timeout_timeout_ms";
-    String TRIGGER_IMMEDIATE_PAGINATION = "trigger_immediate_pagination_bool";
-    String UNDOABLE_ACTIONS_ENABLED = "undoable_actions_enabled";
-    String USE_DIRECT_STORAGE = "use_direct_storage";
-    String USE_SECONDARY_PAGE_REQUEST = "use_secondary_page_request";
-    String USE_TIMEOUT_SCHEDULER = "use_timeout_scheduler";
-    String VIEW_LOG_THRESHOLD = "view_log_threshold";
-    String VIEW_MIN_TIME_MS = "view_min_time_ms";
-  }
-
-  private final HashMap<String, Object> values;
-
-  private Configuration(HashMap<String, Object> values) {
-    this.values = values;
-  }
-
-  public String getValueOrDefault(String key, String defaultValue) {
-    return this.<String>getValueOrDefaultUnchecked(key, defaultValue);
-  }
-
-  public long getValueOrDefault(String key, long defaultValue) {
-    return this.<Long>getValueOrDefaultUnchecked(key, defaultValue);
-  }
-
-  public boolean getValueOrDefault(String key, boolean defaultValue) {
-    return this.<Boolean>getValueOrDefaultUnchecked(key, defaultValue);
-  }
-
-  public double getValueOrDefault(String key, double defaultValue) {
-    return this.<Double>getValueOrDefaultUnchecked(key, defaultValue);
-  }
-
-  /**
-   * Returns the value if it exists, or {@code defaultValue} otherwise.
-   *
-   * @throws ClassCastException if the value can't be cast to {@code T}.
-   */
-  private <T> T getValueOrDefaultUnchecked(String key, T defaultValue) {
-    if (values.containsKey(key)) {
-      // The caller assumes the responsibility of ensuring this cast succeeds
-      @SuppressWarnings("unchecked")
-      T castedValue = (T) values.get(key);
-      return castedValue;
-    } else {
-      return defaultValue;
-    }
-  }
-
-  /** Returns true if a value exists for the {@code key}. */
-  public boolean hasValue(String key) {
-    return values.containsKey(key);
-  }
-
-  /** Returns a {@link Builder} for this {@link Configuration}. */
-  public Builder toBuilder() {
-    return new Builder(values);
-  }
-
-  /** Returns a default {@link Configuration}. */
-  public static Configuration getDefaultInstance() {
-    return new Builder().build();
-  }
-
-  /** Builder class used to create {@link Configuration} objects. */
-  public static final class Builder {
-    private final HashMap<String, Object> values;
-
-    private Builder(HashMap<String, Object> values) {
-      this.values = new HashMap<>(values);
-    }
-
-    public Builder() {
-      this(new HashMap<>());
-    }
-
-    public Builder put(@ConfigKey String key, String value) {
-      values.put(key, value);
-      return this;
-    }
-
-    public Builder put(@ConfigKey String key, long value) {
-      values.put(key, value);
-      return this;
-    }
-
-    public Builder put(@ConfigKey String key, boolean value) {
-      values.put(key, value);
-      return this;
-    }
-
-    public Builder put(@ConfigKey String key, double value) {
-      values.put(key, value);
-      return this;
-    }
-
-    public Configuration build() {
-      return new Configuration(values);
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/imageloader/BUILD b/src/main/java/com/google/android/libraries/feed/api/host/imageloader/BUILD
index 1560291..11599b4 100644
--- a/src/main/java/com/google/android/libraries/feed/api/host/imageloader/BUILD
+++ b/src/main/java/com/google/android/libraries/feed/api/host/imageloader/BUILD
@@ -8,6 +8,5 @@
     deps = [
         "//src/main/java/com/google/android/libraries/feed/common/functional",
         "@com_google_code_findbugs_jsr305//jar",
-        "@maven//:com_android_support_support_annotations",
     ],
 )
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/imageloader/BundledAssets.java b/src/main/java/com/google/android/libraries/feed/api/host/imageloader/BundledAssets.java
deleted file mode 100644
index c5b24ee..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/imageloader/BundledAssets.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.imageloader;
-
-import android.support.annotation.StringDef;
-
-/** Enumerates the set of bundled assets which could be requested via the {@link ImageLoaderApi}. */
-@StringDef({
-  BundledAssets.OFFLINE_INDICATOR_BADGE,
-  BundledAssets.OFFLINE_INDICATOR_BADGE_DARK_BG,
-  BundledAssets.VIDEO_INDICATOR_BADGE,
-  BundledAssets.VIDEO_INDICATOR_BADGE_DARK_BG,
-  BundledAssets.MENU_ICON,
-  BundledAssets.MENU_ICON_DARK_BG,
-  BundledAssets.AMP_ICON,
-  BundledAssets.AMP_ICON_DARK_BG,
-  BundledAssets.SPARK_ICON,
-  BundledAssets.SPARK_ICON_DARK_BG
-})
-public @interface BundledAssets {
-  /** Icon that indicates amp content */
-  String AMP_ICON = "amp_icon";
-
-  /** Dark Theme Background Icon that indicates amp content */
-  String AMP_ICON_DARK_BG = "amp_icon_dark";
-
-  /** Icon that indicates a click will take the user to a menu. */
-  String MENU_ICON = "menu_icon";
-
-  /** Dark Theme Background Icon that indicates a click will take the user to a menu. */
-  String MENU_ICON_DARK_BG = "menu_icon_dark";
-
-  /** Badge to show indicating content is available offline. */
-  String OFFLINE_INDICATOR_BADGE = "offline_indicator_badge";
-
-  /** Dark Theme Background Badge to show indicating content is available offline. */
-  String OFFLINE_INDICATOR_BADGE_DARK_BG = "offline_indicator_badge_dark";
-
-  /** Branding interest spark icon. */
-  String SPARK_ICON = "spark_icon";
-
-  /** Dark Theme Background Branding interest spark icon. */
-  String SPARK_ICON_DARK_BG = "spark_icon_dark";
-
-  /** Badge to show indicating content links to a video. */
-  String VIDEO_INDICATOR_BADGE = "video_indicator_badge";
-
-  /** Dark Theme Background Badge to show indicating content links to a video. */
-  String VIDEO_INDICATOR_BADGE_DARK_BG = "video_indicator_badge_dark";
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/logging/ActionType.java b/src/main/java/com/google/android/libraries/feed/api/host/logging/ActionType.java
deleted file mode 100644
index b008dac..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/logging/ActionType.java
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.logging;
-
-import android.support.annotation.IntDef;
-
-/**
- * IntDef representing the different types of actions.
- *
- * <p>When adding new values, the value of {@link ActionType#NEXT_VALUE} should be used and
- * incremented. When removing values, {@link ActionType#NEXT_VALUE} should not be changed, and those
- * values should not be reused.
- */
-@IntDef({
-  ActionType.UNKNOWN,
-  ActionType.OPEN_URL,
-  ActionType.OPEN_URL_INCOGNITO,
-  ActionType.OPEN_URL_NEW_TAB,
-  ActionType.OPEN_URL_NEW_WINDOW,
-  ActionType.DOWNLOAD,
-  ActionType.LEARN_MORE,
-  ActionType.NEXT_VALUE
-})
-// LINT.IfChange
-public @interface ActionType {
-  int UNKNOWN = -1;
-  int OPEN_URL = 1;
-  int OPEN_URL_INCOGNITO = 2;
-  int OPEN_URL_NEW_TAB = 4;
-  int OPEN_URL_NEW_WINDOW = 3;
-  int DOWNLOAD = 5;
-  int LEARN_MORE = 6;
-  int NEXT_VALUE = 7;
-}
-// LINT.ThenChange
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/logging/BUILD b/src/main/java/com/google/android/libraries/feed/api/host/logging/BUILD
deleted file mode 100644
index 2cfb233..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/logging/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "logging",
-    srcs = glob(["*.java"]),
-    deps = [
-        "@maven//:com_android_support_support_annotations",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/logging/BasicLoggingApi.java b/src/main/java/com/google/android/libraries/feed/api/host/logging/BasicLoggingApi.java
deleted file mode 100644
index 2a140c1..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/logging/BasicLoggingApi.java
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.logging;
-
-import java.util.List;
-
-/** The BasicLoggingApi is used by the Feed to log actions performed on the Feed. */
-public interface BasicLoggingApi {
-  /**
-   * Called when a section of content (generally a card) comes into view. Will not get called by
-   * Stream if content has already been logged. If the stream is recreated this will get logged
-   * again.
-   *
-   * <p>Content viewed will get logged as soon as content is 2/3 (will be configurable in {@link
-   * com.google.android.libraries.feed.api.host.config.Configuration.ConfigKey#VIEW_LOG_THRESHOLD})
-   * visible in view-port. This means logging will not be tied to scroll state events (scroll
-   * start/stop) but rather raw scrolling events.
-   */
-  void onContentViewed(ContentLoggingData data);
-
-  /**
-   * Called when content has been dismissed by a user. This could be done via a swipe or through the
-   * context menu.
-   *
-   * @param data data for content on which swipe was performed.
-   * @param wasCommitted true if the action was committed and thus important to the user model false
-   *     if the action was undone.
-   */
-  void onContentDismissed(ContentLoggingData data, boolean wasCommitted);
-
-  /**
-   * Called when content has been swiped by a user.
-   *
-   * @param data data for content on which swipe was performed.
-   */
-  void onContentSwiped(ContentLoggingData data);
-
-  /** Called when content is clicked/tapped. */
-  void onContentClicked(ContentLoggingData data);
-
-  /**
-   * Called when a client action has been performed on a piece of content.
-   *
-   * @param data data for content on which action was performed.
-   * @param actionType describes the type of action which is being performed by user.
-   */
-  void onClientAction(ContentLoggingData data, @ActionType int actionType);
-
-  /** Called when the context menu for content has been opened. */
-  void onContentContextMenuOpened(ContentLoggingData data);
-
-  /**
-   * Called when the more button appears at the bottom of the screen. This is a view on the more
-   * button which is created from continuation features (paging). A view from the more button due to
-   * having zero cards will not trigger this event.
-   *
-   * @param position index of the more button in the Stream.
-   */
-  void onMoreButtonViewed(int position);
-
-  /**
-   * Called when the more button appears at the bottom of the screen and is clicked. This is a click
-   * on the more button which is created from continuation features (paging). A click from the more
-   * button due to having zero cards will not trigger this event.
-   *
-   * @param position index of the more button in the Stream.
-   */
-  void onMoreButtonClicked(int position);
-
-  /**
-   * Called when the user has indicated they aren't interested in the story's topic.
-   *
-   * @param interestType type of content a user is not interested in
-   * @param data data for content on which swipe was performed.
-   * @param wasCommitted true if the action was committed and thus important to the user model false
-   *     if the action was undone.
-   */
-  void onNotInterestedIn(int interestType, ContentLoggingData data, boolean wasCommitted);
-
-  /**
-   * Called when Stream is shown and content was shown to the user. Content could have been cached
-   * or a network fetch may have been needed.
-   *
-   * @param timeToPopulateMs time in milliseconds, since {@link
-   *     com.google.android.libraries.feed.api.client.stream.Stream#onShow()}, it took to show
-   *     content to the user. This does not include time to render but time to populate data in the
-   *     UI.
-   * @param contentCount Count of content shown to user. This will generally be the number of cards.
-   */
-  void onOpenedWithContent(int timeToPopulateMs, int contentCount);
-
-  /**
-   * Called when Stream was shown and no content was immediately available to be shown. Content may
-   * have been shown after a network fetch.
-   */
-  void onOpenedWithNoImmediateContent();
-
-  /**
-   * Called when Stream was shown and no content could be shown to the user at all. This means that
-   * there was no cached content and a network request to fetch new content was not allowed, could
-   * not complete, or failed.
-   */
-  void onOpenedWithNoContent();
-
-  /**
-   * Called when a loading spinner starts showing.
-   *
-   * @param spinnerType type of spinner that is shown.
-   */
-  void onSpinnerStarted(@SpinnerType int spinnerType);
-
-  /**
-   * Called when a loading spinner finishes showing.
-   *
-   * @param timeShownMs time in milliseconds that the spinner was shown before completing.
-   * @param spinnerType type of spinner that was shown.
-   */
-  void onSpinnerFinished(int timeShownMs, @SpinnerType int spinnerType);
-
-  /**
-   * Called when a spinner is destroyed without completing.
-   *
-   * @param timeShownMs time in milliseconds that the spinner was shown before being destroyed.
-   * @param spinnerType type of spinner that was shown.
-   */
-  void onSpinnerDestroyedWithoutCompleting(int timeShownMs, @SpinnerType int spinnerType);
-
-  /**
-   * Called when Piet wants to report events that occurred during Frame rendering.
-   *
-   * @param pietErrorCodes int versions of values from Piet {@link
-   *     com.google.search.now.ui.piet.ErrorsProto.ErrorCode} enum
-   */
-  void onPietFrameRenderingEvent(List<Integer> pietErrorCodes);
-
-  /**
-   * Called when a user has clicked on an element. This is similar to onContentClicked, but records
-   * the specific elementType that was clicked.
-   *
-   * @param data data for content on which action was performed.
-   * @param elementType describes the server-defined type of element which was clicked. Corresponds
-   *     to the int numbers of the server-defined {@link
-   *     com.google.search.now.ui.action.FeedActionProto.FeedActionMetadata.ElementType} value.
-   */
-  void onVisualElementClicked(ElementLoggingData data, int elementType);
-
-  /**
-   * Called when a user has viewed an element. This is similar to onContentViewed, but records the
-   * view after it has been on the screen for a given amount of time instead of on predraw.
-   *
-   * @param data data for content on which action was performed.
-   * @param elementType describes the type of element which was clicked.
-   */
-  void onVisualElementViewed(ElementLoggingData data, int elementType);
-
-  /**
-   * Reports an internal error. This error should be logged by hosts, but not handled. In
-   * particular, the host should not crash if this method is called.
-   */
-  void onInternalError(@InternalFeedError int internalError);
-
-  /**
-   * Called when a token successfully completes.
-   *
-   * @param wasSynthetic whether the token was synthetic.
-   * @param contentCount how many top level features were in the response, typically clusters.
-   * @param tokenCount how many tokens were in the response.
-   */
-  void onTokenCompleted(boolean wasSynthetic, int contentCount, int tokenCount);
-
-  /**
-   * Called when a token fails to complete.
-   *
-   * @param wasSynthetic whether the token was synthetic.
-   * @param failureCount How many times the token has failed to complete, including this failure.
-   */
-  void onTokenFailedToComplete(boolean wasSynthetic, int failureCount);
-
-  /**
-   * Called when a request is made.
-   *
-   * @param requestReason the reason the request was made.
-   */
-  void onServerRequest(@RequestReason int requestReason);
-
-  /**
-   * Logged when the zero state is shown. Shown in this context specifically means created, but
-   * doesn't necessarily indicate that the user saw the zero state.
-   *
-   * @param zeroStateShowReason the reason the zero state was shown.
-   */
-  void onZeroStateShown(@ZeroStateShowReason int zeroStateShowReason);
-
-  /**
-   * Called when a refresh from a zero state is completed.
-   *
-   * @param newContentCount Number of content created. Note: content here refers to content from the
-   *     server. If the zero state refresh completes to show another zero state, this value would be
-   *     zero.
-   * @param newTokenCount Number of tokens created.
-   */
-  void onZeroStateRefreshCompleted(int newContentCount, int newTokenCount);
-
-  /**
-   * Called with the first event that occurs after the UI registers for a new session. If, for
-   * example, multiple errors occurred repeatedly due to a user pressing a refresh button on the
-   * zero-state UI, those would not be reported by this, as the UI would have only registered for a
-   * new session before the first error.
-   *
-   * @param sessionEvent the event that first occurred after the UI registered for a session.
-   * @param timeFromRegisteringMs how long it took, in milliseconds, for the event to occur after
-   *     the UI registered for a session.
-   * @param sessionCount the number of sessions that have been requested by the UI. This would never
-   *     be reset until the UI is destroyed, and would start at {@literal 1}.
-   */
-  void onInitialSessionEvent(
-      @SessionEvent int sessionEvent, int timeFromRegisteringMs, int sessionCount);
-
-  /**
-   * Called when a client scrolls in the feed
-   *
-   * @param scrollType describes the type of scroll which is being performed by user.
-   * @param distanceScrolled distance in px the user scrolled for this particular scroll.
-   */
-  void onScroll(@ScrollType int scrollType, int distanceScrolled);
-
-  /**
-   * Called when a task finishes executing.
-   *
-   * @param task the task that is being run.
-   * @param delayTime how long it took from enqueuing the task to when it was run.
-   * @param taskTime how long it took from the task starting to when it finished executing.
-   */
-  void onTaskFinished(@Task int task, int delayTime, int taskTime);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/logging/ContentLoggingData.java b/src/main/java/com/google/android/libraries/feed/api/host/logging/ContentLoggingData.java
deleted file mode 100644
index a6e1c1d..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/logging/ContentLoggingData.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.logging;
-
-/** Object used to hold content data for logging events. */
-public interface ContentLoggingData extends ElementLoggingData {
-
-  /** Gets the time, in seconds from epoch, for when the content was published/made available. */
-  long getPublishedTimeSeconds();
-
-  /** Gets the score which was given to content from NowStream. */
-  float getScore();
-
-  /**
-   * Gets offline availability status.
-   *
-   * <p>Note: The offline availability status for one piece of content can change. When this is
-   * logged, it should be logged with the offline status as of logging time. This means that one
-   * piece of content can emit multiple {@link ContentLoggingData} instances which are not equal to
-   * each other.
-   */
-  boolean isAvailableOffline();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/logging/ElementLoggingData.java b/src/main/java/com/google/android/libraries/feed/api/host/logging/ElementLoggingData.java
deleted file mode 100644
index 7afc699..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/logging/ElementLoggingData.java
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2019 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.logging;
-
-/** Object used to hold content data for logging events. */
-public interface ElementLoggingData {
-  /**
-   * Returns the position of the content in the stream not accounting for header views. The top
-   * being 0. Position does not change after initial layout. Specifically the position does not
-   * update if dismisses/removes are performed.
-   */
-  int getPositionInStream();
-
-  /**
-   * Gets the time, in seconds from epoch, for when this content was made available on the device.
-   * This could be the time for when this content was retrieved from the server or the time the data
-   * was pushed to the device.
-   */
-  long getTimeContentBecameAvailable();
-
-  /**
-   * Gets the URI which represents this content. This will normally be the URI which this content
-   * links to.
-   */
-  String getRepresentationUri();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/logging/InternalFeedError.java b/src/main/java/com/google/android/libraries/feed/api/host/logging/InternalFeedError.java
deleted file mode 100644
index 583402e..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/logging/InternalFeedError.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.logging;
-
-import android.support.annotation.IntDef;
-
-/**
- * Represents internal errors of the Feed libraries.
- *
- * <p>When adding new values, the value of {@link InternalFeedError#NEXT_VALUE} should be used and
- * incremented. When removing values, {@link InternalFeedError#NEXT_VALUE} should not be changed,
- * and those values should not be reused.
- */
-@IntDef({
-  InternalFeedError.SWITCH_TO_EPHEMERAL,
-  InternalFeedError.NO_URL_FOR_OPEN,
-  InternalFeedError.FAILED_TO_RESTORE,
-  InternalFeedError.NO_ROOT_FEATURE,
-  InternalFeedError.TOP_LEVEL_UNBOUND_CHILD,
-  InternalFeedError.TOP_LEVEL_INVALID_FEATURE_TYPE,
-  InternalFeedError.CLUSTER_CHILD_MISSING_FEATURE,
-  InternalFeedError.CLUSTER_CHILD_NOT_CARD,
-  InternalFeedError.CARD_CHILD_MISSING_FEATURE,
-  InternalFeedError.NULL_SHARED_STATES,
-  InternalFeedError.FAILED_TO_CREATE_LEAF,
-  InternalFeedError.UNHANDLED_TOKEN,
-  InternalFeedError.TASK_QUEUE_STARVATION,
-  InternalFeedError.CONTENT_STORAGE_MISSING_ITEM,
-  InternalFeedError.ITEM_NOT_PARSED,
-  InternalFeedError.STORAGE_MISS_BEYOND_THRESHOLD,
-  InternalFeedError.CONTENT_MUTATION_FAILED,
-  InternalFeedError.ROOT_NOT_BOUND_TO_FEATURE,
-  InternalFeedError.NEXT_VALUE
-})
-public @interface InternalFeedError {
-
-  /** Represents when memory fails so the Feed libraries switch to ephemeral mode. */
-  int SWITCH_TO_EPHEMERAL = 0;
-
-  /** Represents when opening a URL fails as there is no URL available. */
-  int NO_URL_FOR_OPEN = 1;
-
-  /** Represents a failure to restore. */
-  int FAILED_TO_RESTORE = 2;
-
-  /** Represents getting a session with no root feature. */
-  int NO_ROOT_FEATURE = 3;
-
-  /** Represents a top level child being unbound when initializing. */
-  int TOP_LEVEL_UNBOUND_CHILD = 4;
-
-  /** Represents a top level feature being neither a card nor a cluster. */
-  int TOP_LEVEL_INVALID_FEATURE_TYPE = 5;
-
-  /** Represents a child of a cluster not having a feature. */
-  int CLUSTER_CHILD_MISSING_FEATURE = 6;
-
-  /** Represents a child of a cluster not being a card. */
-  int CLUSTER_CHILD_NOT_CARD = 7;
-
-  /** Represents a child of a card not having a feature. */
-  int CARD_CHILD_MISSING_FEATURE = 8;
-
-  /** Represents a failure to load shared states for Piet content. */
-  int NULL_SHARED_STATES = 9;
-
-  /** Represents a failure to create a leaf child. */
-  int FAILED_TO_CREATE_LEAF = 10;
-
-  /** Represents a token that could not be handled. */
-  int UNHANDLED_TOKEN = 11;
-
-  /**
-   * Represents that the task queue timed out waiting for a network request and began executing
-   * queued tasks.
-   */
-  int TASK_QUEUE_STARVATION = 12;
-
-  /** Represents a call to ContentStorage that returned with a missing item. */
-  int CONTENT_STORAGE_MISSING_ITEM = 13;
-
-  /** Represents bytes from ContentStorage that cannot be parsed into the proto. */
-  int ITEM_NOT_PARSED = 14;
-
-  /**
-   * Represents a storage miss where FeedStore reports success but is missing a number of items that
-   * exceeds the configurable threshold.
-   */
-  int STORAGE_MISS_BEYOND_THRESHOLD = 15;
-
-  /** Represents a failed content mutation in FeedSessionManager. */
-  int CONTENT_MUTATION_FAILED = 16;
-
-  /** Represents a root feature that is not bound as expected. */
-  int ROOT_NOT_BOUND_TO_FEATURE = 17;
-
-  /** The next value that should be used when adding additional values to the IntDef. */
-  int NEXT_VALUE = 18;
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/logging/LoggingApi.java b/src/main/java/com/google/android/libraries/feed/api/host/logging/LoggingApi.java
deleted file mode 100644
index 584cfab..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/logging/LoggingApi.java
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.logging;
-
-/** A placeholder API to write log messages. */
-public interface LoggingApi {}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/logging/RequestReason.java b/src/main/java/com/google/android/libraries/feed/api/host/logging/RequestReason.java
deleted file mode 100644
index 2250ca8..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/logging/RequestReason.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.logging;
-
-import android.support.annotation.IntDef;
-
-/**
- * The reason a request is being made.
- *
- * <p>When adding new values, the value of {@link RequestReason#NEXT_VALUE} should be used and
- * incremented. When removing values, {@link RequestReason#NEXT_VALUE} should not be changed, and
- * those values should not be reused.
- */
-@IntDef({
-  RequestReason.UNKNOWN,
-  RequestReason.ZERO_STATE,
-  RequestReason.HOST_REQUESTED,
-  RequestReason.OPEN_WITH_CONTENT,
-  RequestReason.MANUAL_CONTINUATION,
-  RequestReason.AUTOMATIC_CONTINUATION,
-  RequestReason.OPEN_WITHOUT_CONTENT,
-  RequestReason.CLEAR_ALL,
-  RequestReason.NEXT_VALUE,
-})
-public @interface RequestReason {
-
-  // An unknown refresh reason.
-  int UNKNOWN = 0;
-
-  // Refresh triggered because the user manually hit the refresh button from the
-  // zero-state.
-  int ZERO_STATE = 1;
-
-  // Refresh triggered because the host requested a refresh.
-  int HOST_REQUESTED = 2;
-
-  // Refresh triggered because there was stale content. The stale content was
-  // shown while a background refresh would occur, which would be appended below
-  // content the user had seen.
-  int OPEN_WITH_CONTENT = 3;
-
-  // Refresh triggered because the user tapped on a 'More' button.
-  int MANUAL_CONTINUATION = 4;
-
-  // Refresh triggered via automatically consuming a continuation token, without
-  // showing the user a 'More' button.
-  int AUTOMATIC_CONTINUATION = 5;
-
-  // Refresh made when the Stream starts up and no content is showing.
-  int OPEN_WITHOUT_CONTENT = 6;
-
-  // Refresh made because the host requested a clear all.
-  int CLEAR_ALL = 7;
-
-  // The next value that should be used when adding additional values to the IntDef.
-  int NEXT_VALUE = 8;
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/logging/ScrollType.java b/src/main/java/com/google/android/libraries/feed/api/host/logging/ScrollType.java
deleted file mode 100644
index 6bf7c9c..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/logging/ScrollType.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2019 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.logging;
-
-import android.support.annotation.IntDef;
-
-/** IntDef representing the different types of scrolls. */
-@IntDef({ScrollType.UNKNOWN, ScrollType.STREAM_SCROLL, ScrollType.NEXT_VALUE})
-public @interface ScrollType {
-  // Type of scroll that occurs
-  int UNKNOWN = 0;
-  // Scroll the stream of cards
-  int STREAM_SCROLL = 1;
-  int NEXT_VALUE = 2;
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/logging/SessionEvent.java b/src/main/java/com/google/android/libraries/feed/api/host/logging/SessionEvent.java
deleted file mode 100644
index 49495a2..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/logging/SessionEvent.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.logging;
-
-import android.support.annotation.IntDef;
-
-/**
- * IntDef representing the different results of requesting sessions.
- *
- * <p>When adding new values, the value of {@link SessionEvent#NEXT_VALUE} should be used and
- * incremented. When removing values, {@link SessionEvent#NEXT_VALUE} should not be changed, and
- * those values should not be reused.
- */
-@IntDef({
-  SessionEvent.STARTED,
-  SessionEvent.FINISHED_IMMEDIATELY,
-  SessionEvent.ERROR,
-  SessionEvent.USER_ABANDONED,
-  SessionEvent.NEXT_VALUE,
-})
-public @interface SessionEvent {
-
-  // Indicates that a session was successfully started when requested.
-  int STARTED = 0;
-
-  // Indicates that a session was immediately finished when requested.
-  int FINISHED_IMMEDIATELY = 1;
-
-  // Indicates that a session failed when requested.
-  int ERROR = 2;
-
-  // Indicates the session requested was abandoned by the user taking action.
-  // Note: some of these events will be dropped, as they will be reported in
-  // onDestroy(), which may not be called in all instances.
-  int USER_ABANDONED = 3;
-
-  // The next value that should be used when adding additional values to the IntDef.
-  int NEXT_VALUE = 4;
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/logging/SpinnerType.java b/src/main/java/com/google/android/libraries/feed/api/host/logging/SpinnerType.java
deleted file mode 100644
index 9f84b79..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/logging/SpinnerType.java
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.logging;
-
-import android.support.annotation.IntDef;
-
-/**
- * IntDef representing the different types of spinners.
- *
- * <p>When adding new values, the value of {@link SpinnerType#NEXT_VALUE} should be used and
- * incremented. When removing values, {@link SpinnerType#NEXT_VALUE} should not be changed, and
- * those values should not be reused.
- */
-@IntDef({
-  SpinnerType.INITIAL_LOAD,
-  SpinnerType.ZERO_STATE_REFRESH,
-  SpinnerType.MORE_BUTTON,
-  SpinnerType.SYNTHETIC_TOKEN,
-  SpinnerType.INFINITE_FEED,
-  SpinnerType.NEXT_VALUE,
-})
-public @interface SpinnerType {
-  // Spinner shown on initial load of the Feed.
-  int INITIAL_LOAD = 1;
-  // Spinner shown when Feed is refreshed.
-  int ZERO_STATE_REFRESH = 2;
-  // Spinner shown when more button is clicked.
-  int MORE_BUTTON = 3;
-  // Spinner shown when a synthetic token is consumed.
-  int SYNTHETIC_TOKEN = 4;
-  // Spinner shown when a spinner is shown for loading the infinite feed.
-  int INFINITE_FEED = 5;
-  // The next value that should be used when adding additional values to the IntDef.
-  int NEXT_VALUE = 6;
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/logging/Task.java b/src/main/java/com/google/android/libraries/feed/api/host/logging/Task.java
deleted file mode 100644
index 026e054..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/logging/Task.java
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.logging;
-
-import android.support.annotation.IntDef;
-
-/**
- * IntDef representing the different tasks that can be queued on the {@link
- * com.google.android.libraries.feed.common.concurrent.TaskQueue}.
- *
- * <p>When adding new values, the value of {@link Task#NEXT_VALUE} should be used and incremented.
- * When removing values, {@link Task#NEXT_VALUE} should not be changed, and those values should not
- * be reused.
- */
-@IntDef({
-  Task.UNKNOWN,
-  Task.CLEAN_UP_SESSION_JOURNALS,
-  Task.CLEAR_ALL,
-  Task.CLEAR_ALL_WITH_REFRESH,
-  Task.CLEAR_PERSISTENT_STORE_TASK,
-  Task.COMMIT_TASK,
-  Task.CREATE_AND_UPLOAD,
-  Task.DETACH_SESSION,
-  Task.DISMISS_LOCAL,
-  Task.DUMP_EPHEMERAL_ACTIONS,
-  Task.EXECUTE_UPLOAD_ACTION_REQUEST,
-  Task.GARBAGE_COLLECT_CONTENT,
-  Task.GET_EXISTING_SESSION,
-  Task.GET_NEW_SESSION,
-  Task.GET_STREAM_FEATURES_FROM_HEAD,
-  Task.HANDLE_RESPONSE_BYTES,
-  Task.HANDLE_SYNTHETIC_TOKEN,
-  Task.HANDLE_TOKEN,
-  Task.HANDLE_UPLOADABLE_ACTION_RESPONSE_BYTES,
-  Task.INVALIDATE_HEAD,
-  Task.INVALIDATE_SESSION,
-  Task.LOCAL_ACTION_GC,
-  Task.NO_CARD_ERROR_CLEAR,
-  Task.PERSIST_MUTATION,
-  Task.POPULATE_NEW_SESSION,
-  Task.REQUEST_FAILURE,
-  Task.REQUEST_MANAGER_TRIGGER_REFRESH,
-  Task.SEND_REQUEST,
-  Task.SESSION_MANAGER_TRIGGER_REFRESH,
-  Task.SESSION_MUTATION,
-  Task.TASK_QUEUE_INITIALIZE,
-  Task.UPLOAD_ALL_ACTIONS_FOR_URL,
-  Task.NEXT_VALUE,
-})
-public @interface Task {
-
-  // Unknown task.
-  int UNKNOWN = 0;
-
-  int CLEAN_UP_SESSION_JOURNALS = 1;
-  int CLEAR_ALL = 2;
-  int CLEAR_ALL_WITH_REFRESH = 3;
-  int CLEAR_PERSISTENT_STORE_TASK = 4;
-  int COMMIT_TASK = 5;
-  int CREATE_AND_UPLOAD = 6;
-  int DETACH_SESSION = 7;
-  int DISMISS_LOCAL = 8;
-  int DUMP_EPHEMERAL_ACTIONS = 9;
-  int EXECUTE_UPLOAD_ACTION_REQUEST = 10;
-  int GARBAGE_COLLECT_CONTENT = 11;
-  int GET_EXISTING_SESSION = 12;
-  int GET_NEW_SESSION = 13;
-  int GET_STREAM_FEATURES_FROM_HEAD = 14;
-  int HANDLE_RESPONSE_BYTES = 15;
-  int HANDLE_SYNTHETIC_TOKEN = 16;
-  int HANDLE_TOKEN = 17;
-  int HANDLE_UPLOADABLE_ACTION_RESPONSE_BYTES = 18;
-  int INVALIDATE_HEAD = 19;
-  int INVALIDATE_SESSION = 20;
-  int LOCAL_ACTION_GC = 21;
-  int NO_CARD_ERROR_CLEAR = 22;
-  int PERSIST_MUTATION = 23;
-  int POPULATE_NEW_SESSION = 24;
-  int REQUEST_FAILURE = 25;
-  int REQUEST_MANAGER_TRIGGER_REFRESH = 26;
-  int SEND_REQUEST = 27;
-  int SESSION_MANAGER_TRIGGER_REFRESH = 28;
-  int SESSION_MUTATION = 29;
-  int TASK_QUEUE_INITIALIZE = 30;
-  int UPLOAD_ALL_ACTIONS_FOR_URL = 32;
-
-  // The next value that should be used when adding additional values to the IntDef.
-  int NEXT_VALUE = 33;
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/logging/ZeroStateShowReason.java b/src/main/java/com/google/android/libraries/feed/api/host/logging/ZeroStateShowReason.java
deleted file mode 100644
index 83d8afb..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/logging/ZeroStateShowReason.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.logging;
-
-import android.support.annotation.IntDef;
-
-/**
- * The reason a zero state is shown.
- *
- * <p>When adding new values, the value of {@link ZeroStateShowReason#NEXT_VALUE} should be used and
- * incremented. When removing values, {@link ZeroStateShowReason#NEXT_VALUE} should not be changed,
- * and those values should not be reused.
- */
-@IntDef({
-  ZeroStateShowReason.ERROR,
-  ZeroStateShowReason.NO_CONTENT,
-  ZeroStateShowReason.CONTENT_DISMISSED,
-  ZeroStateShowReason.NO_CONTENT_FROM_CONTINUATION_TOKEN,
-  ZeroStateShowReason.NEXT_VALUE,
-})
-public @interface ZeroStateShowReason {
-
-  // Indicates the zero state was shown due to an error. This would most commonly happen if a
-  // request fails.
-  int ERROR = 0;
-
-  // Indicates the zero state was shown because no content is available. This can happen if the host
-  // does not schedule a refresh when the app is opened.
-  int NO_CONTENT = 1;
-
-  // Indicates the zero state was shown because all content, including any tokens, were dismissed.
-  int CONTENT_DISMISSED = 2;
-
-  // Indicates that the only content showing was a continuation token, and that token completed with
-  // no additional content, resulting in no content showing. This shouldn't occur, as a token should
-  // at least return another token.
-  int NO_CONTENT_FROM_CONTINUATION_TOKEN = 3;
-
-  // The next value that should be used when adding additional values to the IntDef.
-  int NEXT_VALUE = 4;
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/network/BUILD b/src/main/java/com/google/android/libraries/feed/api/host/network/BUILD
deleted file mode 100644
index a7fcd63..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/network/BUILD
+++ /dev/null
@@ -1,12 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "network",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-        "@maven//:com_android_support_support_annotations",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/network/HttpHeader.java b/src/main/java/com/google/android/libraries/feed/api/host/network/HttpHeader.java
deleted file mode 100644
index 7452f02..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/network/HttpHeader.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.network;
-
-import android.support.annotation.StringDef;
-
-public final class HttpHeader {
-
-  /** These string values correspond with the actual header name. */
-  @StringDef({
-    HttpHeaderName.X_PROTOBUFFER_REQUEST_PAYLOAD,
-  })
-  public @interface HttpHeaderName {
-    String X_PROTOBUFFER_REQUEST_PAYLOAD = "X-Protobuffer-Request-Payload";
-  }
-
-  public HttpHeader(@HttpHeaderName String name, String value) {
-    this.name = name;
-    this.value = value;
-  }
-
-  public final @HttpHeaderName String name;
-  public final String value;
-
-  public @HttpHeaderName String getName() {
-    return name;
-  }
-
-  public String getValue() {
-    return value;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/network/HttpRequest.java b/src/main/java/com/google/android/libraries/feed/api/host/network/HttpRequest.java
deleted file mode 100644
index 41303d3..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/network/HttpRequest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.network;
-
-import android.net.Uri;
-import android.support.annotation.StringDef;
-import java.net.HttpURLConnection;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/** Representation of an HTTP request. */
-public final class HttpRequest {
-
-  /**
-   * These string values line up with HTTP method values, see {@link
-   * HttpURLConnection#setRequestMethod(String)}.
-   */
-  @StringDef({
-    HttpMethod.GET,
-    HttpMethod.POST,
-    HttpMethod.PUT,
-    HttpMethod.DELETE,
-  })
-  public @interface HttpMethod {
-    String GET = "GET";
-    String POST = "POST";
-    String PUT = "PUT";
-    String DELETE = "DELETE";
-  }
-
-  private final Uri uri;
-  private final byte[] body;
-  private final @HttpMethod String method;
-  private final List<HttpHeader> headers;
-
-  public HttpRequest(Uri uri, @HttpMethod String method, List<HttpHeader> headers, byte[] body) {
-    this.uri = uri;
-    this.body = body;
-    this.method = method;
-    this.headers = Collections.unmodifiableList(new ArrayList<>(headers));
-  }
-
-  public Uri getUri() {
-    return uri;
-  }
-
-  public byte[] getBody() {
-    return body;
-  }
-
-  public @HttpMethod String getMethod() {
-    return method;
-  }
-
-  public List<HttpHeader> getHeaders() {
-    return headers;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/network/HttpResponse.java b/src/main/java/com/google/android/libraries/feed/api/host/network/HttpResponse.java
deleted file mode 100644
index 3ab33a5..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/network/HttpResponse.java
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.network;
-
-/** Representation of an HTTP response. */
-public final class HttpResponse {
-  private final int responseCode;
-  private final byte[] responseBody;
-
-  public HttpResponse(int responseCode, byte[] responseBody) {
-    this.responseCode = responseCode;
-    this.responseBody = responseBody;
-  }
-
-  /**
-   * Gets the response code for the response.
-   *
-   * <p>Note: this does not have to correspond to an HTTP response code, e.g. if there is a network
-   * issue and no request was able to be sent.
-   */
-  public int getResponseCode() {
-    return responseCode;
-  }
-
-  /** Gets the body for the response. */
-  public byte[] getResponseBody() {
-    return responseBody;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/network/NetworkClient.java b/src/main/java/com/google/android/libraries/feed/api/host/network/NetworkClient.java
deleted file mode 100644
index 0bf0f54..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/network/NetworkClient.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.network;
-
-import com.google.android.libraries.feed.common.functional.Consumer;
-
-/**
- * An object that can send an {@link HttpRequest} and receive an {@link HttpResponse} in response.
- */
-public interface NetworkClient extends AutoCloseable {
-
-  /**
-   * Sends the HttpRequest. Upon completion, asynchronously calls the consumer with the
-   * HttpResponse.
-   *
-   * <p>Requests and responses should be uncompressed when in the Feed. It is up to the host to gzip
-   * / ungzip any requests or responses.
-   *
-   * @param request The request to send
-   * @param responseConsumer The callback to be used when the response comes back.
-   */
-  void send(HttpRequest request, Consumer<HttpResponse> responseConsumer);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/offlineindicator/BUILD b/src/main/java/com/google/android/libraries/feed/api/host/offlineindicator/BUILD
deleted file mode 100644
index d4c395d..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/offlineindicator/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "offlineindicator",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/offlineindicator/OfflineIndicatorApi.java b/src/main/java/com/google/android/libraries/feed/api/host/offlineindicator/OfflineIndicatorApi.java
deleted file mode 100644
index 0e75761..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/offlineindicator/OfflineIndicatorApi.java
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.offlineindicator;
-
-import com.google.android.libraries.feed.common.functional.Consumer;
-import java.util.List;
-
-/** Api to allow the Feed to get information about offline availability status of content. */
-public interface OfflineIndicatorApi {
-
-  /**
-   * Requests information on the offline status of content shown in the Feed.
-   *
-   * @param urlsToRetrieve list of urls we want to know about.
-   * @param urlListConsumer subset of {@code urlsToRetrieve} which are available offline.
-   */
-  void getOfflineStatus(List<String> urlsToRetrieve, Consumer<List<String>> urlListConsumer);
-
-  /** Adds a listener for changes to the offline availability of content. */
-  void addOfflineStatusListener(OfflineStatusListener offlineStatusListener);
-
-  /** Removes listener for changes the offline availability of content. */
-  void removeOfflineStatusListener(OfflineStatusListener offlineStatusListener);
-
-  /** Listener for changes in the offline availability of content. */
-  interface OfflineStatusListener {
-    void updateOfflineStatus(String url, boolean availableOffline);
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/proto/BUILD b/src/main/java/com/google/android/libraries/feed/api/host/proto/BUILD
deleted file mode 100644
index 5cb3dea..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/proto/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "proto",
-    srcs = glob(["*.java"]),
-    deps = [
-        "@com_google_protobuf_javalite//:protobuf_java_lite",  # buildcleaner: keep
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/proto/ProtoExtensionProvider.java b/src/main/java/com/google/android/libraries/feed/api/host/proto/ProtoExtensionProvider.java
deleted file mode 100644
index 6c10aa9..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/proto/ProtoExtensionProvider.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.proto;
-
-import com.google.protobuf.GeneratedMessageLite.GeneratedExtension;
-import java.util.List;
-
-/** Allows the host application to register proto extensions in the Feed's global registry. */
-public interface ProtoExtensionProvider {
-  /**
-   * The Feed will call this method on startup. Any proto extensions that will need to be serialized
-   * by the Feed should be returned at that time.
-   *
-   * @return a list of the proto extensions the host application will use in the Feed.
-   */
-  List<GeneratedExtension<?, ?>> getProtoExtensions();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/scheduler/BUILD b/src/main/java/com/google/android/libraries/feed/api/host/scheduler/BUILD
deleted file mode 100644
index 91eee4d..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/scheduler/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "scheduler",
-    srcs = glob(["*.java"]),
-    deps = [
-        "@maven//:com_android_support_support_annotations",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/scheduler/SchedulerApi.java b/src/main/java/com/google/android/libraries/feed/api/host/scheduler/SchedulerApi.java
deleted file mode 100644
index bea1f61..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/scheduler/SchedulerApi.java
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.scheduler;
-
-import android.support.annotation.IntDef;
-
-/** Allows host to change behavior based on Feed requests and their status */
-public interface SchedulerApi {
-  /**
-   * Define the request behavior of when a new session is created.
-   *
-   * <ul>
-   *   <li>UNKNOWN - Default invalid value, this should not be returned.
-   *   <li>REQUEST_WITH_WAIT - Make a request and then wait for it to complete before showing any
-   *       content in the Stream.
-   *   <li>REQUEST_WITH_CONTENT - Show the user the existing content and make a request. When the
-   *       response completes, append the content below any content seen by the user, removing the
-   *       old content below that level.
-   *   <li>REQUEST_WITH_TIMEOUT - Make a request and if the response takes longer than the
-   *       configured timeout, show existing content. When the response completes, the new content
-   *       will be displayed below any content the user has viewed.
-   *   <li>NO_REQUEST_WITH_WAIT - Show the current content, if an existing request is being made,
-   *       wait for it to complete.
-   *   <li>NO_REQUEST_WITH_CONTENT - Show the existing content, don't wait if a request is currently
-   *       being made.
-   *   <li>NO_REQUEST_WITH_TIMEOUT - Show the current content. If an existing request is being made,
-   *       wait for the configured timeout for it to complete. When the response completes, the new
-   *       content will be displayed below any content the user has viewed.
-   * </ul>
-   *
-   * <p>When adding new values, the value of {@link RequestBehavior#NEXT_VALUE} should be used and
-   * incremented. When removing values, {@link RequestBehavior#NEXT_VALUE} should not be changed,
-   * and those values should not be reused.
-   */
-  @IntDef({
-    RequestBehavior.UNKNOWN,
-    RequestBehavior.REQUEST_WITH_WAIT,
-    RequestBehavior.REQUEST_WITH_CONTENT,
-    RequestBehavior.REQUEST_WITH_TIMEOUT,
-    RequestBehavior.NO_REQUEST_WITH_WAIT,
-    RequestBehavior.NO_REQUEST_WITH_CONTENT,
-    RequestBehavior.NO_REQUEST_WITH_TIMEOUT,
-    RequestBehavior.NEXT_VALUE,
-  })
-  @interface RequestBehavior {
-    int UNKNOWN = 0;
-    int REQUEST_WITH_WAIT = 1;
-    int REQUEST_WITH_CONTENT = 2;
-    int REQUEST_WITH_TIMEOUT = 3;
-    int NO_REQUEST_WITH_WAIT = 4;
-    int NO_REQUEST_WITH_CONTENT = 5;
-    int NO_REQUEST_WITH_TIMEOUT = 6;
-    int NEXT_VALUE = 7;
-  }
-
-  /** Object which contains the current state of the session. */
-  final class SessionState {
-    /** Does the session have content? */
-    public final boolean hasContent;
-    /**
-     * Returns the date/time of when the content was added. This will only be set when {@code
-     * hasContent == true},
-     */
-    public final long contentCreationDateTimeMs;
-    /** Is there an outstanding request being made? */
-    public final boolean hasOutstandingRequest;
-
-    public SessionState(
-        boolean hasContent, long contentCreationDateTimeMs, boolean hasOutstandingRequest) {
-      this.hasContent = hasContent;
-      this.contentCreationDateTimeMs = contentCreationDateTimeMs;
-      this.hasOutstandingRequest = hasOutstandingRequest;
-    }
-  }
-
-  /** Called when a Session is created to determine what behavior we should implement. */
-  @RequestBehavior
-  int shouldSessionRequestData(SessionState sessionState);
-
-  /** Notify scheduler that new content has been received. */
-  void onReceiveNewContent(long contentCreationDateTimeMs);
-
-  /** Notify scheduler that an error occurred while handling a request. */
-  void onRequestError(int networkResponseCode);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/storage/BUILD b/src/main/java/com/google/android/libraries/feed/api/host/storage/BUILD
deleted file mode 100644
index 2f08ef1..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/storage/BUILD
+++ /dev/null
@@ -1,14 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "storage",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/common",
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-        "@com_google_code_findbugs_jsr305//jar",
-        "@maven//:com_android_support_support_annotations",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/storage/CommitResult.java b/src/main/java/com/google/android/libraries/feed/api/host/storage/CommitResult.java
deleted file mode 100644
index 91ce466..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/storage/CommitResult.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.storage;
-
-import android.support.annotation.IntDef;
-
-/** Status after completion of a commit to storage. */
-public final class CommitResult {
-
-  /** IntDef that defines result values. */
-  @IntDef({Result.SUCCESS, Result.FAILURE})
-  public @interface Result {
-    int SUCCESS = 0;
-    int FAILURE = 1;
-  }
-
-  public @Result int getResult() {
-    return result;
-  }
-
-  private final @Result int result;
-
-  // Private constructor - use static instances
-  private CommitResult(@Result int result) {
-    this.result = result;
-  }
-
-  public static final CommitResult SUCCESS = new CommitResult(Result.SUCCESS);
-  public static final CommitResult FAILURE = new CommitResult(Result.FAILURE);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentMutation.java b/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentMutation.java
deleted file mode 100644
index 57ba920..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentMutation.java
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.storage;
-
-import com.google.android.libraries.feed.api.host.storage.ContentOperation.Delete;
-import com.google.android.libraries.feed.api.host.storage.ContentOperation.DeleteAll;
-import com.google.android.libraries.feed.api.host.storage.ContentOperation.DeleteByPrefix;
-import com.google.android.libraries.feed.api.host.storage.ContentOperation.Upsert;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A sequence of {@link ContentOperation} instances. This class is used to commit changes to {@link
- * ContentStorage}.
- */
-public final class ContentMutation {
-  private final List<ContentOperation> operations;
-
-  private ContentMutation(List<ContentOperation> operations) {
-    this.operations = Collections.unmodifiableList(operations);
-  }
-
-  /** An unmodifiable list of operations to be committed by {@link ContentStorage}. */
-  public List<ContentOperation> getOperations() {
-    return operations;
-  }
-
-  /**
-   * Creates a {@link ContentMutation}, which can be used to apply mutations to the underlying
-   * {@link ContentStorage}.
-   */
-  public static final class Builder {
-    private final ArrayList<ContentOperation> operations = new ArrayList<>();
-    private final ContentOperationListSimplifier simplifier = new ContentOperationListSimplifier();
-
-    /**
-     * Sets the key/value pair in {@link ContentStorage}, or inserts it if it doesn't exist.
-     *
-     * <p>This method can be called repeatedly to assign multiple key/values. If the same key is
-     * assigned multiple times, only the last value will be persisted.
-     */
-    public Builder upsert(String key, byte[] value) {
-      operations.add(new Upsert(key, value));
-      return this;
-    }
-
-    /**
-     * Deletes the value from {@link ContentStorage} with a matching key, if it exists.
-     *
-     * <p>{@link ContentStorage#commit(ContentMutation)} will fulfill with result is {@code TRUE},
-     * even if {@code key} is not found in {@link ContentStorage}.
-     *
-     * <p>If {@link Delete} and {@link Upsert} are committed for the same key, only the last
-     * operation will take effect.
-     */
-    public Builder delete(String key) {
-      operations.add(new Delete(key));
-      return this;
-    }
-
-    /**
-     * Deletes all values from {@link ContentStorage} with matching key prefixes.
-     *
-     * <p>{@link ContentStorage#commit(ContentMutation)} will fulfill with result equal to {@code
-     * TRUE}, even if no keys have a matching prefix.
-     *
-     * <p>If {@link DeleteByPrefix} and {@link Upsert} are committed for the same matching key, only
-     * the last operation will take effect.
-     */
-    public Builder deleteByPrefix(String prefix) {
-      operations.add(new DeleteByPrefix(prefix));
-      return this;
-    }
-
-    /** Deletes all values from {@link ContentStorage}. */
-    public Builder deleteAll() {
-      operations.add(new DeleteAll());
-      return this;
-    }
-
-    /**
-     * Simplifies the sequence of {@link ContentOperation} instances, and returns a new {@link
-     * ContentMutation} the simplified list.
-     */
-    public ContentMutation build() {
-      return new ContentMutation(simplifier.simplify(operations));
-    }
-  }
-
-  @Override
-  public boolean equals(/*@Nullable*/ Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    ContentMutation that = (ContentMutation) o;
-
-    return operations != null ? operations.equals(that.operations) : that.operations == null;
-  }
-
-  @Override
-  public int hashCode() {
-    return operations != null ? operations.hashCode() : 0;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentOperation.java b/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentOperation.java
deleted file mode 100644
index 3820a08..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentOperation.java
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.storage;
-
-import android.support.annotation.IntDef;
-import java.util.Arrays;
-
-/** A mutation to the underlying {@link ContentStorage}. */
-public abstract class ContentOperation {
-  /** The types of operations. */
-  @IntDef({Type.DELETE, Type.DELETE_BY_PREFIX, Type.UPSERT, Type.DELETE_ALL})
-  public @interface Type {
-    /** Delete the content for the provided key */
-    int DELETE = 0;
-    /** Delete all content with keys beginning with the specified prefix */
-    int DELETE_BY_PREFIX = 1;
-    /** Insert or update the content for the provided key */
-    int UPSERT = 3;
-    /** Delete all content for all keys. */
-    int DELETE_ALL = 4;
-  }
-
-  public @Type int getType() {
-    return type;
-  }
-
-  private final @Type int type;
-
-  // Only the following classes may extend ContentOperation
-  private ContentOperation(@Type int type) {
-    this.type = type;
-  }
-
-  /**
-   * A {@link ContentOperation} created by calling {@link ContentMutation.Builder#upsert(String,
-   * byte[])}.
-   */
-  public static final class Upsert extends ContentOperation {
-    private final String key;
-    private final byte[] value;
-
-    Upsert(String key, byte[] value) {
-      super(Type.UPSERT);
-      this.key = key;
-      this.value = value;
-    }
-
-    public String getKey() {
-      return key;
-    }
-
-    public byte[] getValue() {
-      return value;
-    }
-
-    @Override
-    public boolean equals(/*@Nullable*/ Object o) {
-      if (!super.equals(o)) {
-        return false;
-      }
-
-      if (o instanceof Upsert) {
-        Upsert upsert = (Upsert) o;
-        return key.equals(upsert.key) && Arrays.equals(value, upsert.value);
-      } else {
-        return false;
-      }
-    }
-
-    @Override
-    public int hashCode() {
-      int result = key.hashCode();
-      result = 31 * result + Arrays.hashCode(value);
-      return result;
-    }
-  }
-
-  /**
-   * A {@link ContentOperation} created by calling {@link ContentMutation.Builder#delete(String)}.
-   */
-  public static final class Delete extends ContentOperation {
-    private final String key;
-
-    Delete(String key) {
-      super(Type.DELETE);
-      this.key = key;
-    }
-
-    public String getKey() {
-      return key;
-    }
-
-    @Override
-    public boolean equals(/*@Nullable*/ Object o) {
-      if (!super.equals(o)) {
-        return false;
-      }
-
-      if (o instanceof Delete) {
-        Delete delete = (Delete) o;
-        return key.equals(delete.key);
-      } else {
-        return false;
-      }
-    }
-
-    @Override
-    public int hashCode() {
-      return key.hashCode();
-    }
-  }
-
-  /**
-   * A {@link ContentOperation} created by calling {@link
-   * ContentMutation.Builder#deleteByPrefix(String)}.
-   */
-  public static final class DeleteByPrefix extends ContentOperation {
-    private final String prefix;
-
-    DeleteByPrefix(String prefix) {
-      super(Type.DELETE_BY_PREFIX);
-      this.prefix = prefix;
-    }
-
-    public String getPrefix() {
-      return prefix;
-    }
-
-    @Override
-    public boolean equals(/*@Nullable*/ Object o) {
-      if (!super.equals(o)) {
-        return false;
-      }
-
-      if (o instanceof DeleteByPrefix) {
-        DeleteByPrefix that = (DeleteByPrefix) o;
-        return prefix.equals(that.prefix);
-      } else {
-        return false;
-      }
-    }
-
-    @Override
-    public int hashCode() {
-      return prefix.hashCode();
-    }
-  }
-
-  // TODO: replace these comments with better details
-  /** A {@link ContentOperation} created by calling {@link ContentMutation.Builder#deleteAll()} */
-  static final class DeleteAll extends ContentOperation {
-    DeleteAll() {
-      super(Type.DELETE_ALL);
-    }
-  }
-
-  @Override
-  public boolean equals(/*@Nullable*/ Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (!(o instanceof ContentOperation)) {
-      return false;
-    }
-
-    ContentOperation operation = (ContentOperation) o;
-
-    return type == operation.type;
-  }
-
-  @Override
-  public int hashCode() {
-    return type;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentOperationListSimplifier.java b/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentOperationListSimplifier.java
deleted file mode 100644
index 18b95ff..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentOperationListSimplifier.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.storage;
-
-import java.util.List;
-
-/**
- * Simplifies a {@link List<ContentOperation>} by combining and removing Operations according to the
- * methods in {@link ContentMutation.Builder}.
- */
-final class ContentOperationListSimplifier {
-  /**
-   * Returns a new {@link List<ContentOperation>}, which is a simplification of {@code
-   * contentOperations}.
-   *
-   * <p>The returned list will have a length at most equal to {@code contentOperations}.
-   */
-  List<ContentOperation> simplify(List<ContentOperation> contentOperations) {
-    // TODO: implement
-    return contentOperations;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentStorage.java b/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentStorage.java
deleted file mode 100644
index 5ce8cb5..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentStorage.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.storage;
-
-import com.google.android.libraries.feed.common.Result;
-import com.google.android.libraries.feed.common.functional.Consumer;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Allows reading and writing of content, currently key-value pairs.
- *
- * <p>Storage instances can be accessed from multiple threads.
- */
-public interface ContentStorage {
-
-  /**
-   * Asynchronously requests the value for multiple keys. If a key does not have a value, it will
-   * not be included in the map.
-   */
-  void get(List<String> keys, Consumer<Result<Map<String, byte[]>>> consumer);
-
-  /** Asynchronously requests all key/value pairs from storage with a matching key prefix. */
-  void getAll(String prefix, Consumer<Result<Map<String, byte[]>>> consumer);
-
-  /**
-   * Commits the operations in the {@link ContentMutation} in order and asynchronously reports the
-   * {@link CommitResult}.
-   *
-   * <p>This operation is not guaranteed to be atomic. In the event of a failure, processing is
-   * halted immediately, so the database may be left in an invalid state. Should this occur, Feed
-   * behavior is undefined. Currently the plan is to wipe out existing data and start over.
-   */
-  void commit(ContentMutation mutation, Consumer<CommitResult> consumer);
-
-  /** Fetch all keys currently present in the content storage */
-  void getAllKeys(Consumer<Result<List<String>>> consumer);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentStorageDirect.java b/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentStorageDirect.java
deleted file mode 100644
index b5dcccc..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/storage/ContentStorageDirect.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.storage;
-
-import com.google.android.libraries.feed.common.Result;
-import java.util.List;
-import java.util.Map;
-
-/** A content storage API which is a synchronous implementation of {@link ContentStorage}. */
-public interface ContentStorageDirect {
-
-  /**
-   * Requests the value for multiple keys. If a key does not have a value, it will not be included
-   * in the map.
-   */
-  Result<Map<String, byte[]>> get(List<String> keys);
-
-  /** Requests all key/value pairs from storage with a matching key prefix. */
-  Result<Map<String, byte[]>> getAll(String prefix);
-
-  /**
-   * Commits the operations in the {@link ContentMutation} in order.
-   *
-   * <p>This operation is not guaranteed to be atomic. In the event of a failure, processing is
-   * halted immediately, so the database may be left in an invalid state. Should this occur, Feed
-   * behavior is undefined. Currently the plan is to wipe out existing data and start over.
-   */
-  CommitResult commit(ContentMutation mutation);
-
-  /** Fetch all keys currently present in the content storage */
-  Result<List<String>> getAllKeys();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/storage/JournalMutation.java b/src/main/java/com/google/android/libraries/feed/api/host/storage/JournalMutation.java
deleted file mode 100644
index 1a5da0a..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/storage/JournalMutation.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.storage;
-
-import com.google.android.libraries.feed.api.host.storage.JournalOperation.Append;
-import com.google.android.libraries.feed.api.host.storage.JournalOperation.Copy;
-import com.google.android.libraries.feed.api.host.storage.JournalOperation.Delete;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A mutation described by a journal name and a sequence of {@link JournalOperation} instances. This
- * class is used to commit changes to a journal in {@link JournalStorage}.
- */
-public final class JournalMutation {
-  private final String journalName;
-  private final List<JournalOperation> operations;
-
-  private JournalMutation(String journalName, List<JournalOperation> operations) {
-    this.journalName = journalName;
-    this.operations = Collections.unmodifiableList(operations);
-  }
-
-  /** An unmodifiable list of operations to be committed by {@link JournalStorage}. */
-  public List<JournalOperation> getOperations() {
-    return operations;
-  }
-
-  /** The name of the journal this mutation should be applied to. */
-  public String getJournalName() {
-    return journalName;
-  }
-
-  /**
-   * Creates a {@link JournalMutation}, which can be used to apply mutations to a journal in the
-   * underlying {@link JournalStorage}.
-   */
-  public static final class Builder {
-    private final ArrayList<JournalOperation> operations = new ArrayList<>();
-    private final String journalName;
-
-    public Builder(String journalName) {
-      this.journalName = journalName;
-    }
-
-    /**
-     * Appends {@code value} to the journal in {@link JournalStorage}.
-     *
-     * <p>This method can be called repeatedly to append multiple times.
-     */
-    public Builder append(byte[] value) {
-      operations.add(new Append(value));
-      return this;
-    }
-
-    /** Copies the journal to {@code toJournalName}. */
-    public Builder copy(String toJournalName) {
-      operations.add(new Copy(toJournalName));
-      return this;
-    }
-
-    /** Deletes the journal. */
-    public Builder delete() {
-      operations.add(new Delete());
-      return this;
-    }
-
-    /** Creates a {@link JournalMutation} based on the operations added in this builder. */
-    public JournalMutation build() {
-      return new JournalMutation(journalName, new ArrayList<>(operations));
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/storage/JournalOperation.java b/src/main/java/com/google/android/libraries/feed/api/host/storage/JournalOperation.java
deleted file mode 100644
index 161f50a..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/storage/JournalOperation.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.storage;
-
-import android.support.annotation.IntDef;
-
-/** A mutation to the underlying {@link JournalStorage}. */
-public abstract class JournalOperation {
-  /** The types of operations. */
-  @IntDef({Type.APPEND, Type.COPY, Type.DELETE})
-  public @interface Type {
-    /** Append bytes to the provided journal */
-    int APPEND = 0;
-    /** Copy the provided journal to the given journal name */
-    int COPY = 1;
-    /** Delete the provided journal */
-    int DELETE = 2;
-  }
-
-  public @Type int getType() {
-    return type;
-  }
-
-  private final @Type int type;
-
-  // Only the following classes may extend JournalOperation
-  private JournalOperation(@Type int type) {
-    this.type = type;
-  }
-
-  /**
-   * A {@link JournalOperation} created by calling {@link JournalMutation.Builder#append(byte[])}.
-   */
-  public static final class Append extends JournalOperation {
-    private final byte[] value;
-
-    Append(byte[] value) {
-      super(Type.APPEND);
-      this.value = value;
-    }
-
-    public byte[] getValue() {
-      return value;
-    }
-  }
-
-  /** A {@link JournalOperation} created by calling {@link JournalMutation.Builder#copy(String)}. */
-  public static final class Copy extends JournalOperation {
-    private final String toJournalName;
-
-    Copy(String toJournalName) {
-      super(Type.COPY);
-      this.toJournalName = toJournalName;
-    }
-
-    public String getToJournalName() {
-      return toJournalName;
-    }
-  }
-
-  /** A {@link JournalOperation} created by calling {@link JournalMutation.Builder#delete()}. */
-  public static final class Delete extends JournalOperation {
-    Delete() {
-      super(Type.DELETE);
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/storage/JournalStorage.java b/src/main/java/com/google/android/libraries/feed/api/host/storage/JournalStorage.java
deleted file mode 100644
index c2c625c..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/storage/JournalStorage.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.storage;
-
-import com.google.android.libraries.feed.common.Result;
-import com.google.android.libraries.feed.common.functional.Consumer;
-import java.util.List;
-
-/**
- * Allows reading and writing to an append-only storage medium.
- *
- * <p>Storage instances can be accessed from multiple threads.
- *
- * <p>[INTERNAL LINK]
- */
-public interface JournalStorage {
-
-  /**
-   * Reads the journal and asynchronously returns the contents.
-   *
-   * <p>Reads on journals that do not exist will fulfill with an empty list.
-   */
-  void read(String journalName, Consumer<Result<List<byte[]>>> consumer);
-
-  /**
-   * Commits the operations in {@link JournalMutation} in order and asynchronously reports the
-   * {@link CommitResult}. If all the operations succeed, {@code callback} is called with a success
-   * result. If any operation fails, {@code callback} is called with a failure result and the
-   * remaining operations are not processed.
-   *
-   * <p>This operation is not guaranteed to be atomic.
-   */
-  void commit(JournalMutation mutation, Consumer<CommitResult> consumer);
-
-  /** Determines whether a journal exists and asynchronously responds. */
-  void exists(String journalName, Consumer<Result<Boolean>> consumer);
-
-  /** Asynchronously retrieve a list of all current journals */
-  void getAllJournals(Consumer<Result<List<String>>> consumer);
-
-  /** Delete all journals. Reports success or failure with the {@code consumer}. */
-  void deleteAll(Consumer<CommitResult> consumer);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/storage/JournalStorageDirect.java b/src/main/java/com/google/android/libraries/feed/api/host/storage/JournalStorageDirect.java
deleted file mode 100644
index c83e739..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/storage/JournalStorageDirect.java
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.storage;
-
-import com.google.android.libraries.feed.common.Result;
-import java.util.List;
-
-/** Define a version of the {@link JournalStorage} which runs synchronously. */
-public interface JournalStorageDirect {
-
-  /**
-   * Reads the journal and a returns the contents.
-   *
-   * <p>Reads on journals that do not exist will fulfill with an empty list.
-   */
-  Result<List<byte[]>> read(String journalName);
-
-  /**
-   * Commits the operations in {@link JournalMutation} in order and reports the {@link
-   * CommitResult}. If all the operations succeed returns a success result, otherwise reports a
-   * failure.
-   *
-   * <p>This operation is not guaranteed to be atomic.
-   */
-  CommitResult commit(JournalMutation mutation);
-
-  /** Determines whether a journal exists. */
-  Result<Boolean> exists(String journalName);
-
-  /** Retrieve a list of all current journals */
-  Result<List<String>> getAllJournals();
-
-  /** Delete all journals. */
-  CommitResult deleteAll();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/stream/BUILD b/src/main/java/com/google/android/libraries/feed/api/host/stream/BUILD
deleted file mode 100644
index 1fd6c8a..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/stream/BUILD
+++ /dev/null
@@ -1,12 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "stream",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-        "@maven//:com_android_support_support_annotations",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/stream/CardConfiguration.java b/src/main/java/com/google/android/libraries/feed/api/host/stream/CardConfiguration.java
deleted file mode 100644
index bb07e13..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/stream/CardConfiguration.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.stream;
-
-import android.graphics.drawable.Drawable;
-
-/** Class which is able to provide host configuration for default card look and feel. */
-// TODO: Look into allowing server configuration of this.
-public interface CardConfiguration {
-
-  int getDefaultCornerRadius();
-
-  Drawable getCardBackground();
-
-  /** Returns the amount of margin (in px) at the end of a card in the Stream */
-  int getCardBottomMargin();
-
-  /** Returns the amount of margin (in px) to the left (in LTR locales) of cards. */
-  int getCardStartMargin();
-
-  /** Returns the amount of margin (in px) to the right (in LTR locales) of cards. */
-  int getCardEndMargin();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/stream/SnackbarApi.java b/src/main/java/com/google/android/libraries/feed/api/host/stream/SnackbarApi.java
deleted file mode 100644
index deab0a2..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/stream/SnackbarApi.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.stream;
-
-/** The SnackbarApi is used by the Feed to render snackbars. */
-public interface SnackbarApi {
-  /**
-   * Displays a snackbar on the host.
-   *
-   * @param message Text to display in the snackbar.
-   */
-  void show(String message);
-
-  /**
-   * Displays a snackbar on the host.
-   *
-   * @param message Text to display in the snackbar.
-   * @param message Text to display in the snackbar's action. e.g. "undo"
-   * @param callback A Callback for the client to know why and when the snackbar goes away.
-   */
-  void show(String message, String action, SnackbarCallbackApi callback);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/stream/SnackbarCallbackApi.java b/src/main/java/com/google/android/libraries/feed/api/host/stream/SnackbarCallbackApi.java
deleted file mode 100644
index 14d8cb8..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/stream/SnackbarCallbackApi.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2019 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.stream;
-
-/** The SnackbarCallbackApi is a Callback class for Snackbar events. */
-public interface SnackbarCallbackApi {
-
-  /** Called when the user clicks the action button on the snackbar. */
-  void onDismissedWithAction();
-
-  /** Called when the snackbar is dismissed by timeout or UI environment change. */
-  void onDismissNoAction();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/stream/StreamConfiguration.java b/src/main/java/com/google/android/libraries/feed/api/host/stream/StreamConfiguration.java
deleted file mode 100644
index e8d04d7..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/stream/StreamConfiguration.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.stream;
-
-/** Interface which is able to provide host configuration for default stream look and feel. */
-public interface StreamConfiguration {
-
-  /**
-   * Returns the padding (in px) that appears to the start (left in LtR)) of each view in the
-   * Stream.
-   */
-  int getPaddingStart();
-
-  /**
-   * Returns the padding (in px) that appears to the end (right in LtR)) of each view in the Stream.
-   */
-  int getPaddingEnd();
-
-  /** Returns the padding (in px) that appears before the first view in the Stream. */
-  int getPaddingTop();
-
-  /** Returns the padding (in px) that appears after the last view in the Stream. */
-  int getPaddingBottom();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipApi.java b/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipApi.java
deleted file mode 100644
index f1e8c84..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipApi.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.stream;
-
-import android.view.View;
-
-/** Interface used to show a tooltip to reference a view. */
-public interface TooltipApi {
-
-  /**
-   * Shows a tooltip to reference a view if the user is eligible to see the tooltip.
-   *
-   * @param tooltipInfo information used to show this tooltip including placement info.
-   * @param view the view the tooltip is centered on.
-   * @param tooltipCallback the callback that will be evoked on tooltip events.
-   * @return true if the tooltip is actually shown.
-   */
-  boolean maybeShowHelpUi(TooltipInfo tooltipInfo, View view, TooltipCallbackApi tooltipCallback);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipCallbackApi.java b/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipCallbackApi.java
deleted file mode 100644
index 99eb22b..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipCallbackApi.java
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.stream;
-
-import android.support.annotation.IntDef;
-
-/** Interface for callbacks for tooltip events. */
-public interface TooltipCallbackApi {
-
-  /** The ways a tooltip can be dismissed. */
-  @IntDef({
-    TooltipDismissType.UNKNOWN,
-    TooltipDismissType.TIMEOUT,
-    TooltipDismissType.CLICK,
-    TooltipDismissType.CLICK_OUTSIDE,
-  })
-  @interface TooltipDismissType {
-    int UNKNOWN = 0;
-    int TIMEOUT = 1;
-    int CLICK = 2;
-    int CLICK_OUTSIDE = 3;
-  }
-
-  /** The callback that will be triggered when the tooltip is shown. */
-  void onShow();
-
-  /**
-   * The callback that will be triggered when the tooltip is hidden.
-   *
-   * @param dismissType the type of event that caused the tooltip to be hidden.
-   */
-  void onHide(@TooltipDismissType int dismissType);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipInfo.java b/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipInfo.java
deleted file mode 100644
index d82aad9..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipInfo.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.stream;
-
-import android.support.annotation.StringDef;
-
-/** All the information necessary to render a tooltip. */
-public interface TooltipInfo {
-
-  /** The list of features that the tooltip can highlight. */
-  @StringDef({FeatureName.UNKNOWN, FeatureName.CARD_MENU_TOOLTIP})
-  @interface FeatureName {
-    String UNKNOWN = "unknown";
-    String CARD_MENU_TOOLTIP = "card_menu_tooltip";
-  }
-
-  /** Returns the text to display in the tooltip. */
-  String getLabel();
-
-  /** Returns the talkback string to attach to tooltip. */
-  String getAccessibilityLabel();
-
-  /** Returns the Feature that the tooltip should reference. */
-  @FeatureName
-  String getFeatureName();
-
-  /**
-   * Returns the number of dp units that the tooltip arrow should point to below the center of the
-   * top of the view it is referencing.
-   */
-  int getTopInset();
-
-  /**
-   * Returns the number of dp units that the tooltip arrow should point to above the center of the
-   * bottom of the view it is referencing.
-   */
-  int getBottomInset();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipSupportedApi.java b/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipSupportedApi.java
deleted file mode 100644
index bebb884..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipSupportedApi.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.host.stream;
-
-import com.google.android.libraries.feed.api.host.stream.TooltipInfo.FeatureName;
-import com.google.android.libraries.feed.common.functional.Consumer;
-
-/** Interface to communicate if particular types of tooltips meet triggering conditions. */
-public interface TooltipSupportedApi {
-
-  /**
-   * Checks if the tooltip would be shown if {@link TooltipApi#maybeShowHelpUi} is called.
-   *
-   * @param featureName the name of the tooltip feature that might be triggered.
-   * @param consumer a callback that contains a boolean indicating that the tooltip would be shown
-   *     if {@link TooltipApi#maybeShowHelpUi} is called.
-   */
-  void wouldTriggerHelpUi(@FeatureName String featureName, Consumer<Boolean> consumer);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/actionmanager/ActionManager.java b/src/main/java/com/google/android/libraries/feed/api/internal/actionmanager/ActionManager.java
deleted file mode 100644
index 337ce29..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/actionmanager/ActionManager.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.actionmanager;
-
-import com.google.android.libraries.feed.common.functional.Consumer;
-import com.google.search.now.feed.client.StreamDataProto.StreamDataOperation;
-import com.google.search.now.wire.feed.ActionPayloadProto.ActionPayload;
-import java.util.List;
-
-/** Allows Stream to notify the Feed library of actions taken */
-public interface ActionManager {
-
-  /**
-   * Dismiss content for the content ID in the session, along with executing the provided stream
-   * data operations on the session.
-   *
-   * @param contentIds The content IDs for the feature being dismissed. These are recorded and sent
-   *     to the server in subsequent requests.
-   * @param streamDataOperations Any stream data operations that should be applied to the session
-   *     (e.g. removing a cluster when the content is removed)
-   * @param sessionId The current session id
-   */
-  void dismissLocal(
-      List<String> contentIds,
-      List<StreamDataOperation> streamDataOperations,
-      /*@Nullable*/ String sessionId);
-
-  /**
-   * Executes the provided stream data operations on the session.
-   *
-   * @param contentId The id for the content that triggered this action.
-   * @param streamDataOperations Any stream data operations that should be applied to the session
-   *     (e.g. removing a cluster when the content is removed)
-   * @param sessionId The current session id
-   */
-  void dismiss(List<StreamDataOperation> streamDataOperations, /*@Nullable*/ String sessionId);
-
-  /**
-   * Issues a request to record a set of actions, with the consumer being called back with the
-   * resulting {@link ConsistencyToken}.
-   */
-  void createAndUploadAction(String contentId, ActionPayload payload);
-
-  /**
-   * Issues a request to record a set of action and update the url with consistency token with the
-   * consumer being called on the main thread with the resulting url.
-   */
-  void uploadAllActionsAndUpdateUrl(
-      String url, String consistencyTokenQueryParamName, Consumer<String> consumer);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/actionmanager/ActionReader.java b/src/main/java/com/google/android/libraries/feed/api/internal/actionmanager/ActionReader.java
deleted file mode 100644
index 7e1be1d..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/actionmanager/ActionReader.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.actionmanager;
-
-import com.google.android.libraries.feed.api.internal.common.DismissActionWithSemanticProperties;
-import com.google.android.libraries.feed.common.Result;
-import java.util.List;
-
-/** Interface for reading various {@link StreamAction}s. */
-public interface ActionReader {
-
-  /** Retrieves list of {@link DismissActionWithSemanticProperties} for all valid dismiss actions */
-  Result<List<DismissActionWithSemanticProperties>> getDismissActionsWithSemanticProperties();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/actionmanager/BUILD b/src/main/java/com/google/android/libraries/feed/api/internal/actionmanager/BUILD
deleted file mode 100644
index f9a4adc..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/actionmanager/BUILD
+++ /dev/null
@@ -1,16 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "actionmanager",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/internal/common",
-        "//src/main/java/com/google/android/libraries/feed/common",
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "//src/main/proto/search/now/wire/feed:feed_java_proto_lite",
-        "@com_google_code_findbugs_jsr305//jar",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionParser.java b/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionParser.java
deleted file mode 100644
index 3d2e8d1..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionParser.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.actionparser;
-
-import android.view.View;
-import com.google.android.libraries.feed.api.host.action.StreamActionApi;
-import com.google.search.now.ui.action.FeedActionPayloadProto.FeedActionPayload;
-import com.google.search.now.ui.piet.ActionsProto.Action;
-import com.google.search.now.ui.piet.LogDataProto.LogData;
-
-/** Parses actions from Piet and directs the Stream to handle the action. */
-public interface ActionParser {
-
-  void parseAction(
-      Action action,
-      StreamActionApi streamActionApi,
-      View view,
-      LogData logData,
-      @ActionSource int actionSource);
-
-  void parseFeedActionPayload(
-      FeedActionPayload feedActionPayload,
-      StreamActionApi streamActionApi,
-      View view,
-      @ActionSource int actionSource);
-
-  boolean canPerformAction(FeedActionPayload feedActionPayload, StreamActionApi streamActionApi);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionParserFactory.java b/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionParserFactory.java
deleted file mode 100644
index 95076a6..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionParserFactory.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.actionparser;
-
-import com.google.android.libraries.feed.api.client.knowncontent.ContentMetadata;
-import com.google.android.libraries.feed.common.functional.Supplier;
-
-/** Factory for {@link ActionParser}. */
-public interface ActionParserFactory {
-
-  /**
-   * Builds the ActionParser.
-   *
-   * @param contentMetadata A {@link Supplier} for {@link ContentMetadata} required for the {@link
-   *     com.google.android.libraries.feed.api.host.action.ActionApi#downloadUrl(ContentMetadata)}
-   *     action. If the {@link Supplier} returns {@code null}, the download action will be
-   *     suppressed. A {@link Supplier} is used instead of just a {@link ContentMetadata} to save on
-   *     memory and startup time. The {@link Supplier} will not be accessed until an action is taken
-   *     that requires it.
-   */
-  ActionParser build(Supplier</*@Nullable*/ ContentMetadata> contentMetadata);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionSource.java b/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionSource.java
deleted file mode 100644
index b542a0f..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionSource.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.actionparser;
-
-import android.support.annotation.IntDef;
-
-/** Possible action types. */
-@IntDef({
-  ActionSource.UNKNOWN,
-  ActionSource.VIEW,
-  ActionSource.CLICK,
-  ActionSource.LONG_CLICK,
-  ActionSource.SWIPE,
-  ActionSource.CONTEXT_MENU
-})
-public @interface ActionSource {
-  int UNKNOWN = 0;
-  /** View action */
-  int VIEW = 1;
-
-  /** Click action */
-  int CLICK = 2;
-
-  /** Long click action */
-  int LONG_CLICK = 3;
-
-  /* Swipe action */
-  int SWIPE = 4;
-
-  /* Action performed from context menu*/
-  int CONTEXT_MENU = 5;
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionSourceConverter.java b/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionSourceConverter.java
deleted file mode 100644
index 16af02f..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionSourceConverter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.actionparser;
-
-import com.google.android.libraries.feed.piet.host.ActionHandler.ActionType;
-
-/** Utility class to convert a {@link ActionType} to {@link ActionSource}. */
-public final class ActionSourceConverter {
-  private ActionSourceConverter() {}
-
-  @ActionSource
-  public static int convertPietAction(@ActionType int type) {
-    switch (type) {
-      case ActionType.VIEW:
-        return ActionSource.VIEW;
-      case ActionType.CLICK:
-        return ActionSource.CLICK;
-      case ActionType.LONG_CLICK:
-        return ActionSource.LONG_CLICK;
-      default:
-        return ActionSource.UNKNOWN;
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/BUILD b/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/BUILD
deleted file mode 100644
index 3bd0189..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/BUILD
+++ /dev/null
@@ -1,18 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "actionparser",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/client/knowncontent",
-        "//src/main/java/com/google/android/libraries/feed/api/host/action",
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-        "//src/main/java/com/google/android/libraries/feed/piet/host",
-        "//src/main/proto/search/now/ui/action:feed_action_payload_java_proto_lite",
-        "//src/main/proto/search/now/ui/piet:piet_java_proto_lite",
-        "@com_google_code_findbugs_jsr305//jar",
-        "@maven//:com_android_support_support_annotations",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/common/BUILD b/src/main/java/com/google/android/libraries/feed/api/internal/common/BUILD
index be71b29..dcb1bb5 100644
--- a/src/main/java/com/google/android/libraries/feed/api/internal/common/BUILD
+++ b/src/main/java/com/google/android/libraries/feed/api/internal/common/BUILD
@@ -5,9 +5,4 @@
 android_library(
     name = "common",
     srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "//src/main/proto/search/now/wire/feed:feed_java_proto_lite",
-        "@com_google_code_findbugs_jsr305//jar",
-    ],
 )
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/common/DismissActionWithSemanticProperties.java b/src/main/java/com/google/android/libraries/feed/api/internal/common/DismissActionWithSemanticProperties.java
deleted file mode 100644
index 03b49b7..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/common/DismissActionWithSemanticProperties.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.common;
-
-import com.google.search.now.wire.feed.ContentIdProto.ContentId;
-import java.util.Arrays;
-
-/**
- * Represents the content needed for a dismiss action internally. Holds the content ID of the
- * dismissed content, and any semantic properties associated with it.
- */
-public final class DismissActionWithSemanticProperties {
-  private final ContentId contentId;
-  private final byte /*@Nullable*/ [] semanticProperties;
-
-  public DismissActionWithSemanticProperties(
-      ContentId contentId, byte /*@Nullable*/ [] semanticProperties) {
-    this.contentId = contentId;
-    this.semanticProperties = semanticProperties;
-  }
-
-  public ContentId getContentId() {
-    return contentId;
-  }
-
-  public byte /*@Nullable*/ [] getSemanticProperties() {
-    return semanticProperties;
-  }
-
-  @Override
-  public boolean equals(/*@Nullable*/ Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    DismissActionWithSemanticProperties that = (DismissActionWithSemanticProperties) o;
-
-    if (!contentId.equals(that.contentId)) {
-      return false;
-    }
-    return Arrays.equals(semanticProperties, that.semanticProperties);
-  }
-
-  @Override
-  public int hashCode() {
-    int result = contentId.hashCode();
-    result = 31 * result + Arrays.hashCode(semanticProperties);
-    return result;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/common/Model.java b/src/main/java/com/google/android/libraries/feed/api/internal/common/Model.java
deleted file mode 100644
index d85b952..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/common/Model.java
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2019 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.common;
-
-import com.google.search.now.feed.client.StreamDataProto.StreamDataOperation;
-import java.util.Collections;
-import java.util.List;
-
-/** Contains a list of {@link StreamDataOperations}s and a schema version. */
-public final class Model {
-  /** The current schema version. */
-  public static final int CURRENT_SCHEMA_VERSION = 2;
-
-  public final List<StreamDataOperation> streamDataOperations;
-  public final int schemaVersion;
-
-  private Model(List<StreamDataOperation> streamDataOperations, int schemaVersion) {
-    this.streamDataOperations =
-        Collections.unmodifiableList(
-            Collections.list(Collections.enumeration(streamDataOperations)));
-    this.schemaVersion = schemaVersion;
-  }
-
-  public static Model of(List<StreamDataOperation> streamDataOperations) {
-    return of(streamDataOperations, CURRENT_SCHEMA_VERSION);
-  }
-
-  public static Model of(List<StreamDataOperation> streamDataOperations, int schemaVersion) {
-    return new Model(streamDataOperations, schemaVersion);
-  }
-
-  public static Model empty() {
-    return new Model(Collections.emptyList(), CURRENT_SCHEMA_VERSION);
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/common/PayloadWithId.java b/src/main/java/com/google/android/libraries/feed/api/internal/common/PayloadWithId.java
deleted file mode 100644
index 1dcdca0..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/common/PayloadWithId.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.common;
-
-import com.google.search.now.feed.client.StreamDataProto.StreamPayload;
-
-/**
- * Structure style class which binds a String contentId with a {@link StreamPayload}. The class is
- * immutable and provides access to the fields directly.
- */
-public final class PayloadWithId {
-  public final String contentId;
-  public final StreamPayload payload;
-
-  public PayloadWithId(String contentId, StreamPayload payload) {
-    this.contentId = contentId;
-    this.payload = payload;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/common/SemanticPropertiesWithId.java b/src/main/java/com/google/android/libraries/feed/api/internal/common/SemanticPropertiesWithId.java
deleted file mode 100644
index 26794e6..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/common/SemanticPropertiesWithId.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.common;
-
-import java.util.Arrays;
-
-/**
- * Structure style class which binds a String contentId with the semantic properties data for that
- * contentId. The class is immutable and provides access to the fields directly.
- */
-public final class SemanticPropertiesWithId {
-
-  public final String contentId;
-  public final byte[] semanticData;
-
-  public SemanticPropertiesWithId(String contentId, byte[] semanticData) {
-    this.contentId = contentId;
-    this.semanticData = semanticData;
-  }
-
-  @Override
-  public boolean equals(/*@Nullable*/ Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    SemanticPropertiesWithId that = (SemanticPropertiesWithId) o;
-
-    if (!contentId.equals(that.contentId)) {
-      return false;
-    }
-    return Arrays.equals(semanticData, that.semanticData);
-  }
-
-  @Override
-  public int hashCode() {
-    int result = contentId.hashCode();
-    result = 31 * result + Arrays.hashCode(semanticData);
-    return result;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/common/testing/BUILD b/src/main/java/com/google/android/libraries/feed/api/internal/common/testing/BUILD
deleted file mode 100644
index 862535a..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/common/testing/BUILD
+++ /dev/null
@@ -1,14 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "testing",
-    testonly = 1,
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/internal/common",
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "//src/main/proto/search/now/wire/feed:feed_java_proto_lite",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/common/testing/ContentIdGenerators.java b/src/main/java/com/google/android/libraries/feed/api/internal/common/testing/ContentIdGenerators.java
deleted file mode 100644
index 206df78..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/common/testing/ContentIdGenerators.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.common.testing;
-
-import com.google.search.now.wire.feed.ContentIdProto.ContentId;
-
-/** Test support class which creates Jardin content ids. */
-public class ContentIdGenerators {
-  private static final String FEATURE = "feature";
-  private static final String ROOT_DOMAIN = "stream_root";
-  private static final ContentId FEATURE_CONTENT_ID =
-      ContentId.newBuilder().setContentDomain(FEATURE).setId(0).setTable(FEATURE).build();
-  private static final ContentId TOKEN_ID =
-      ContentId.newBuilder().setContentDomain("token").setId(0).setTable(FEATURE).build();
-  private static final ContentId SHARED_STATE_CONTENT_ID =
-      ContentId.newBuilder().setContentDomain("shared-state").setId(0).setTable(FEATURE).build();
-
-  public static final String ROOT_PREFIX = FEATURE + "::" + ROOT_DOMAIN;
-
-  public String createFeatureContentId(long id) {
-    return createContentId(FEATURE_CONTENT_ID.toBuilder().setId(id).build());
-  }
-
-  public String createTokenContentId(long id) {
-    return createContentId(TOKEN_ID.toBuilder().setId(id).build());
-  }
-
-  public String createSharedStateContentId(long id) {
-    return createContentId(SHARED_STATE_CONTENT_ID.toBuilder().setId(id).build());
-  }
-
-  public String createRootContentId(int id) {
-    return createContentId(
-        ContentId.newBuilder().setContentDomain(ROOT_DOMAIN).setId(id).setTable(FEATURE).build());
-  }
-
-  public String createContentId(ContentId contentId) {
-    // Using String concat for performance reasons.  This is called a lot for large feed responses.
-    return contentId.getTable() + "::" + contentId.getContentDomain() + "::" + contentId.getId();
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/common/testing/InternalProtocolBuilder.java b/src/main/java/com/google/android/libraries/feed/api/internal/common/testing/InternalProtocolBuilder.java
deleted file mode 100644
index 4248a37..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/common/testing/InternalProtocolBuilder.java
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.common.testing;
-
-import com.google.android.libraries.feed.api.internal.common.PayloadWithId;
-import com.google.search.now.feed.client.StreamDataProto.StreamDataOperation;
-import com.google.search.now.feed.client.StreamDataProto.StreamFeature;
-import com.google.search.now.feed.client.StreamDataProto.StreamPayload;
-import com.google.search.now.feed.client.StreamDataProto.StreamSharedState;
-import com.google.search.now.feed.client.StreamDataProto.StreamStructure;
-import com.google.search.now.feed.client.StreamDataProto.StreamStructure.Operation;
-import com.google.search.now.feed.client.StreamDataProto.StreamToken;
-import java.util.ArrayList;
-import java.util.List;
-
-/** This is a builder class for creating internal protocol elements. */
-public class InternalProtocolBuilder {
-
-  private final ContentIdGenerators idGenerators = new ContentIdGenerators();
-  private final List<StreamDataOperation> dataOperations = new ArrayList<>();
-
-  /** This adds a Root Feature into the Stream of data operations */
-  public InternalProtocolBuilder addRootFeature() {
-    StreamFeature streamFeature =
-        StreamFeature.newBuilder().setContentId(idGenerators.createRootContentId(0)).build();
-    StreamStructure streamStructure =
-        StreamStructure.newBuilder()
-            .setOperation(Operation.UPDATE_OR_APPEND)
-            .setContentId(idGenerators.createRootContentId(0))
-            .build();
-    StreamPayload streamPayload =
-        StreamPayload.newBuilder().setStreamFeature(streamFeature).build();
-    dataOperations.add(
-        StreamDataOperation.newBuilder()
-            .setStreamStructure(streamStructure)
-            .setStreamPayload(streamPayload)
-            .build());
-    return this;
-  }
-
-  public InternalProtocolBuilder addClearOperation() {
-    StreamStructure streamStructure =
-        StreamStructure.newBuilder().setOperation(Operation.CLEAR_ALL).build();
-    dataOperations.add(
-        StreamDataOperation.newBuilder().setStreamStructure(streamStructure).build());
-    return this;
-  }
-
-  public InternalProtocolBuilder addSharedState(String contentId) {
-    StreamSharedState streamSharedState =
-        StreamSharedState.newBuilder().setContentId(contentId).build();
-    StreamStructure streamStructure =
-        StreamStructure.newBuilder()
-            .setOperation(Operation.UPDATE_OR_APPEND)
-            .setContentId(contentId)
-            .build();
-    StreamPayload streamPayload =
-        StreamPayload.newBuilder().setStreamSharedState(streamSharedState).build();
-    dataOperations.add(
-        StreamDataOperation.newBuilder()
-            .setStreamStructure(streamStructure)
-            .setStreamPayload(streamPayload)
-            .build());
-    return this;
-  }
-
-  public InternalProtocolBuilder addToken(String contentId) {
-    StreamToken streamToken = StreamToken.newBuilder().setContentId(contentId).build();
-    StreamStructure streamStructure =
-        StreamStructure.newBuilder()
-            .setOperation(Operation.UPDATE_OR_APPEND)
-            .setContentId(contentId)
-            .build();
-    StreamPayload streamPayload = StreamPayload.newBuilder().setStreamToken(streamToken).build();
-    dataOperations.add(
-        StreamDataOperation.newBuilder()
-            .setStreamStructure(streamStructure)
-            .setStreamPayload(streamPayload)
-            .build());
-    return this;
-  }
-
-  public InternalProtocolBuilder addFeature(String contentId, String parentId) {
-    StreamFeature streamFeature =
-        StreamFeature.newBuilder().setContentId(contentId).setParentId(parentId).build();
-    StreamStructure streamStructure =
-        StreamStructure.newBuilder()
-            .setOperation(Operation.UPDATE_OR_APPEND)
-            .setContentId(contentId)
-            .setParentContentId(parentId)
-            .build();
-    StreamPayload streamPayload =
-        StreamPayload.newBuilder().setStreamFeature(streamFeature).build();
-    dataOperations.add(
-        StreamDataOperation.newBuilder()
-            .setStreamStructure(streamStructure)
-            .setStreamPayload(streamPayload)
-            .build());
-    return this;
-  }
-
-  public InternalProtocolBuilder removeFeature(String contentId, String parentId) {
-    StreamStructure streamStructure =
-        StreamStructure.newBuilder()
-            .setOperation(Operation.REMOVE)
-            .setContentId(contentId)
-            .setParentContentId(parentId)
-            .build();
-    dataOperations.add(
-        StreamDataOperation.newBuilder().setStreamStructure(streamStructure).build());
-    return this;
-  }
-
-  public InternalProtocolBuilder addRequiredContent(String contentId) {
-    dataOperations.add(
-        StreamDataOperation.newBuilder()
-            .setStreamStructure(
-                StreamStructure.newBuilder()
-                    .setOperation(Operation.REQUIRED_CONTENT)
-                    .setContentId(contentId))
-            .build());
-    return this;
-  }
-
-  public List<StreamDataOperation> build() {
-    return new ArrayList<>(dataOperations);
-  }
-
-  /**
-   * This will return the StreamStructure part only, filtering out any shared state. This is the
-   * form structure is represented in the Store.
-   */
-  public List<StreamStructure> buildAsStreamStructure() {
-    List<StreamStructure> streamStructures = new ArrayList<>();
-    for (StreamDataOperation operation : dataOperations) {
-      // For the structure, ignore the shared state
-      if (operation.getStreamPayload().hasStreamSharedState()) {
-        continue;
-      }
-      streamStructures.add(operation.getStreamStructure());
-    }
-    return streamStructures;
-  }
-
-  public List<PayloadWithId> buildAsPayloadWithId() {
-    List<PayloadWithId> payloads = new ArrayList<>();
-    for (StreamDataOperation operation : dataOperations) {
-      // For the structure, ignore the shared state
-      if (operation.getStreamPayload().hasStreamSharedState()) {
-        continue;
-      }
-      // Only include payloads with UPDATE_OR_APPEND.
-      if (operation.getStreamStructure().getOperation() != Operation.UPDATE_OR_APPEND) {
-        continue;
-      }
-      payloads.add(
-          new PayloadWithId(
-              operation.getStreamStructure().getContentId(), operation.getStreamPayload()));
-    }
-    return payloads;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/knowncontent/BUILD b/src/main/java/com/google/android/libraries/feed/api/internal/knowncontent/BUILD
deleted file mode 100644
index eabed19..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/knowncontent/BUILD
+++ /dev/null
@@ -1,9 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "knowncontent",
-    srcs = glob(["*.java"]),
-    deps = ["//src/main/java/com/google/android/libraries/feed/api/client/knowncontent"],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/knowncontent/FeedKnownContent.java b/src/main/java/com/google/android/libraries/feed/api/internal/knowncontent/FeedKnownContent.java
deleted file mode 100644
index cc31426..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/knowncontent/FeedKnownContent.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2019 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.knowncontent;
-
-import com.google.android.libraries.feed.api.client.knowncontent.KnownContent;
-import java.util.List;
-
-/** Allows the feed libraries to request and subscribe to information about the Feed's content. */
-public interface FeedKnownContent extends KnownContent {
-
-  /**
-   * Gets listener that notifies all added listeners of {@link
-   * KnownContent.Listener#onContentRemoved(List)} or {@link
-   * KnownContent.Listener#onNewContentReceived(boolean, long)}.
-   *
-   * <p>Note: This method is internal to the Feed. It provides a {@link Listener} that, when
-   * notified, will propagate the notification to the host.
-   */
-  KnownContent.Listener getKnownContentHostNotifier();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/lifecycle/BUILD b/src/main/java/com/google/android/libraries/feed/api/internal/lifecycle/BUILD
deleted file mode 100644
index 7f9dd6f..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/lifecycle/BUILD
+++ /dev/null
@@ -1,8 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "lifecycle",
-    srcs = glob(["*.java"]),
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/lifecycle/Resettable.java b/src/main/java/com/google/android/libraries/feed/api/internal/lifecycle/Resettable.java
deleted file mode 100644
index 6873fa2..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/lifecycle/Resettable.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.lifecycle;
-
-/** Interface for objects which support reset to an initial state. */
-public interface Resettable {
-  /* Reset the object. */
-  void reset();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/BUILD b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/BUILD
deleted file mode 100644
index 595bf1c..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/BUILD
+++ /dev/null
@@ -1,19 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "modelprovider",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/common",
-        "//src/main/java/com/google/android/libraries/feed/api/host/logging",
-        "//src/main/java/com/google/android/libraries/feed/common/feedobservable",
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "//src/main/proto/search/now/wire/feed:feed_java_proto_lite",
-        "@com_google_code_findbugs_jsr305//jar",
-        "@com_google_protobuf_javalite//:protobuf_java_lite",
-        "@maven//:com_android_support_support_annotations",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/FeatureChange.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/FeatureChange.java
deleted file mode 100644
index d235502..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/FeatureChange.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-import java.util.List;
-
-/**
- * Class defining the specific changes made to feature nodes within the model. This is passed to the
- * observer to handle model changes. There are a few types of changes described here:
- *
- * <ol>
- *   <li>if {@link #isFeatureChanged()} returns {@code true}, then the ModelFeature was changed
- *   <li>{@link #getChildChanges()} returns a list of features either, appended, prepended, or
- *       removed from a parent
- * </ol>
- */
-public interface FeatureChange {
-
-  /** Returns the contentId of the ModelFeature which was changed. */
-  String getContentId();
-
-  /** Returns {@code true} if the ModelFeature changed. */
-  boolean isFeatureChanged();
-
-  /** Returns the ModelFeature that was changed. */
-  ModelFeature getModelFeature();
-
-  /** Returns the structural changes to the ModelFeature. */
-  ChildChanges getChildChanges();
-
-  /** Class describing changes to the children. */
-  interface ChildChanges {
-    /**
-     * Returns a List of the children added to this ModelFeature. These children are in the same
-     * order they would be displayed in the stream.
-     */
-    List<ModelChild> getAppendedChildren();
-
-    /** Returns a List of the children removed from this ModelFeature. */
-    List<ModelChild> getRemovedChildren();
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/FeatureChangeObserver.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/FeatureChangeObserver.java
deleted file mode 100644
index 873a496..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/FeatureChangeObserver.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-/**
- * Defines an interface which observes changes features within the stream model. The {@link
- * #onChange(FeatureChange)} is called when a feature changes.
- */
-public interface FeatureChangeObserver {
-  /** Called when children of the feature or the underlying payload proto instance change. */
-  void onChange(FeatureChange change);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelChild.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelChild.java
deleted file mode 100644
index 234c3ad..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelChild.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-import android.support.annotation.IntDef;
-
-/**
- * Abstract Interface defining a Child of a feature which may be returned by a {@link ModelCursor}.
- * A ModelChild must be bound to either a feature or token.
- */
-public interface ModelChild {
-
-  /** Define the concrete type of the children. */
-  @IntDef({Type.UNBOUND, Type.FEATURE, Type.TOKEN})
-  @interface Type {
-    // A feature that isn't yet bound to a specific data type
-    // This should never be exposed outside of the model.
-    int UNBOUND = 0;
-
-    // A stream feature child.
-    int FEATURE = 1;
-
-    // The child is a continuation token.  This means the cursor is at end
-    // and a request has been made to create a new cursor with additional
-    // children.
-    int TOKEN = 2;
-  }
-
-  /** Returns the type of the child. */
-  @Type
-  int getType();
-
-  /** Returns the ContentId of the child, all children will have a Content ID. */
-  String getContentId();
-
-  /** Returns true there is a parent to this child; false if this is a root. */
-  boolean hasParentId();
-
-  /**
-   * Returns the parent contentId of the child, this may return {@code Null} if the child is a root.
-   */
-  /*@Nullable*/
-  String getParentId();
-
-  /**
-   * Returns a the {@link ModelFeature}. This will throw an {@link IllegalStateException} if the
-   * {@link Type} is not equal to {@code FEATURE}.
-   */
-  ModelFeature getModelFeature();
-
-  /**
-   * Returns the {@link ModelToken}. This will throw an {@link IllegalStateException} if the {@link
-   * Type} is not equal to {@code TOKEN}.
-   */
-  ModelToken getModelToken();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelCursor.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelCursor.java
deleted file mode 100644
index beb1b30..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelCursor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-
-/**
- * This represents a Cursor through the children of a {@link ModelFeature}. A Cursor will provide
- * forward only access to the children of the container. When a cursor is created by calling {@link
- * ModelFeature#getCursor()}, it is positioned at the first child.
- */
-public interface ModelCursor {
-  /** Returns the next {@link ModelChild} in the cursor or {@code null} if at end. */
-  /*@Nullable*/
-  ModelChild getNextItem();
-
-  /** Returns {@literal true} if the cursor is at the end. */
-  boolean isAtEnd();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelError.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelError.java
deleted file mode 100644
index 475ef60..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelError.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-import android.support.annotation.IntDef;
-import com.google.protobuf.ByteString;
-
-/**
- * Class which contains information needed by the {@link
- * com.google.android.libraries.feed.api.client.stream.Stream} about errors which may occur in the
- * infrastructure.
- */
-public final class ModelError {
-
-  /** Defines errors are exposed through the ModelProvider to the Stream. */
-  @IntDef({ErrorType.UNKNOWN, ErrorType.NO_CARDS_ERROR, ErrorType.PAGINATION_ERROR})
-  public @interface ErrorType {
-    // An unknown error, this is not expected to ever be used.
-    int UNKNOWN = 0;
-    // No cards are available due to an error such as, no network available or a request failed,
-    // etc.
-    int NO_CARDS_ERROR = 1;
-    // Pagination failed due to some type of error such as no network available or a request failed,
-    // etc.
-    int PAGINATION_ERROR = 2;
-    // Pagination failed due to a synthetic token error.
-    int SYNTHETIC_TOKEN_ERROR = 3;
-  }
-
-  private final @ErrorType int errorType;
-  /*@Nullable*/ private final ByteString continuationToken;
-
-  public ModelError(@ErrorType int errorType, /*@Nullable*/ ByteString continuationToken) {
-    this.errorType = errorType;
-    this.continuationToken = continuationToken;
-  }
-
-  /** Returns the ErrorType assocated with the error. */
-  public @ErrorType int getErrorType() {
-    return errorType;
-  }
-
-  /** This should be non-null if the ErrorType is PAGINATION_ERROR. */
-  /*@Nullable*/
-  public ByteString getContinuationToken() {
-    return continuationToken;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelFeature.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelFeature.java
deleted file mode 100644
index 3b15b0d..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelFeature.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-import com.google.android.libraries.feed.common.feedobservable.Observable;
-import com.google.search.now.feed.client.StreamDataProto.StreamFeature;
-
-/**
- * This represents a Feature model within the stream tree structure. This represents things such as
- * a Cluster, Carousel, Piet Content, etc. Features provide an {@link ModelCursor} for accessing the
- * children of the feature.
- */
-public interface ModelFeature extends Observable<FeatureChangeObserver> {
-
-  /**
-   * Returns the {@link StreamFeature} proto instance allowing for access of the metadata and
-   * payload.
-   */
-  StreamFeature getStreamFeature();
-
-  /**
-   * An Cursor over the children of the feature. This Cursor is a one way iterator over the
-   * children. If the feature does not contain children, an empty cursor will be returned.
-   *
-   * <p>Each call to this method will return a new instance of the ModelCursor.
-   */
-  ModelCursor getCursor();
-
-  /**
-   * Create a ModelCursor which advances in the defined direction (forward or reverse), it may also
-   * start at a specific child. If the specified child is not found, this will return {@code null}.
-   * If {@code startingChild} is {@code null}, the cursor starts at the start (beginning or end) of
-   * the child list.
-   */
-  /*@Nullable*/
-  ModelCursor getDirectionalCursor(boolean forward, /*@Nullable*/ String startingChild);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelMutation.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelMutation.java
deleted file mode 100644
index 56d4223..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelMutation.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-import com.google.android.libraries.feed.api.common.MutationContext;
-import com.google.search.now.feed.client.StreamDataProto.StreamStructure;
-import com.google.search.now.feed.client.StreamDataProto.StreamToken;
-
-/**
- * Mutation which will batch a set of atomic changes to the Model maintained by the ModelProvider.
- * Order is important, things will be stored in the order they are added to a parent feature.
- */
-public interface ModelMutation {
-  /** Add the structural information to the model as a child */
-  ModelMutation addChild(StreamStructure streamStructure);
-
-  /** Remove the model child defined by the structural information */
-  ModelMutation removeChild(StreamStructure streamStructure);
-
-  /** Content for a child was updated. */
-  ModelMutation updateChild(StreamStructure streamStructure);
-
-  /**
-   * Set the MutationContext used to create the ModelMutation. This may contain the {@link
-   * StreamToken} which represents the source of the response.
-   */
-  ModelMutation setMutationContext(MutationContext mutationContext);
-
-  /** Set the session id of the session backing this ModelProvider. */
-  ModelMutation setSessionId(String sessionId);
-
-  /** Indicates that the SessionManager has cached the payload bindings. */
-  ModelMutation hasCachedBindings(boolean cachedBindings);
-
-  /** Commits the pending changes to the store. */
-  void commit();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelProvider.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelProvider.java
deleted file mode 100644
index 8b79350..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelProvider.java
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-import android.support.annotation.IntDef;
-import com.google.android.libraries.feed.api.common.MutationContext;
-import com.google.android.libraries.feed.api.host.logging.RequestReason;
-import com.google.android.libraries.feed.common.feedobservable.Observable;
-import com.google.search.now.feed.client.StreamDataProto.StreamSharedState;
-import com.google.search.now.feed.client.StreamDataProto.UiContext;
-import com.google.search.now.wire.feed.ContentIdProto.ContentId;
-import java.util.List;
-
-/**
- * A ModelProvider provides access to the Stream Model for the UI layer. It is populated by the
- * Session Manager. The ModelProvider is backed by a Session instance, there is a one-to-one
- * relationship between the ModelProvider and Session implementation. The Stream Library uses the
- * model to build the UI displayed to the user.
- */
-public interface ModelProvider extends Observable<ModelProviderObserver> {
-  /**
-   * Provides the contentId of the lowest child of the root viewed by the user, or {@code null} if
-   * no content with a ContentId has been seen.
-   */
-  interface ViewDepthProvider {
-    /** Returns a contentId of the lowest root child seen by the user. */
-    /*@Nullable*/
-    String getChildViewDepth();
-  }
-
-  /** Returns a Mutator used to change the model. */
-  ModelMutation edit();
-
-  /**
-   * This is called to invalidate the model. The SessionManager calls this to free all resources
-   * held by this ModelProvider instance.
-   */
-  void invalidate();
-
-  /**
-   * This is called to invalidate the model. The SessionManager calls this to free all resources
-   * held by this ModelProvider instance.
-   */
-  void invalidate(UiContext uiContext);
-
-  /**
-   * This is called to detach the ModelProvider from the SessionManager. The Session will continue
-   * to be persisted, but the SessionManager will drop connections to this ModelProvider. The
-   * ModelProvider will enter a {@code State.INVALIDATED}. This will not call the {@link
-   * ModelProviderObserver#onSessionFinished(UiContext)}.
-   */
-  void detachModelProvider();
-
-  /** Used by the session to raises a {@link ModelError} with the ModelProvider. */
-  void raiseError(ModelError error);
-
-  /**
-   * Returns a {@code ModelFeature} which represents the root of the stream tree. Returns {@code
-   * null} if the stream is empty.
-   */
-  /*@Nullable*/
-  ModelFeature getRootFeature();
-
-  /** Return a ModelChild for a String ContentId */
-  /*@Nullable*/
-  ModelChild getModelChild(String contentId);
-
-  /**
-   * Returns a {@code StreamSharedState} containing shared state such as the Piet shard state.
-   * Returns {@code null} if the shared state is not found.
-   */
-  /*@Nullable*/
-  StreamSharedState getSharedState(ContentId contentId);
-
-  /**
-   * Handle the processing of a {@code ModelToken}. For example start a request for the next page of
-   * content. The results of handling the token will be available through Observers on the
-   * ModelToken. Returns {@literal false} if a {@code modelToken} is not recognized and observers
-   * will not be fired.
-   */
-  boolean handleToken(ModelToken modelToken);
-
-  /**
-   * Allow the stream to force a refresh. This will result in the current model being invalidated if
-   * the requested refresh is successful.
-   *
-   * @param requestReason The reason for this refresh.
-   */
-  void triggerRefresh(@RequestReason int requestReason);
-
-  /**
-   * Allow the stream to force a refresh. This will result in the current model being invalidated if
-   * the requested refresh is successful.
-   *
-   * @param requestReason The reason for this refresh.
-   * @param uiContext The {@link UiContext} that caused this mutation. Will be round-tripped to
-   *     {@link ModelProviderObserver#onSessionFinished(UiContext)}
-   */
-  void triggerRefresh(@RequestReason int requestReason, UiContext uiContext);
-
-  /** Defines the Lifecycle of the ModelProvider */
-  @IntDef({State.INITIALIZING, State.READY, State.INVALIDATED})
-  @interface State {
-    /**
-     * State of the Model Provider before it has been fully initialized. The model shouldn't be
-     * accessed before it enters the {@code READY} state. You should register an Observer to receive
-     * an event when the model is ready.
-     */
-    int INITIALIZING = 0;
-    /** State of the Model Provider when it is ready for normal use. */
-    int READY = 1;
-    /**
-     * State of the Model Provider when it has been invalidated. In this mode, the Model is no
-     * longer valid and methods will fail.
-     */
-    int INVALIDATED = 2;
-  }
-
-  /** Returns the current state of the ModelProvider */
-  @State
-  int getCurrentState();
-
-  /** A String which represents the session bound to the ModelProvider. */
-  /*@Nullable*/
-  String getSessionId();
-
-  /**
-   * Returns a List of ModelChild for the root. These children may not be bound. This is not
-   * intended to be used by the Stream to access children directly. Instead the ModelCursor should
-   * be used.
-   */
-  List<ModelChild> getAllRootChildren();
-
-  /** Allow the Stream to provide a RemoveTracking based upon mutation context. */
-  interface RemoveTrackingFactory<T> {
-
-    /**
-     * Returns the {@link RemoveTracking}, if this returns {@code null} then no remove tracking will
-     * be preformed on this ModelProvider mutation.
-     */
-    /*@Nullable*/
-    RemoveTracking<T> create(MutationContext mutationContext);
-  }
-
-  /** Called by the stream to set the {@link RemoveTrackingFactory}. */
-  void enableRemoveTracking(RemoveTrackingFactory<?> removeTrackingFactory);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelProviderFactory.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelProviderFactory.java
deleted file mode 100644
index f69d2f9..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelProviderFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProvider.ViewDepthProvider;
-import com.google.android.libraries.feed.common.functional.Predicate;
-import com.google.search.now.feed.client.StreamDataProto.StreamStructure;
-import com.google.search.now.feed.client.StreamDataProto.UiContext;
-
-/** Factory method for creating {@link ModelProvider} instances. */
-public interface ModelProviderFactory {
-  /**
-   * Returns a new instance of a {@link ModelProvider} from an existing session. This session may
-   * become INVALIDATED if the session was garbage collected by the Session Manager.
-   */
-  ModelProvider create(String sessionId, UiContext uiContext);
-
-  /** Returns a new instance of a {@link ModelProvider} from $HEAD. */
-  ModelProvider createNew(/*@Nullable*/ ViewDepthProvider viewDepthProvider, UiContext uiContext);
-
-  ModelProvider createNew(
-      /*@Nullable*/ ViewDepthProvider viewDepthProvider,
-      /*@Nullable*/ Predicate<StreamStructure> filterPredicate,
-      UiContext uiContext);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelProviderObserver.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelProviderObserver.java
deleted file mode 100644
index 2faff09..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelProviderObserver.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-import com.google.search.now.feed.client.StreamDataProto.UiContext;
-
-/** Interface used to observe events on the {@link ModelProvider}. */
-public interface ModelProviderObserver {
-
-  /**
-   * This event is triggered when the ModelProvider is fully initialized and it can be accessed by
-   * the UI. If you register for the ModelProvider after the Session is Ready, we will call the
-   * Observer. Otherwise the Observer is called once initialization is finished.
-   */
-  void onSessionStart(UiContext uiContext);
-
-  /**
-   * This event is triggered when the Session is invalidated. Once this is called, the UI should no
-   * longer call this model. The ModelProvider will free all resources assocated with it including
-   * invalidating all existing Cursors.
-   *
-   * @param uiContext If the session is being finished because of the UI, then this will be the
-   *     context given by the UI, otherwise it will be {@link UiContext#getDefaultInstance()}.
-   */
-  void onSessionFinished(UiContext uiContext);
-
-  /**
-   * This is called in the event of an error. For example, if we are making a request and it fails
-   * due to network connectivity issues, this event will indicate the error.
-   */
-  void onError(ModelError modelError);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelToken.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelToken.java
deleted file mode 100644
index 550be80..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelToken.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-import com.google.android.libraries.feed.common.feedobservable.Observable;
-import com.google.search.now.feed.client.StreamDataProto.StreamToken;
-
-/** Defines the behavior of a Continuation Token. */
-public interface ModelToken extends Observable<TokenCompletedObserver> {
-  /** Returns the {@link StreamToken} proto instance. */
-  StreamToken getStreamToken();
-
-  /** Returns {@code true} if token was generated on-device and can complete quickly. */
-  boolean isSynthetic();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/RemoveTracking.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/RemoveTracking.java
deleted file mode 100644
index de78b6a..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/RemoveTracking.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-import com.google.android.libraries.feed.common.functional.Consumer;
-import com.google.android.libraries.feed.common.functional.Function;
-import com.google.search.now.feed.client.StreamDataProto.StreamFeature;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Class which implements the filtering portion of remove tracking. This class creates a {@code
- * List<T>} of items using the {@code filterPredicate} function to both filter and transform a
- * {@link StreamFeature}. The function may return null, these values will be filtered.
- *
- * <p>The {@link #triggerConsumerUpdate()} will call the {@link Consumer}. It will be called when
- * all remove within the ModelProvider mutation have been processed.
- *
- * <p>The {@code Consumer} will be called on the main thread and called once per mutation. In
- * addition, the {@code Consumer} is called before the change operation.
- */
-public final class RemoveTracking<T> {
-  private final Function<StreamFeature, /*@Nullable*/ T> filterPredicate;
-  private final Consumer<List<T>> consumer;
-  private final List<T> matchingItems = new ArrayList<>();
-
-  /**
-   * Create the state necessary to call transform and filter the removed subtree before calling the
-   * {@link Consumer}.
-   */
-  public RemoveTracking(
-      Function<StreamFeature, /*@Nullable*/ T> filterPredicate, Consumer<List<T>> consumer) {
-    this.filterPredicate = filterPredicate;
-    this.consumer = consumer;
-  }
-
-  /**
-   * Called to transform and filter a {@link StreamFeature} found within a subtree being removed.
-   */
-  public void filterStreamFeature(StreamFeature streamFeature) {
-    T value = filterPredicate.apply(streamFeature);
-    if (value != null) {
-      matchingItems.add(value);
-    }
-  }
-
-  /** Called on the main thread call the {@link Consumer} after all removes have been processed. */
-  public void triggerConsumerUpdate() {
-    consumer.accept(matchingItems);
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/TokenCompleted.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/TokenCompleted.java
deleted file mode 100644
index 52d256a..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/TokenCompleted.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-/** Defines completion of a continuation token initiated request. */
-public final class TokenCompleted {
-  private final ModelCursor modelCursor;
-
-  public TokenCompleted(ModelCursor modelCursor) {
-    this.modelCursor = modelCursor;
-  }
-
-  /**
-   * Returns a cursor representing the continuation from the point in the stream the continuation
-   * token was found.
-   */
-  public ModelCursor getCursor() {
-    return modelCursor;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/TokenCompletedObserver.java b/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/TokenCompletedObserver.java
deleted file mode 100644
index 8a6f1b0..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/TokenCompletedObserver.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.modelprovider;
-
-/** Observes for when the Token fetch completes, producing a new cursor. */
-public interface TokenCompletedObserver {
-  /** Called when the token processing has completed. */
-  void onTokenCompleted(TokenCompleted tokenCompleted);
-
-  /**
-   * This is called in the event of an error. For example, if we are making a pagination request and
-   * it fails due to network connectivity issues, this event will indicate the error.
-   */
-  void onError(ModelError modelError);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/protocoladapter/BUILD b/src/main/java/com/google/android/libraries/feed/api/internal/protocoladapter/BUILD
deleted file mode 100644
index 0958d38..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/protocoladapter/BUILD
+++ /dev/null
@@ -1,14 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "protocoladapter",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/internal/common",
-        "//src/main/java/com/google/android/libraries/feed/common",
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "//src/main/proto/search/now/wire/feed:feed_java_proto_lite",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/protocoladapter/ProtocolAdapter.java b/src/main/java/com/google/android/libraries/feed/api/internal/protocoladapter/ProtocolAdapter.java
deleted file mode 100644
index d6c3eaa..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/protocoladapter/ProtocolAdapter.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.protocoladapter;
-
-import com.google.android.libraries.feed.api.internal.common.Model;
-import com.google.android.libraries.feed.common.Result;
-import com.google.search.now.feed.client.StreamDataProto.StreamDataOperation;
-import com.google.search.now.wire.feed.ContentIdProto.ContentId;
-import com.google.search.now.wire.feed.DataOperationProto.DataOperation;
-import com.google.search.now.wire.feed.ResponseProto.Response;
-import java.util.List;
-
-/** Converts the wire protocol (protos sent from the server) into an internal representation. */
-public interface ProtocolAdapter {
-  /**
-   * Create the internal protocol from a wire protocol response definition. The wire protocol is
-   * turned into a {@link Model} containing a list of {@link StreamDataOperation}s and a schema
-   * version.
-   */
-  Result<Model> createModel(Response response);
-
-  /**
-   * Create {@link StreamDataOperation}s from the internal protocol for the wire protocol
-   * DataOperations.
-   */
-  Result<List<StreamDataOperation>> createOperations(List<DataOperation> dataOperations);
-
-  /**
-   * Convert a wire protocol ContentId into the {@code String} version. Inverse of {@link
-   * #getWireContentId(String)}
-   */
-  String getStreamContentId(ContentId contentId);
-
-  /**
-   * Convert a string ContentId into the wire protocol version. Inverse of {@link
-   * #getStreamContentId(ContentId)}. Note that due to default proto values, if no ID was set in
-   * {@link #getStreamContentId(ContentId)}, this method will set the ID to 0.
-   */
-  Result<ContentId> getWireContentId(String contentId);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/protocoladapter/RequiredContentAdapter.java b/src/main/java/com/google/android/libraries/feed/api/internal/protocoladapter/RequiredContentAdapter.java
deleted file mode 100644
index 4f938cd..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/protocoladapter/RequiredContentAdapter.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2019 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.protocoladapter;
-
-import com.google.search.now.wire.feed.ContentIdProto.ContentId;
-import com.google.search.now.wire.feed.DataOperationProto.DataOperation;
-import java.util.List;
-
-/**
- * Interface that creates an extension point where implementers can indicate that a DataOperation is
- * dependent on other content.
- */
-public interface RequiredContentAdapter {
-  List<ContentId> determineRequiredContentIds(DataOperation dataOperation);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/requestmanager/ActionUploadRequestManager.java b/src/main/java/com/google/android/libraries/feed/api/internal/requestmanager/ActionUploadRequestManager.java
deleted file mode 100644
index fd5f8db..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/requestmanager/ActionUploadRequestManager.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.requestmanager;
-
-import com.google.android.libraries.feed.common.Result;
-import com.google.android.libraries.feed.common.functional.Consumer;
-import com.google.search.now.feed.client.StreamDataProto.StreamUploadableAction;
-import com.google.search.now.wire.feed.ConsistencyTokenProto.ConsistencyToken;
-import java.util.Set;
-
-/** Creates and issues upload action requests to the server. */
-public interface ActionUploadRequestManager {
-
-  /**
-   * Issues a request to record a set of actions.
-   *
-   * <p>The provided {@code consumer} will be executed on a background thread.
-   */
-  void triggerUploadActions(
-      Set<StreamUploadableAction> actions,
-      ConsistencyToken token,
-      Consumer<Result<ConsistencyToken>> consumer);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/requestmanager/BUILD b/src/main/java/com/google/android/libraries/feed/api/internal/requestmanager/BUILD
deleted file mode 100644
index 3349377..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/requestmanager/BUILD
+++ /dev/null
@@ -1,16 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "requestmanager",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/host/logging",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/common",
-        "//src/main/java/com/google/android/libraries/feed/common",
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "//src/main/proto/search/now/wire/feed:feed_java_proto_lite",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/requestmanager/FeedRequestManager.java b/src/main/java/com/google/android/libraries/feed/api/internal/requestmanager/FeedRequestManager.java
deleted file mode 100644
index 84bca33..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/requestmanager/FeedRequestManager.java
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.requestmanager;
-
-import com.google.android.libraries.feed.api.host.logging.RequestReason;
-import com.google.android.libraries.feed.api.internal.common.Model;
-import com.google.android.libraries.feed.common.Result;
-import com.google.android.libraries.feed.common.functional.Consumer;
-import com.google.search.now.feed.client.StreamDataProto.StreamToken;
-import com.google.search.now.wire.feed.ConsistencyTokenProto.ConsistencyToken;
-
-/**
- * Creates and issues requests to the server.
- *
- * <p>Note: this is the internal version of FeedRequestManager. See {@link RequestManager} for the
- * client version.
- */
-public interface FeedRequestManager {
-  /**
-   * Issues a request for the next page of data. The {@code streamToken} described to the server
-   * what the next page means. The{@code token} is used by the server for consistent data across
-   * requests. The response will be sent to a {@link Consumer} with a {@link Model} created by the
-   * ProtocolAdapter.
-   */
-  void loadMore(StreamToken streamToken, ConsistencyToken token, Consumer<Result<Model>> consumer);
-
-  /**
-   * Issues a request to refresh the entire feed, with the consumer being called back with the
-   * resulting {@link Model}.
-   *
-   * @param reason The reason for this refresh.
-   */
-  void triggerRefresh(@RequestReason int reason, Consumer<Result<Model>> consumer);
-
-  /**
-   * Issues a request to refresh the entire feed, with the consumer being called back with the
-   * resulting {@link Model}.
-   *
-   * @param reason The reason for this refresh.
-   * @param token Used by the server for consistent data across requests.
-   * @param consumer The consumer called after the refresh is performed.
-   */
-  void triggerRefresh(
-      @RequestReason int reason, ConsistencyToken token, Consumer<Result<Model>> consumer);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/scope/BUILD b/src/main/java/com/google/android/libraries/feed/api/internal/scope/BUILD
deleted file mode 100644
index 38fdd59..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/scope/BUILD
+++ /dev/null
@@ -1,65 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "scope",
-    srcs = glob(
-        ["*.java"],
-        exclude = ["*Scope.java"],
-    ),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/host/logging",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/common",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/lifecycle",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/sessionmanager",
-        "//src/main/java/com/google/android/libraries/feed/common/concurrent",
-        "//src/main/java/com/google/android/libraries/feed/common/feedobservable",
-        "//src/main/java/com/google/android/libraries/feed/common/logging",
-        "//src/main/java/com/google/android/libraries/feed/feedapplifecyclelistener",
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "@com_google_code_findbugs_jsr305//jar",
-    ],
-)
-
-android_library(
-    name = "feedprocessscope",
-    srcs = ["FeedProcessScope.java"],
-    deps = [
-        ":scope",
-        "//src/main/java/com/google/android/libraries/feed/api/client/knowncontent",
-        "//src/main/java/com/google/android/libraries/feed/api/client/lifecycle",
-        "//src/main/java/com/google/android/libraries/feed/api/client/requestmanager",
-        "//src/main/java/com/google/android/libraries/feed/api/client/scope:processscope",
-        "//src/main/java/com/google/android/libraries/feed/api/client/scope:streamscopebuilder",
-        "//src/main/java/com/google/android/libraries/feed/api/host/action",
-        "//src/main/java/com/google/android/libraries/feed/api/host/config",
-        "//src/main/java/com/google/android/libraries/feed/api/host/imageloader",
-        "//src/main/java/com/google/android/libraries/feed/api/host/logging",
-        "//src/main/java/com/google/android/libraries/feed/api/host/network",
-        "//src/main/java/com/google/android/libraries/feed/api/host/offlineindicator",
-        "//src/main/java/com/google/android/libraries/feed/api/host/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/actionmanager",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/common",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/knowncontent",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/protocoladapter",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/sessionmanager",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/store",
-        "//src/main/java/com/google/android/libraries/feed/basicstream",
-        "//src/main/java/com/google/android/libraries/feed/common/concurrent",
-        "//src/main/java/com/google/android/libraries/feed/common/logging",
-        "//src/main/java/com/google/android/libraries/feed/common/protoextensions",
-        "//src/main/java/com/google/android/libraries/feed/common/time",
-    ],
-)
-
-android_library(
-    name = "feedstreamscope",
-    srcs = ["FeedStreamScope.java"],
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/client/scope:streamscope",
-        "//src/main/java/com/google/android/libraries/feed/api/client/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/modelprovider",
-        "//src/main/java/com/google/android/libraries/feed/basicstream",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/scope/ClearAllListener.java b/src/main/java/com/google/android/libraries/feed/api/internal/scope/ClearAllListener.java
deleted file mode 100644
index 35ac8f3..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/scope/ClearAllListener.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.scope;
-
-import com.google.android.libraries.feed.api.host.logging.RequestReason;
-import com.google.android.libraries.feed.api.host.logging.Task;
-import com.google.android.libraries.feed.api.internal.common.ThreadUtils;
-import com.google.android.libraries.feed.api.internal.lifecycle.Resettable;
-import com.google.android.libraries.feed.api.internal.sessionmanager.FeedSessionManager;
-import com.google.android.libraries.feed.common.concurrent.TaskQueue;
-import com.google.android.libraries.feed.common.concurrent.TaskQueue.TaskType;
-import com.google.android.libraries.feed.common.feedobservable.FeedObservable;
-import com.google.android.libraries.feed.common.logging.Dumpable;
-import com.google.android.libraries.feed.common.logging.Dumper;
-import com.google.android.libraries.feed.common.logging.Logger;
-import com.google.android.libraries.feed.feedapplifecyclelistener.FeedLifecycleListener;
-import com.google.search.now.feed.client.StreamDataProto.UiContext;
-
-/**
- * This class will implements Clear All in Jardin. It will run all of the clear operations on a
- * single background thread.
- */
-public final class ClearAllListener implements FeedLifecycleListener, Dumpable {
-  private static final String TAG = "ClearAllListener";
-
-  private final TaskQueue taskQueue;
-  private final FeedSessionManager feedSessionManager;
-  private final /*@Nullable*/ Resettable store;
-  private final ThreadUtils threadUtils;
-  private int clearCount = 0;
-  private int refreshCount = 0;
-
-  @SuppressWarnings("argument.type.incompatible") // ok call to registerObserver
-  public ClearAllListener(
-      TaskQueue taskQueue,
-      FeedSessionManager feedSessionManager,
-      /*@Nullable*/ Resettable store,
-      ThreadUtils threadUtils,
-      FeedObservable<FeedLifecycleListener> lifecycleListenerObservable) {
-    this.taskQueue = taskQueue;
-    this.feedSessionManager = feedSessionManager;
-    this.store = store;
-    this.threadUtils = threadUtils;
-
-    lifecycleListenerObservable.registerObserver(this);
-  }
-
-  @Override
-  public void onLifecycleEvent(String event) {
-    switch (event) {
-      case LifecycleEvent.CLEAR_ALL:
-        taskQueue.execute(Task.CLEAR_ALL, TaskType.IMMEDIATE, this::clearAll);
-        break;
-      case LifecycleEvent.CLEAR_ALL_WITH_REFRESH:
-        taskQueue.execute(
-            Task.CLEAR_ALL_WITH_REFRESH, TaskType.IMMEDIATE, this::clearAllWithRefresh);
-        break;
-      default:
-        // Do nothing
-    }
-  }
-
-  private void clearAll() {
-    threadUtils.checkNotMainThread();
-    clearCount++;
-
-    Logger.i(TAG, "starting clearAll");
-    // Clear the task queue first, preventing any tasks from running until initialization
-    taskQueue.reset();
-    // reset the session state
-    feedSessionManager.reset();
-    if (store != null) {
-      store.reset();
-    }
-    // Initialize the TaskQueue so new tasks will start running
-    taskQueue.completeReset();
-  }
-
-  private void clearAllWithRefresh() {
-    threadUtils.checkNotMainThread();
-    clearAll();
-    feedSessionManager.triggerRefresh(
-        null, RequestReason.CLEAR_ALL, UiContext.getDefaultInstance());
-    refreshCount++;
-  }
-
-  @Override
-  public void dump(Dumper dumper) {
-    dumper.title(TAG);
-    dumper.forKey("clearCount").value(clearCount);
-    dumper.forKey("clearWithRefreshCount").value(refreshCount);
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/scope/FeedProcessScope.java b/src/main/java/com/google/android/libraries/feed/api/internal/scope/FeedProcessScope.java
deleted file mode 100644
index f7b150a..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/scope/FeedProcessScope.java
+++ /dev/null
@@ -1,230 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.scope;
-
-import android.content.Context;
-import com.google.android.libraries.feed.api.client.knowncontent.KnownContent;
-import com.google.android.libraries.feed.api.client.lifecycle.AppLifecycleListener;
-import com.google.android.libraries.feed.api.client.requestmanager.RequestManager;
-import com.google.android.libraries.feed.api.client.scope.ProcessScope;
-import com.google.android.libraries.feed.api.client.scope.StreamScopeBuilder;
-import com.google.android.libraries.feed.api.host.action.ActionApi;
-import com.google.android.libraries.feed.api.host.config.ApplicationInfo;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.config.DebugBehavior;
-import com.google.android.libraries.feed.api.host.imageloader.ImageLoaderApi;
-import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
-import com.google.android.libraries.feed.api.host.network.NetworkClient;
-import com.google.android.libraries.feed.api.host.offlineindicator.OfflineIndicatorApi;
-import com.google.android.libraries.feed.api.host.stream.CardConfiguration;
-import com.google.android.libraries.feed.api.host.stream.SnackbarApi;
-import com.google.android.libraries.feed.api.host.stream.StreamConfiguration;
-import com.google.android.libraries.feed.api.host.stream.TooltipApi;
-import com.google.android.libraries.feed.api.host.stream.TooltipSupportedApi;
-import com.google.android.libraries.feed.api.internal.actionmanager.ActionManager;
-import com.google.android.libraries.feed.api.internal.common.ThreadUtils;
-import com.google.android.libraries.feed.api.internal.knowncontent.FeedKnownContent;
-import com.google.android.libraries.feed.api.internal.protocoladapter.ProtocolAdapter;
-import com.google.android.libraries.feed.api.internal.sessionmanager.FeedSessionManager;
-import com.google.android.libraries.feed.api.internal.store.Store;
-import com.google.android.libraries.feed.common.concurrent.MainThreadRunner;
-import com.google.android.libraries.feed.common.concurrent.TaskQueue;
-import com.google.android.libraries.feed.common.logging.Dumpable;
-import com.google.android.libraries.feed.common.logging.Dumper;
-import com.google.android.libraries.feed.common.logging.Logger;
-import com.google.android.libraries.feed.common.protoextensions.FeedExtensionRegistry;
-import com.google.android.libraries.feed.common.time.Clock;
-import com.google.android.libraries.feed.common.time.TimingUtils;
-
-/**
- * Per-process instance of the feed library.
- *
- * <p>It's the host's responsibility to make sure there's only one instance of this per process, per
- * user.
- */
-public final class FeedProcessScope implements ProcessScope {
-  private static final String TAG = "FeedProcessScope";
-
-  private final NetworkClient networkClient;
-  private final ProtocolAdapter protocolAdapter;
-  private final RequestManager requestManager;
-  private final FeedSessionManager feedSessionManager;
-  private final Store store;
-  private final TimingUtils timingUtils;
-  private final ThreadUtils threadUtils;
-  private final TaskQueue taskQueue;
-  private final MainThreadRunner mainThreadRunner;
-  private final AppLifecycleListener appLifecycleListener;
-  private final Clock clock;
-  private final DebugBehavior debugBehavior;
-  private final ActionManager actionManager;
-  private final Configuration configuration;
-  private final FeedKnownContent feedKnownContent;
-  private final FeedExtensionRegistry feedExtensionRegistry;
-  private final ClearAllListener clearAllListener;
-  private final BasicLoggingApi basicLoggingApi;
-  private final TooltipSupportedApi tooltipSupportedApi;
-  private final ApplicationInfo applicationInfo;
-
-  /** Created through the {@link Builder}. */
-  public FeedProcessScope(
-      BasicLoggingApi basicLoggingApi,
-      NetworkClient networkClient,
-      ProtocolAdapter protocolAdapter,
-      RequestManager requestManager,
-      FeedSessionManager feedSessionManager,
-      Store store,
-      TimingUtils timingUtils,
-      ThreadUtils threadUtils,
-      TaskQueue taskQueue,
-      MainThreadRunner mainThreadRunner,
-      AppLifecycleListener appLifecycleListener,
-      Clock clock,
-      DebugBehavior debugBehavior,
-      ActionManager actionManager,
-      Configuration configuration,
-      FeedKnownContent feedKnownContent,
-      FeedExtensionRegistry feedExtensionRegistry,
-      ClearAllListener clearAllListener,
-      TooltipSupportedApi tooltipSupportedApi,
-      ApplicationInfo applicationInfo) {
-    this.basicLoggingApi = basicLoggingApi;
-    this.networkClient = networkClient;
-    this.protocolAdapter = protocolAdapter;
-    this.requestManager = requestManager;
-    this.feedSessionManager = feedSessionManager;
-    this.store = store;
-    this.timingUtils = timingUtils;
-    this.threadUtils = threadUtils;
-    this.taskQueue = taskQueue;
-    this.mainThreadRunner = mainThreadRunner;
-    this.appLifecycleListener = appLifecycleListener;
-    this.clock = clock;
-    this.debugBehavior = debugBehavior;
-    this.actionManager = actionManager;
-    this.configuration = configuration;
-    this.feedKnownContent = feedKnownContent;
-    this.feedExtensionRegistry = feedExtensionRegistry;
-    this.clearAllListener = clearAllListener;
-    this.tooltipSupportedApi = tooltipSupportedApi;
-    this.applicationInfo = applicationInfo;
-  }
-
-  @Override
-  public void dump(Dumper dumper) {
-    dumper.title(TAG);
-    if (protocolAdapter instanceof Dumpable) {
-      dumper.dump((Dumpable) protocolAdapter);
-    }
-    dumper.dump(timingUtils);
-    if (feedSessionManager instanceof Dumpable) {
-      dumper.dump((Dumpable) feedSessionManager);
-    }
-    if (store instanceof Dumpable) {
-      dumper.dump((Dumpable) store);
-    }
-    dumper.dump(clearAllListener);
-  }
-
-  @Override
-  public void onDestroy() {
-    try {
-      Logger.i(TAG, "FeedProcessScope onDestroy called");
-      networkClient.close();
-      taskQueue.reset();
-      taskQueue.completeReset();
-    } catch (Exception ignored) {
-      // Ignore exception when closing.
-    }
-  }
-
-  @Deprecated
-  public ProtocolAdapter getProtocolAdapter() {
-    return protocolAdapter;
-  }
-
-
-  public RequestManager getRequestManager() {
-    return requestManager;
-  }
-
-  @Deprecated
-  public TimingUtils getTimingUtils() {
-    return timingUtils;
-  }
-
-  public TaskQueue getTaskQueue() {
-    return taskQueue;
-  }
-
-  public AppLifecycleListener getAppLifecycleListener() {
-    return appLifecycleListener;
-  }
-
-  @Deprecated
-  public ActionManager getActionManager() {
-    return actionManager;
-  }
-
-  public KnownContent getKnownContent() {
-    return feedKnownContent;
-  }
-
-  @Deprecated
-  public FeedExtensionRegistry getFeedExtensionRegistry() {
-    return feedExtensionRegistry;
-  }
-
-  /**
-   * Return a {@link Builder} to create a FeedProcessScope
-   *
-   * <p>This is called by hosts so it must be public
-   */
-  @Override
-  public StreamScopeBuilder createStreamScopeBuilder(
-      Context context,
-      ImageLoaderApi imageLoaderApi,
-      ActionApi actionApi,
-      StreamConfiguration streamConfiguration,
-      CardConfiguration cardConfiguration,
-      SnackbarApi snackbarApi,
-      OfflineIndicatorApi offlineIndicatorApi,
-      TooltipApi tooltipApi) {
-    return new StreamScopeBuilder(
-        context,
-        actionApi,
-        imageLoaderApi,
-        protocolAdapter,
-        feedSessionManager,
-        threadUtils,
-        timingUtils,
-        taskQueue,
-        mainThreadRunner,
-        clock,
-        debugBehavior,
-        streamConfiguration,
-        cardConfiguration,
-        actionManager,
-        configuration,
-        snackbarApi,
-        basicLoggingApi,
-        offlineIndicatorApi,
-        feedKnownContent,
-        tooltipApi,
-        tooltipSupportedApi,
-        applicationInfo,
-        feedExtensionRegistry);
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/scope/FeedStreamScope.java b/src/main/java/com/google/android/libraries/feed/api/internal/scope/FeedStreamScope.java
deleted file mode 100644
index 2704665..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/scope/FeedStreamScope.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.scope;
-
-import com.google.android.libraries.feed.api.client.scope.StreamScope;
-import com.google.android.libraries.feed.api.client.stream.Stream;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProviderFactory;
-
-/** Per-stream instance of the feed library. */
-public final class FeedStreamScope implements StreamScope {
-
-  private final Stream stream;
-  private final ModelProviderFactory modelProviderFactory;
-
-  public FeedStreamScope(Stream stream, ModelProviderFactory modelProviderFactory) {
-    this.stream = stream;
-    this.modelProviderFactory = modelProviderFactory;
-  }
-
-  public Stream getStream() {
-    return stream;
-  }
-
-  public ModelProviderFactory getModelProviderFactory() {
-    return modelProviderFactory;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/sessionmanager/BUILD b/src/main/java/com/google/android/libraries/feed/api/internal/sessionmanager/BUILD
deleted file mode 100644
index 7d2e645..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/sessionmanager/BUILD
+++ /dev/null
@@ -1,21 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "sessionmanager",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/client/knowncontent",
-        "//src/main/java/com/google/android/libraries/feed/api/common",
-        "//src/main/java/com/google/android/libraries/feed/api/host/logging",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/common",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/lifecycle",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/modelprovider",
-        "//src/main/java/com/google/android/libraries/feed/common",
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "//src/main/proto/search/now/wire/feed:feed_java_proto_lite",
-        "@com_google_code_findbugs_jsr305//jar",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/sessionmanager/FeedSessionManager.java b/src/main/java/com/google/android/libraries/feed/api/internal/sessionmanager/FeedSessionManager.java
deleted file mode 100644
index a901f70..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/sessionmanager/FeedSessionManager.java
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.sessionmanager;
-
-import com.google.android.libraries.feed.api.client.knowncontent.KnownContent;
-import com.google.android.libraries.feed.api.common.MutationContext;
-import com.google.android.libraries.feed.api.host.logging.RequestReason;
-import com.google.android.libraries.feed.api.internal.common.Model;
-import com.google.android.libraries.feed.api.internal.common.PayloadWithId;
-import com.google.android.libraries.feed.api.internal.lifecycle.Resettable;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProvider;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProvider.ViewDepthProvider;
-import com.google.android.libraries.feed.common.Result;
-import com.google.android.libraries.feed.common.functional.Consumer;
-import com.google.android.libraries.feed.common.functional.Function;
-import com.google.search.now.feed.client.StreamDataProto.StreamDataOperation;
-import com.google.search.now.feed.client.StreamDataProto.StreamPayload;
-import com.google.search.now.feed.client.StreamDataProto.StreamSharedState;
-import com.google.search.now.feed.client.StreamDataProto.StreamToken;
-import com.google.search.now.feed.client.StreamDataProto.StreamUploadableAction;
-import com.google.search.now.feed.client.StreamDataProto.UiContext;
-import com.google.search.now.wire.feed.ConsistencyTokenProto.ConsistencyToken;
-import com.google.search.now.wire.feed.ContentIdProto.ContentId;
-import java.util.List;
-import java.util.Set;
-
-/**
- * The FeedSessionManager is responsible for creating and updating. A session has a one-to-one
- * relationship with a ModelProvider. The FeedSessionManager implements the session functionality
- * and management.
- */
-public interface FeedSessionManager extends Resettable {
-
-  /**
-   * This is called by the UI to get a new session. The life of the session is controlled by the
-   * Session manager. The FeedSessionManager maintains HEAD$ which represents the most current state
-   * of the stream. It will also decide which changes should be made to existing sessions and the
-   * life time of existing sessions.
-   */
-  void getNewSession(
-      ModelProvider modelProvider,
-      /*@Nullable*/ ViewDepthProvider viewDepthProvider,
-      UiContext uiContext);
-
-  /**
-   * Create a new Session attached to the ModelProvider for an existing sessionId. This will
-   * invalidate any existing ModelProvider instances attached to the session.
-   */
-  void getExistingSession(String sessionId, ModelProvider modelProvider, UiContext uiContext);
-
-  /** This is called by the ModelProvider when it is invalidated. */
-  void invalidateSession(String sessionId);
-
-  /** This is called by the ModelProvider to detach the ModelProvider for the session. */
-  void detachSession(String sessionId);
-
-  /**
-   * This method will invalidate head. All {@link #getNewSession(ModelProvider, ViewDepthProvider,
-   * UiContext)} will block until a new a response updates the FeedSessionManager providing the new
-   * head.
-   */
-  void invalidateHead();
-
-  /**
-   * Method which causes a request to be created for the next page of content based upon the
-   * continuation token. This could be called from multiple Model Providers.
-   */
-  void handleToken(String sessionId, StreamToken streamToken);
-
-  /** Method which causes a refresh */
-  void triggerRefresh(/*@Nullable*/ String sessionId);
-
-  /**
-   * Method which causes a refresh
-   *
-   * @param sessionId The session id associated with the request.
-   * @param requestReason The reason for triggering a refresh.
-   * @param uiContext The UI only context for the refresh.
-   */
-  void triggerRefresh(
-      /*@Nullable*/ String sessionId, @RequestReason int requestReason, UiContext uiContext);
-
-  /**
-   * Returns a List of {@link StreamPayload} for each of the keys. This must be called on the
-   * background thread.
-   */
-  Result<List<PayloadWithId>> getStreamFeatures(List<String> contentIds);
-
-  /**
-   * Return the shared state. This operation will be fast, so it can be called on the UI Thread.
-   * This method will return {@code null} if the shared state is not found.
-   */
-  /*@Nullable*/
-  StreamSharedState getSharedState(ContentId contentId);
-
-  /**
-   * Create a filtered {@link List} of {@code T} objects and return it through the {@link Consumer}.
-   * The {@code filterPredicate} function will be applied to each node in the structured tree
-   * defined by $HEAD. The method acts as both a transformer to create type {@code T} and as a
-   * filter over the input {@link StreamPayload}. If {@code filterPredicate} returns {@code null},
-   * the value will not be added to the filtered list. This is an expensive operation and will run
-   * on a background thread.
-   */
-  <T> void getStreamFeaturesFromHead(
-      Function<StreamPayload, /*@Nullable*/ T> filterPredicate,
-      Consumer<Result<List</*@NonNull*/ T>>> consumer);
-
-  /** Sets {@link KnownContentListener} to allow for informing host of when content is added. */
-  void setKnownContentListener(KnownContent.Listener knownContentListener);
-
-  /**
-   * Issues a request to record a set of actions, with the consumer being called back with the
-   * resulting {@link ConsistencyToken}.
-   */
-  void triggerUploadActions(Set<StreamUploadableAction> actions);
-
-  /**
-   * Issues a request to record a set of actions, with the consumer being called back with the
-   * resulting {@link ConsistencyToken}.
-   */
-  void fetchActionsAndUpload(Consumer<Result<ConsistencyToken>> consumer);
-
-  /**
-   * Return a {@link Consumer} which is able to handle an update to the SessionManager. An update
-   * consists of {@link Model} containing a list of {@link StreamDataOperation} objects. The {@link
-   * MutationContext} captures the context which is initiating the update operation.
-   */
-  Consumer<Result<Model>> getUpdateConsumer(MutationContext mutationContext);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/store/BUILD b/src/main/java/com/google/android/libraries/feed/api/internal/store/BUILD
deleted file mode 100644
index 0aa97de..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/store/BUILD
+++ /dev/null
@@ -1,18 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-java_library(
-    name = "store",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/host/storage",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/common",
-        "//src/main/java/com/google/android/libraries/feed/common",
-        "//src/main/java/com/google/android/libraries/feed/common/feedobservable",
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "@com_google_protobuf_javalite//:protobuf_java_lite",
-        "@maven//:com_android_support_support_annotations",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/store/ContentMutation.java b/src/main/java/com/google/android/libraries/feed/api/internal/store/ContentMutation.java
deleted file mode 100644
index 659b478..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/store/ContentMutation.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.store;
-
-import com.google.android.libraries.feed.api.host.storage.CommitResult;
-import com.google.search.now.feed.client.StreamDataProto.StreamPayload;
-
-/**
- * Mutation for adding and updating Content in the Feed Store. Remove will be handled by a task
- * which garbage collects the content that is not longer defined in any sessions.
- */
-public interface ContentMutation {
-
-  /** Add a new Mutation to the Store */
-  ContentMutation add(String contentId, StreamPayload payload);
-
-  /** Commit the mutations to the backing store */
-  CommitResult commit();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/store/LocalActionMutation.java b/src/main/java/com/google/android/libraries/feed/api/internal/store/LocalActionMutation.java
deleted file mode 100644
index b2a1af3..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/store/LocalActionMutation.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.store;
-
-import android.support.annotation.IntDef;
-import com.google.android.libraries.feed.api.host.storage.CommitResult;
-
-/** Mutation for adding and updating actions in the Feed Store. */
-public interface LocalActionMutation {
-
-  @IntDef({ActionType.DISMISS})
-  @interface ActionType {
-    int DISMISS = 1;
-  }
-
-  /** Add a new Mutation to the Store */
-  LocalActionMutation add(@ActionType int action, String contentId);
-
-  /** Commit the mutations to the backing store */
-  CommitResult commit();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/store/SemanticPropertiesMutation.java b/src/main/java/com/google/android/libraries/feed/api/internal/store/SemanticPropertiesMutation.java
deleted file mode 100644
index 5836959..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/store/SemanticPropertiesMutation.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.store;
-
-import com.google.android.libraries.feed.api.host.storage.CommitResult;
-import com.google.protobuf.ByteString;
-
-/** Used to commit mutations to semantic properties data within the {@link Store} */
-public interface SemanticPropertiesMutation {
-  /** Add a new semantic properties mutation */
-  SemanticPropertiesMutation add(String contentId, ByteString semanticData);
-
-  /** Commit the current mutations */
-  CommitResult commit();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/store/SessionMutation.java b/src/main/java/com/google/android/libraries/feed/api/internal/store/SessionMutation.java
deleted file mode 100644
index 31e3048..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/store/SessionMutation.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.store;
-
-import com.google.search.now.feed.client.StreamDataProto.StreamStructure;
-
-/** A structural mutation against a session. */
-public interface SessionMutation {
-
-  /** Add or update a structure in the store. */
-  SessionMutation add(StreamStructure streamStructure);
-
-  /** Commit the mutations to the backing store */
-  Boolean commit();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/store/Store.java b/src/main/java/com/google/android/libraries/feed/api/internal/store/Store.java
deleted file mode 100644
index 3bb0b70..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/store/Store.java
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.store;
-
-import com.google.android.libraries.feed.api.internal.common.PayloadWithId;
-import com.google.android.libraries.feed.api.internal.common.SemanticPropertiesWithId;
-import com.google.android.libraries.feed.common.Result;
-import com.google.android.libraries.feed.common.feedobservable.Observable;
-import com.google.android.libraries.feed.common.functional.Supplier;
-import com.google.search.now.feed.client.StreamDataProto.StreamDataOperation;
-import com.google.search.now.feed.client.StreamDataProto.StreamLocalAction;
-import com.google.search.now.feed.client.StreamDataProto.StreamSharedState;
-import com.google.search.now.feed.client.StreamDataProto.StreamStructure;
-import com.google.search.now.feed.client.StreamDataProto.StreamUploadableAction;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Interface defining the Store API used by the feed library to persist the internal proto objects
- * into a an underlying store. The store is divided into content and structure portions. Content is
- * retrieved using String representing the {@code ContentId}. The structure is defined through a set
- * of {@link StreamDataOperation} which define the structure of the stream. $HEAD defines the full
- * set of {@code StreamDataOperation}s defining the full stream. A {@link
- * com.google.search.now.feed.client.StreamDataProto.StreamSession} represents an instance of the
- * stream defined by a possible subset of $HEAD.
- *
- * <p>This object should not be used on the UI thread, as it may block on slow IO operations.
- */
-public interface Store extends Observable<StoreListener> {
-  /** The session id representing $HEAD */
-  String HEAD_SESSION_ID = "$HEAD";
-
-  /**
-   * Returns an {@code List} of the {@link PayloadWithId}s for the ContentId Strings passed in
-   * through {@code contentIds}.
-   */
-  Result<List<PayloadWithId>> getPayloads(List<String> contentIds);
-
-  /** Get the {@link StreamSharedState}s stored as content. */
-  Result<List<StreamSharedState>> getSharedStates();
-
-  /**
-   * Returns a list of all {@link StreamStructure}s for the session. The Stream Structure does not
-   * contain the content. This represents the full structure of the stream for a particular session.
-   */
-  Result<List<StreamStructure>> getStreamStructures(String sessionId);
-
-  /** Returns a list of all the session ids, excluding the $HEAD session. */
-  Result<List<String>> getAllSessions();
-
-  /** Gets all semantic properties objects associated with a given list of contentIds */
-  Result<List<SemanticPropertiesWithId>> getSemanticProperties(List<String> contentIds);
-
-  /** Gets an set of ALL {@link UploadableStreamAction}. Note that this includes expired actions. */
-  Result<Set<StreamUploadableAction>> getAllUploadableActions();
-
-  /**
-   * Gets an increasing, time-ordered list of ALL {@link StreamLocalAction} dismisses. Note that
-   * this includes expired actions.
-   */
-  Result<List<StreamLocalAction>> getAllDismissLocalActions();
-
-  /**
-   * Create a new session and return the id. The session is defined by all the {@link
-   * StreamDataOperation}s which are currently stored in $HEAD.
-   */
-  Result<String> createNewSession();
-
-  /** Remove a specific session. It is illegal to attempt to remove $HEAD. */
-  void removeSession(String sessionId);
-
-  /**
-   * Clears out all data operations defining $HEAD. Only $HEAD supports reset, all other session may
-   * not be reset. Instead they should be invalidated and removed, then a new session is created
-   * from $HEAD.
-   */
-  void clearHead();
-
-  /** Returns a mutation used to modify the content in the persistent store. */
-  ContentMutation editContent();
-
-  /** Returns a session mutation applied to a Session. */
-  SessionMutation editSession(String sessionId);
-
-  /** Returns a semantic properties mutation used to modify the properties in the store */
-  SemanticPropertiesMutation editSemanticProperties();
-
-  /** Returns an action mutation used to modify actions in the store */
-  LocalActionMutation editLocalActions();
-
-  /** Returns an action mutation used to modify uploadable actions in the store */
-  UploadableActionMutation editUploadableActions();
-
-  /**
-   * Returns a runnable which will garbage collect the persisted content. This is called by the
-   * SessionManager which controls the scheduling of cleanup tasks.
-   */
-  Runnable triggerContentGc(
-      Set<String> reservedContentIds,
-      Supplier<Set<String>> accessibleContent,
-      boolean keepSharedStates);
-
-  /**
-   * Returns a runnable that will garbage collect actions. All valid actions will be copied over to
-   * a new copy of the journal.
-   */
-  Runnable triggerLocalActionGc(List<StreamLocalAction> actions, List<String> validContentIds);
-
-  /**
-   * Switches to an ephemeral version of the store. Ephemeral mode of the store should run in memory
-   * and not attempt to write to disk.
-   */
-  void switchToEphemeralMode();
-
-  /** Whether the store is in ephemeral mode */
-  boolean isEphemeralMode();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/store/StoreListener.java b/src/main/java/com/google/android/libraries/feed/api/internal/store/StoreListener.java
deleted file mode 100644
index 97ae0ef..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/store/StoreListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.store;
-
-/** Allows classes to listen to changes to {@link Store} */
-public interface StoreListener {
-  /**
-   * Called when {@link Store} switches to ephemeral mode. This will be called on a background
-   * thread.
-   */
-  void onSwitchToEphemeralMode();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/store/UploadableActionMutation.java b/src/main/java/com/google/android/libraries/feed/api/internal/store/UploadableActionMutation.java
deleted file mode 100644
index b37e9ba..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/store/UploadableActionMutation.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.store;
-
-import com.google.android.libraries.feed.api.host.storage.CommitResult;
-import com.google.search.now.feed.client.StreamDataProto.StreamUploadableAction;
-
-/** Mutation for adding and updating uploadable actions in the Feed Store. */
-public interface UploadableActionMutation {
-
-  /** Upsert a new Mutation to the Store */
-  UploadableActionMutation upsert(StreamUploadableAction action, String contentId);
-
-  /** Remove Mutation from the Store */
-  UploadableActionMutation remove(StreamUploadableAction action, String contentId);
-
-  /** Commit the mutations to the backing store */
-  CommitResult commit();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/stream/BUILD b/src/main/java/com/google/android/libraries/feed/api/internal/stream/BUILD
deleted file mode 100644
index 4ef79e3..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/stream/BUILD
+++ /dev/null
@@ -1,27 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "stream",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/client/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/host/action",
-        "//src/main/java/com/google/android/libraries/feed/api/host/config",
-        "//src/main/java/com/google/android/libraries/feed/api/host/imageloader",
-        "//src/main/java/com/google/android/libraries/feed/api/host/logging",
-        "//src/main/java/com/google/android/libraries/feed/api/host/offlineindicator",
-        "//src/main/java/com/google/android/libraries/feed/api/host/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/actionmanager",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/actionparser",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/common",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/knowncontent",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/modelprovider",
-        "//src/main/java/com/google/android/libraries/feed/basicstream",
-        "//src/main/java/com/google/android/libraries/feed/common/concurrent",
-        "//src/main/java/com/google/android/libraries/feed/common/protoextensions",
-        "//src/main/java/com/google/android/libraries/feed/common/time",
-        "//src/main/java/com/google/android/libraries/feed/piet/host",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/stream/BasicStreamFactory.java b/src/main/java/com/google/android/libraries/feed/api/internal/stream/BasicStreamFactory.java
deleted file mode 100644
index 632ce60..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/stream/BasicStreamFactory.java
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2019 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.stream;
-
-import android.content.Context;
-import com.google.android.libraries.feed.api.client.stream.Stream;
-import com.google.android.libraries.feed.api.host.action.ActionApi;
-import com.google.android.libraries.feed.api.host.config.ApplicationInfo.BuildType;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.config.DebugBehavior;
-import com.google.android.libraries.feed.api.host.imageloader.ImageLoaderApi;
-import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
-import com.google.android.libraries.feed.api.host.offlineindicator.OfflineIndicatorApi;
-import com.google.android.libraries.feed.api.host.stream.CardConfiguration;
-import com.google.android.libraries.feed.api.host.stream.SnackbarApi;
-import com.google.android.libraries.feed.api.host.stream.StreamConfiguration;
-import com.google.android.libraries.feed.api.host.stream.TooltipApi;
-import com.google.android.libraries.feed.api.internal.actionmanager.ActionManager;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionParserFactory;
-import com.google.android.libraries.feed.api.internal.common.ThreadUtils;
-import com.google.android.libraries.feed.api.internal.knowncontent.FeedKnownContent;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProviderFactory;
-import com.google.android.libraries.feed.basicstream.BasicStream;
-import com.google.android.libraries.feed.common.concurrent.MainThreadRunner;
-import com.google.android.libraries.feed.common.protoextensions.FeedExtensionRegistry;
-import com.google.android.libraries.feed.common.time.Clock;
-import com.google.android.libraries.feed.piet.host.CustomElementProvider;
-import com.google.android.libraries.feed.piet.host.HostBindingProvider;
-import java.util.ArrayList;
-
-/** Factory to create {@link BasicStream} classes */
-public class BasicStreamFactory implements StreamFactory {
-  @Override
-  public Stream build(
-      ActionParserFactory actionParserFactory,
-      Context context,
-      @BuildType int buildType,
-      CardConfiguration cardConfiguration,
-      ImageLoaderApi imageLoaderApi,
-      CustomElementProvider customElementProvider,
-      DebugBehavior debugBehavior,
-      Clock clock,
-      ModelProviderFactory modelProviderFactory,
-      HostBindingProvider hostBindingProvider,
-      OfflineIndicatorApi offlineIndicatorApi,
-      Configuration configuration,
-      ActionApi actionApi,
-      ActionManager actionManager,
-      SnackbarApi snackbarApi,
-      StreamConfiguration streamConfiguration,
-      FeedExtensionRegistry feedExtensionRegistry,
-      BasicLoggingApi basicLoggingApi,
-      MainThreadRunner mainThreadRunner,
-      boolean isBackgroundDark,
-      TooltipApi tooltipApi,
-      ThreadUtils threadUtils,
-      FeedKnownContent feedKnownContent) {
-    return new BasicStream(
-        context,
-        streamConfiguration,
-        cardConfiguration,
-        imageLoaderApi,
-        actionParserFactory,
-        actionApi,
-        customElementProvider,
-        debugBehavior,
-        threadUtils,
-        /* headers = */ new ArrayList<>(0),
-        clock,
-        modelProviderFactory,
-        hostBindingProvider,
-        actionManager,
-        configuration,
-        snackbarApi,
-        basicLoggingApi,
-        offlineIndicatorApi,
-        mainThreadRunner,
-        feedKnownContent,
-        tooltipApi,
-        isBackgroundDark);
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/api/internal/stream/StreamFactory.java b/src/main/java/com/google/android/libraries/feed/api/internal/stream/StreamFactory.java
deleted file mode 100644
index 9e93265..0000000
--- a/src/main/java/com/google/android/libraries/feed/api/internal/stream/StreamFactory.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2019 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.api.internal.stream;
-
-import android.content.Context;
-import com.google.android.libraries.feed.api.client.stream.Stream;
-import com.google.android.libraries.feed.api.host.action.ActionApi;
-import com.google.android.libraries.feed.api.host.config.ApplicationInfo.BuildType;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.config.DebugBehavior;
-import com.google.android.libraries.feed.api.host.imageloader.ImageLoaderApi;
-import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
-import com.google.android.libraries.feed.api.host.offlineindicator.OfflineIndicatorApi;
-import com.google.android.libraries.feed.api.host.stream.CardConfiguration;
-import com.google.android.libraries.feed.api.host.stream.SnackbarApi;
-import com.google.android.libraries.feed.api.host.stream.StreamConfiguration;
-import com.google.android.libraries.feed.api.host.stream.TooltipApi;
-import com.google.android.libraries.feed.api.internal.actionmanager.ActionManager;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionParserFactory;
-import com.google.android.libraries.feed.api.internal.common.ThreadUtils;
-import com.google.android.libraries.feed.api.internal.knowncontent.FeedKnownContent;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProviderFactory;
-import com.google.android.libraries.feed.common.concurrent.MainThreadRunner;
-import com.google.android.libraries.feed.common.protoextensions.FeedExtensionRegistry;
-import com.google.android.libraries.feed.common.time.Clock;
-import com.google.android.libraries.feed.piet.host.CustomElementProvider;
-import com.google.android.libraries.feed.piet.host.HostBindingProvider;
-
-/** Factory to allow creation of {@link Stream} instances that depend on common components. */
-public interface StreamFactory {
-
-  /** Create the {@link Stream} */
-  Stream build(
-      ActionParserFactory actionParserFactory,
-      Context context,
-      @BuildType int buildType,
-      CardConfiguration cardConfiguration,
-      ImageLoaderApi imageLoaderApi,
-      CustomElementProvider customElementProvider,
-      DebugBehavior debugBehavior,
-      Clock clock,
-      ModelProviderFactory modelProviderFactory,
-      HostBindingProvider hostBindingProvider,
-      OfflineIndicatorApi offlineIndicatorApi,
-      Configuration configuration,
-      ActionApi actionApi,
-      ActionManager actionManager,
-      SnackbarApi snackbarApi,
-      StreamConfiguration streamConfiguration,
-      FeedExtensionRegistry feedExtensionRegistry,
-      BasicLoggingApi basicLoggingApi,
-      MainThreadRunner mainThreadRunner,
-      boolean isBackgroundDark,
-      TooltipApi tooltipApi,
-      ThreadUtils threadUtils,
-      FeedKnownContent feedKnownContent);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/AndroidManifest.xml b/src/main/java/com/google/android/libraries/feed/basicstream/AndroidManifest.xml
deleted file mode 100644
index ffd237b..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/AndroidManifest.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018 The Feed Authors.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.google.android.libraries.feed.basicstream">
-</manifest>
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/BUILD b/src/main/java/com/google/android/libraries/feed/basicstream/BUILD
deleted file mode 100644
index bf2b1d3..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/BUILD
+++ /dev/null
@@ -1,55 +0,0 @@
-package(
-    default_visibility = ["//visibility:public"],
-    features = ["-android_resources_strict_deps"],
-)
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "basicstream",
-    srcs = glob(["*.java"]),
-    manifest = "AndroidManifest.xml",
-    resource_files = glob(["res/**"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/client/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/host/action",
-        "//src/main/java/com/google/android/libraries/feed/api/host/config",
-        "//src/main/java/com/google/android/libraries/feed/api/host/imageloader",
-        "//src/main/java/com/google/android/libraries/feed/api/host/logging",
-        "//src/main/java/com/google/android/libraries/feed/api/host/offlineindicator",
-        "//src/main/java/com/google/android/libraries/feed/api/host/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/actionmanager",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/actionparser",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/common",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/knowncontent",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/modelprovider",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/viewloggingupdater",
-        "//src/main/java/com/google/android/libraries/feed/common",
-        "//src/main/java/com/google/android/libraries/feed/common/concurrent",
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-        "//src/main/java/com/google/android/libraries/feed/common/logging",
-        "//src/main/java/com/google/android/libraries/feed/common/time",
-        "//src/main/java/com/google/android/libraries/feed/piet",
-        "//src/main/java/com/google/android/libraries/feed/piet/host",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/contentchanged",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/contextmenumanager",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/deepestcontenttracker",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/logging",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/offlinemonitor",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/piet",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/publicapi/menumeasurer",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/publicapi/scroll",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/scroll",
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "//src/main/proto/com/google/android/libraries/feed/basicstream/internal/proto:stream_saved_instance_state_java_proto_lite",
-        "//src/main/proto/com/google/android/libraries/feed/sharedstream/proto:scroll_state_java_proto_lite",
-        "//src/main/proto/com/google/android/libraries/feed/sharedstream/proto:ui_refresh_reason_java_proto_lite",
-        "@com_google_code_findbugs_jsr305//jar",
-        "@com_google_protobuf_javalite//:protobuf_java_lite",
-        "@maven//:com_android_support_recyclerview_v7",
-        "@maven//:com_android_support_support_annotations",  # buildcleaner: keep
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/BasicStream.java b/src/main/java/com/google/android/libraries/feed/basicstream/BasicStream.java
deleted file mode 100644
index a791b71..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/BasicStream.java
+++ /dev/null
@@ -1,959 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream;
-
-import static com.google.android.libraries.feed.common.Validators.checkNotNull;
-import static com.google.android.libraries.feed.common.Validators.checkState;
-
-import android.content.Context;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
-import android.os.Bundle;
-import android.support.annotation.IntDef;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.helper.ItemTouchHelper;
-import android.util.Base64;
-import android.view.ContextThemeWrapper;
-import android.view.View;
-import android.view.View.OnLayoutChangeListener;
-import com.google.android.libraries.feed.api.client.stream.Header;
-import com.google.android.libraries.feed.api.client.stream.Stream;
-import com.google.android.libraries.feed.api.host.action.ActionApi;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.config.Configuration.ConfigKey;
-import com.google.android.libraries.feed.api.host.config.DebugBehavior;
-import com.google.android.libraries.feed.api.host.imageloader.ImageLoaderApi;
-import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
-import com.google.android.libraries.feed.api.host.logging.RequestReason;
-import com.google.android.libraries.feed.api.host.logging.ZeroStateShowReason;
-import com.google.android.libraries.feed.api.host.offlineindicator.OfflineIndicatorApi;
-import com.google.android.libraries.feed.api.host.stream.CardConfiguration;
-import com.google.android.libraries.feed.api.host.stream.SnackbarApi;
-import com.google.android.libraries.feed.api.host.stream.StreamConfiguration;
-import com.google.android.libraries.feed.api.host.stream.TooltipApi;
-import com.google.android.libraries.feed.api.internal.actionmanager.ActionManager;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionParserFactory;
-import com.google.android.libraries.feed.api.internal.common.ThreadUtils;
-import com.google.android.libraries.feed.api.internal.knowncontent.FeedKnownContent;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelError;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelError.ErrorType;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProvider;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProvider.State;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProviderFactory;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProviderObserver;
-import com.google.android.libraries.feed.basicstream.internal.StreamItemAnimator;
-import com.google.android.libraries.feed.basicstream.internal.StreamItemTouchCallbacks;
-import com.google.android.libraries.feed.basicstream.internal.StreamRecyclerViewAdapter;
-import com.google.android.libraries.feed.basicstream.internal.StreamSavedInstanceStateProto.StreamSavedInstanceState;
-import com.google.android.libraries.feed.basicstream.internal.drivers.StreamDriver;
-import com.google.android.libraries.feed.basicstream.internal.scroll.BasicStreamScrollMonitor;
-import com.google.android.libraries.feed.basicstream.internal.scroll.ScrollRestorer;
-import com.google.android.libraries.feed.basicstream.internal.viewloggingupdater.ViewLoggingUpdater;
-import com.google.android.libraries.feed.common.concurrent.CancelableTask;
-import com.google.android.libraries.feed.common.concurrent.MainThreadRunner;
-import com.google.android.libraries.feed.common.functional.Suppliers;
-import com.google.android.libraries.feed.common.logging.Logger;
-import com.google.android.libraries.feed.common.time.Clock;
-import com.google.android.libraries.feed.piet.PietManager;
-import com.google.android.libraries.feed.piet.host.CustomElementProvider;
-import com.google.android.libraries.feed.piet.host.HostBindingProvider;
-import com.google.android.libraries.feed.sharedstream.contentchanged.StreamContentChangedListener;
-import com.google.android.libraries.feed.sharedstream.contextmenumanager.ContextMenuManager;
-import com.google.android.libraries.feed.sharedstream.contextmenumanager.ContextMenuManagerImpl;
-import com.google.android.libraries.feed.sharedstream.contextmenumanager.FloatingContextMenuManager;
-import com.google.android.libraries.feed.sharedstream.deepestcontenttracker.DeepestContentTracker;
-import com.google.android.libraries.feed.sharedstream.logging.UiSessionRequestLogger;
-import com.google.android.libraries.feed.sharedstream.offlinemonitor.StreamOfflineMonitor;
-import com.google.android.libraries.feed.sharedstream.piet.PietCustomElementProvider;
-import com.google.android.libraries.feed.sharedstream.piet.PietEventLogger;
-import com.google.android.libraries.feed.sharedstream.piet.PietHostBindingProvider;
-import com.google.android.libraries.feed.sharedstream.piet.PietImageLoader;
-import com.google.android.libraries.feed.sharedstream.piet.PietStringFormatter;
-import com.google.android.libraries.feed.sharedstream.proto.ScrollStateProto.ScrollState;
-import com.google.android.libraries.feed.sharedstream.proto.UiRefreshReasonProto.UiRefreshReason;
-import com.google.android.libraries.feed.sharedstream.publicapi.menumeasurer.MenuMeasurer;
-import com.google.android.libraries.feed.sharedstream.publicapi.scroll.ScrollObservable;
-import com.google.android.libraries.feed.sharedstream.scroll.ScrollListenerNotifier;
-import com.google.protobuf.InvalidProtocolBufferException;
-import com.google.search.now.feed.client.StreamDataProto.UiContext;
-import java.util.List;
-
-/**
- * A basic implementation of a Feed {@link Stream} that is just able to render a vertical stream of
- * cards.
- */
-public class BasicStream implements Stream, ModelProviderObserver, OnLayoutChangeListener {
-
-  private static final String TAG = "BasicStream";
-
-  @VisibleForTesting static final String KEY_STREAM_STATE = "stream-state";
-  private static final long DEFAULT_LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS = 1000L;
-  private static final long DEFAULT_MINIMUM_SPINNER_SHOW_TIME_MS = 500L;
-  private static final long DEFAULT_SPINNER_DELAY_TIME_MS = 500L;
-
-  private final CardConfiguration cardConfiguration;
-  private final Clock clock;
-  private final Context context;
-  private final ThreadUtils threadUtils;
-  private final PietManager pietManager;
-  private final ModelProviderFactory modelProviderFactory;
-  private final ActionParserFactory actionParserFactory;
-  private final ActionApi actionApi;
-  private final ActionManager actionManager;
-  private final Configuration configuration;
-  private final SnackbarApi snackbarApi;
-  private final StreamContentChangedListener streamContentChangedListener;
-  private final DeepestContentTracker deepestContentTracker;
-  private final BasicLoggingApi basicLoggingApi;
-  private final long immediateContentThreshold;
-  private final StreamOfflineMonitor streamOfflineMonitor;
-  private final MainThreadRunner mainThreadRunner;
-  private final FeedKnownContent feedKnownContent;
-  private final ViewLoggingUpdater viewLoggingUpdater;
-  private final TooltipApi tooltipApi;
-  private final UiSessionRequestLogger uiSessionRequestLogger;
-  private final StreamConfiguration streamConfiguration;
-  private final BasicStreamScrollMonitor scrollMonitor;
-  private final long minimumSpinnerShowTime;
-  private final long spinnerDelayTime;
-
-  private RecyclerView recyclerView;
-  private ContextMenuManager contextMenuManager;
-  private List<Header> headers;
-  private StreamRecyclerViewAdapter adapter;
-  private ScrollListenerNotifier scrollListenerNotifier;
-  private ScrollRestorer scrollRestorer;
-  private long sessionStartTimestamp;
-  private long initialLoadingSpinnerStartTime;
-  private boolean isInitialLoad = true;
-  private boolean isRestoring;
-  private boolean isDestroyed;
-  private boolean isStreamContentVisible = true;
-
-  @LoggingState private int loggingState = LoggingState.STARTING;
-
-  /*@MonotonicNonNull*/ private ModelProvider modelProvider;
-  /*@MonotonicNonNull*/ private StreamDriver streamDriver;
-
-  /*@Nullable*/ private String savedSessionId;
-  /*@Nullable*/ private CancelableTask cancellableShowSpinnerRunnable;
-
-  // TODO: instead of using a nullable field, pipe UiContext through the creation of
-  // ModelProviders to onSessionStart().
-  private UiRefreshReason uiRefreshReason = UiRefreshReason.getDefaultInstance();
-  private StreamItemAnimator itemAnimator;
-
-  public BasicStream(
-      Context context,
-      StreamConfiguration streamConfiguration,
-      CardConfiguration cardConfiguration,
-      ImageLoaderApi imageLoaderApi,
-      ActionParserFactory actionParserFactory,
-      ActionApi actionApi,
-      /*@Nullable*/ CustomElementProvider customElementProvider,
-      DebugBehavior debugBehavior,
-      ThreadUtils threadUtils,
-      List<Header> headers,
-      Clock clock,
-      ModelProviderFactory modelProviderFactory,
-      /*@Nullable*/ HostBindingProvider hostBindingProvider,
-      ActionManager actionManager,
-      Configuration configuration,
-      SnackbarApi snackbarApi,
-      BasicLoggingApi basicLoggingApi,
-      OfflineIndicatorApi offlineIndicatorApi,
-      MainThreadRunner mainThreadRunner,
-      FeedKnownContent feedKnownContent,
-      TooltipApi tooltipApi,
-      boolean isBackgroundDark) {
-    this.cardConfiguration = cardConfiguration;
-    this.clock = clock;
-    this.threadUtils = threadUtils;
-    this.streamOfflineMonitor = new StreamOfflineMonitor(offlineIndicatorApi);
-    this.headers = headers;
-    this.modelProviderFactory = modelProviderFactory;
-    this.streamConfiguration = streamConfiguration;
-    this.actionParserFactory = actionParserFactory;
-    this.actionApi = actionApi;
-    this.actionManager = actionManager;
-    this.configuration = configuration;
-    this.snackbarApi = snackbarApi;
-    this.mainThreadRunner = mainThreadRunner;
-    this.streamContentChangedListener = createStreamContentChangedListener();
-    this.deepestContentTracker = new DeepestContentTracker();
-    this.basicLoggingApi = basicLoggingApi;
-    this.immediateContentThreshold =
-        configuration.getValueOrDefault(
-            ConfigKey.LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS,
-            DEFAULT_LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS);
-    this.feedKnownContent = feedKnownContent;
-    viewLoggingUpdater = createViewLoggingUpdater();
-    this.uiSessionRequestLogger = new UiSessionRequestLogger(clock, basicLoggingApi);
-    this.tooltipApi = tooltipApi;
-    this.pietManager =
-        createPietManager(
-            context,
-            cardConfiguration,
-            imageLoaderApi,
-            customElementProvider,
-            debugBehavior,
-            clock,
-            hostBindingProvider,
-            streamOfflineMonitor,
-            configuration,
-            isBackgroundDark);
-    this.context =
-        new ContextThemeWrapper(context, (isBackgroundDark ? R.style.Dark : R.style.Light));
-    this.scrollMonitor = new BasicStreamScrollMonitor(clock);
-    this.minimumSpinnerShowTime =
-        configuration.getValueOrDefault(
-            ConfigKey.SPINNER_MINIMUM_SHOW_TIME_MS, DEFAULT_MINIMUM_SPINNER_SHOW_TIME_MS);
-    this.spinnerDelayTime =
-        configuration.getValueOrDefault(ConfigKey.SPINNER_DELAY_MS, DEFAULT_SPINNER_DELAY_TIME_MS);
-  }
-
-  @VisibleForTesting
-  PietManager createPietManager(
-      /*@UnderInitialization*/ BasicStream this,
-      Context context,
-      CardConfiguration cardConfiguration,
-      ImageLoaderApi imageLoaderApi,
-      /*@Nullable*/ CustomElementProvider customElementProvider,
-      DebugBehavior debugBehavior,
-      Clock clock,
-      /*@Nullable*/ HostBindingProvider hostBindingProvider,
-      StreamOfflineMonitor streamOfflineMonitor,
-      Configuration configuration,
-      boolean isBackgroundDark) {
-    return PietManager.builder()
-        .setImageLoader(new PietImageLoader(imageLoaderApi))
-        .setStringFormatter(new PietStringFormatter(clock))
-        .setFadeImageThresholdMs(
-            Suppliers.of(configuration.getValueOrDefault(ConfigKey.FADE_IMAGE_THRESHOLD_MS, 80L)))
-        .setDefaultCornerRadius(() -> cardConfiguration.getDefaultCornerRadius())
-        .setDebugBehavior(debugBehavior)
-        .setCustomElementProvider(new PietCustomElementProvider(context, customElementProvider))
-        .setHostBindingProvider(
-            new PietHostBindingProvider(hostBindingProvider, streamOfflineMonitor))
-        .setClock(clock)
-        .setIsDarkTheme(Suppliers.of(isBackgroundDark))
-        .build();
-  }
-
-  @Override
-  public void onCreate(/*@Nullable*/ Bundle savedInstanceState) {
-    if (savedInstanceState == null) {
-      onCreate((String) null);
-      return;
-    }
-
-    onCreate(savedInstanceState.getString(KEY_STREAM_STATE));
-  }
-
-  @Override
-  public void onCreate(/*@Nullable*/ String savedInstanceState) {
-    checkState(recyclerView == null, "Can't call onCreate() multiple times.");
-    setupRecyclerView();
-
-    if (savedInstanceState == null) {
-      scrollRestorer =
-          createScrollRestorer(configuration, recyclerView, scrollListenerNotifier, null);
-      return;
-    }
-
-    try {
-      StreamSavedInstanceState streamSavedInstanceState =
-          StreamSavedInstanceState.parseFrom(Base64.decode(savedInstanceState, Base64.DEFAULT));
-
-      if (streamSavedInstanceState.hasSessionId()) {
-        savedSessionId = streamSavedInstanceState.getSessionId();
-      }
-
-      scrollRestorer =
-          createScrollRestorer(
-              configuration,
-              recyclerView,
-              scrollListenerNotifier,
-              streamSavedInstanceState.getScrollState());
-    } catch (IllegalArgumentException | InvalidProtocolBufferException e) {
-      Logger.wtf(TAG, "Could not parse saved instance state String.");
-      scrollRestorer =
-          createScrollRestorer(configuration, recyclerView, scrollListenerNotifier, null);
-    }
-  }
-
-  @Override
-  public void onShow() {
-    // Only create model provider if Stream content is visible.
-    if (isStreamContentVisible) {
-      createModelProviderAndStreamDriver();
-    } else {
-      if (loggingState == LoggingState.STARTING) {
-        basicLoggingApi.onOpenedWithNoContent();
-        loggingState = LoggingState.LOGGED_NO_CONTENT;
-      }
-
-      // If Stream content is not visible, we will not create the StreamDriver and restore the
-      // scroll position automatically. So we try to restore the scroll position before.
-      scrollRestorer.maybeRestoreScroll();
-    }
-    adapter.setShown(true);
-  }
-
-  @Override
-  public void onActive() {}
-
-  @Override
-  public void onInactive() {}
-
-  @Override
-  public void onHide() {
-    adapter.setShown(false);
-    contextMenuManager.dismissPopup();
-  }
-
-  @Override
-  public void onDestroy() {
-    if (isDestroyed) {
-      Logger.e(TAG, "onDestroy() called multiple times.");
-      return;
-    }
-    adapter.onDestroy();
-    recyclerView.removeOnLayoutChangeListener(this);
-    if (modelProvider != null) {
-      modelProvider.unregisterObserver(this);
-      modelProvider.detachModelProvider();
-    }
-    if (streamDriver != null) {
-      streamDriver.onDestroy();
-    }
-    streamOfflineMonitor.onDestroy();
-    uiSessionRequestLogger.onDestroy();
-    isDestroyed = true;
-  }
-
-  @Override
-  public Bundle getSavedInstanceState() {
-    Bundle bundle = new Bundle();
-    bundle.putString(KEY_STREAM_STATE, getSavedInstanceStateString());
-    return bundle;
-  }
-
-  @Override
-  public String getSavedInstanceStateString() {
-    StreamSavedInstanceState.Builder builder = StreamSavedInstanceState.newBuilder();
-    if (modelProvider != null && modelProvider.getSessionId() != null) {
-      builder.setSessionId(checkNotNull(modelProvider.getSessionId()));
-    }
-
-    ScrollState scrollState =
-        scrollRestorer.getScrollStateForScrollRestore(adapter.getHeaderCount());
-    if (scrollState != null) {
-      builder.setScrollState(scrollState);
-    }
-
-    return convertStreamSavedInstanceStateToString(builder.build());
-  }
-
-  @Override
-  public View getView() {
-    checkState(recyclerView != null, "Must call onCreate() before getView()");
-    return recyclerView;
-  }
-
-  @VisibleForTesting
-  StreamRecyclerViewAdapter getAdapter() {
-    return adapter;
-  }
-
-  @Override
-  public void setHeaderViews(List<Header> headers) {
-    Logger.i(
-        TAG,
-        "Setting %s header views, currently have %s headers",
-        headers.size(),
-        this.headers.size());
-
-    this.headers = headers;
-    adapter.setHeaders(headers);
-  }
-
-  @Override
-  public void setStreamContentVisibility(boolean visible) {
-    checkNotNull(adapter, "onCreate must be called before setStreamContentVisibility");
-
-    if (visible == isStreamContentVisible) {
-      return;
-    }
-
-    isStreamContentVisible = visible;
-
-    if (isStreamContentVisible) {
-      viewLoggingUpdater.resetViewTracking();
-    }
-
-    // If Stream content was previously not visible, ModelProvider might need to be created.
-    if (isStreamContentVisible && modelProvider == null) {
-      createModelProviderAndStreamDriver();
-    }
-
-    itemAnimator.setStreamVisibility(isStreamContentVisible);
-    adapter.setStreamContentVisible(isStreamContentVisible);
-  }
-
-  @Override
-  public void trim() {
-    pietManager.purgeRecyclerPools();
-    recyclerView.getRecycledViewPool().clear();
-  }
-
-  @Override
-  public void smoothScrollBy(int dx, int dy) {
-    recyclerView.smoothScrollBy(dx, dy);
-  }
-
-  @Override
-  public int getChildTopAt(int position) {
-    if (!isChildAtPositionVisible(position)) {
-      return POSITION_NOT_KNOWN;
-    }
-
-    LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
-    if (layoutManager == null) {
-      return POSITION_NOT_KNOWN;
-    }
-
-    View view = layoutManager.findViewByPosition(position);
-    if (view == null) {
-      return POSITION_NOT_KNOWN;
-    }
-
-    return view.getTop();
-  }
-
-  @Override
-  public boolean isChildAtPositionVisible(int position) {
-    LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
-    if (layoutManager == null) {
-      return false;
-    }
-
-    int firstItemPosition = layoutManager.findFirstVisibleItemPosition();
-    int lastItemPosition = layoutManager.findLastVisibleItemPosition();
-    if (firstItemPosition == RecyclerView.NO_POSITION
-        || lastItemPosition == RecyclerView.NO_POSITION) {
-      return false;
-    }
-
-    return position >= firstItemPosition && position <= lastItemPosition;
-  }
-
-  @Override
-  public void addScrollListener(ScrollListener listener) {
-    scrollListenerNotifier.addScrollListener(listener);
-  }
-
-  @Override
-  public void removeScrollListener(ScrollListener listener) {
-    scrollListenerNotifier.removeScrollListener(listener);
-  }
-
-  @Override
-  public void addOnContentChangedListener(ContentChangedListener listener) {
-    streamContentChangedListener.addContentChangedListener(listener);
-  }
-
-  @Override
-  public void removeOnContentChangedListener(ContentChangedListener listener) {
-    streamContentChangedListener.removeContentChangedListener(listener);
-  }
-
-  @Override
-  public void triggerRefresh() {
-    if (streamDriver == null || modelProvider == null) {
-      Logger.w(
-          TAG,
-          "Refresh requested before Stream was shown.  Scheduler should be used instead "
-              + "in this instance.");
-      return;
-    }
-
-    // This invalidates the modelProvider, which results in onSessionFinished() then
-    // onSessionStart() being called, leading to recreating the entire stream.
-    streamDriver.showSpinner();
-    modelProvider.triggerRefresh(RequestReason.HOST_REQUESTED);
-  }
-
-  @Override
-  public void onLayoutChange(
-      View v,
-      int left,
-      int top,
-      int right,
-      int bottom,
-      int oldLeft,
-      int oldTop,
-      int oldRight,
-      int oldBottom) {
-    if ((oldLeft != 0 && left != oldLeft) || (oldRight != 0 && right != oldRight)) {
-      checkNotNull(adapter, "onCreate must be called before so that adapter is set.").rebind();
-    }
-
-    contextMenuManager.dismissPopup();
-  }
-
-  private void setupRecyclerView() {
-    recyclerView = new RecyclerView(context);
-    scrollListenerNotifier =
-        createScrollListenerNotifier(streamContentChangedListener, scrollMonitor, mainThreadRunner);
-    recyclerView.addOnScrollListener(scrollMonitor);
-    adapter =
-        createRecyclerViewAdapter(
-            context,
-            cardConfiguration,
-            pietManager,
-            deepestContentTracker,
-            streamContentChangedListener,
-            scrollMonitor,
-            configuration,
-            new PietEventLogger(basicLoggingApi));
-    adapter.setHeaders(headers);
-    recyclerView.setId(R.id.feed_stream_recycler_view);
-    recyclerView.setLayoutManager(createRecyclerViewLayoutManager(context));
-    contextMenuManager = createContextMenuManager(recyclerView, new MenuMeasurer(context));
-    new ItemTouchHelper(new StreamItemTouchCallbacks()).attachToRecyclerView(recyclerView);
-    recyclerView.setAdapter(adapter);
-    recyclerView.setClipToPadding(false);
-    if (VERSION.SDK_INT > VERSION_CODES.JELLY_BEAN) {
-      recyclerView.setPaddingRelative(
-          streamConfiguration.getPaddingStart(),
-          streamConfiguration.getPaddingTop(),
-          streamConfiguration.getPaddingEnd(),
-          streamConfiguration.getPaddingBottom());
-    } else {
-      recyclerView.setPadding(
-          streamConfiguration.getPaddingStart(),
-          streamConfiguration.getPaddingTop(),
-          streamConfiguration.getPaddingEnd(),
-          streamConfiguration.getPaddingBottom());
-    }
-
-    itemAnimator = new StreamItemAnimator(streamContentChangedListener);
-    itemAnimator.setStreamVisibility(isStreamContentVisible);
-
-    recyclerView.setItemAnimator(itemAnimator);
-    recyclerView.addOnLayoutChangeListener(this);
-  }
-
-  private void updateAdapterAfterSessionStart(ModelProvider modelProvider) {
-    StreamDriver newStreamDriver =
-        createStreamDriver(
-            actionApi,
-            actionManager,
-            actionParserFactory,
-            modelProvider,
-            threadUtils,
-            clock,
-            configuration,
-            context,
-            snackbarApi,
-            streamContentChangedListener,
-            scrollRestorer,
-            basicLoggingApi,
-            streamOfflineMonitor,
-            feedKnownContent,
-            contextMenuManager,
-            isRestoring,
-            /* isInitialLoad= */ false,
-            mainThreadRunner,
-            tooltipApi,
-            uiRefreshReason,
-            scrollListenerNotifier);
-
-    uiRefreshReason = UiRefreshReason.getDefaultInstance();
-
-    // If after starting a new session the Stream is still empty, we should show the zero state.
-    if (newStreamDriver.getLeafFeatureDrivers().isEmpty()) {
-      newStreamDriver.showZeroState(ZeroStateShowReason.NO_CONTENT);
-    }
-    if (loggingState == LoggingState.STARTING
-        && modelProvider.getCurrentState() == State.READY
-        && modelProvider.getRootFeature() == null) {
-      basicLoggingApi.onOpenedWithNoContent();
-      loggingState = LoggingState.LOGGED_NO_CONTENT;
-    }
-
-    // If old and new stream driver are both showing the zero state, do not replace the old stream
-    // driver. This prevents the zero state flashing if the old and new stream drivers are both
-    // displaying the same content. The old stream driver will be updated with the new model
-    // provider.
-    if (streamDriver != null
-        && streamDriver.isZeroStateBeingShown()
-        && newStreamDriver.isZeroStateBeingShown()) {
-      streamDriver.setModelProviderForZeroState(modelProvider);
-      newStreamDriver.onDestroy();
-      return;
-    }
-    if (streamDriver != null) {
-      streamDriver.onDestroy();
-    }
-    streamDriver = newStreamDriver;
-    adapter.setDriver(newStreamDriver);
-    deepestContentTracker.reset();
-
-    if (streamDriver.hasContent()) {
-      isInitialLoad = false;
-    }
-
-    logContent();
-  }
-
-  @Override
-  public void onSessionStart(UiContext uiContext) {
-    threadUtils.checkMainThread();
-
-    if (cancellableShowSpinnerRunnable != null) {
-      cancellableShowSpinnerRunnable.cancel();
-      cancellableShowSpinnerRunnable = null;
-    }
-
-    ModelProvider localModelProvider =
-        checkNotNull(modelProvider, "Model Provider must be set if a session is active");
-    // On initial load, if a loading spinner is currently being shown, the spinner must be shown for
-    // at least the time specified in MINIMUM_SPINNER_SHOW_TIME.
-    if (isInitialLoad && initialLoadingSpinnerStartTime != 0L) {
-      long spinnerDisplayTime = clock.currentTimeMillis() - initialLoadingSpinnerStartTime;
-      // If MINIMUM_SPINNER_SHOW_TIME has elapsed, the new content can be shown immediately.
-      if (spinnerDisplayTime >= minimumSpinnerShowTime) {
-        updateAdapterAfterSessionStart(localModelProvider);
-      } else {
-        // If MINIMUM_SPINNER_SHOW_TIME has not elapsed, the new content should only be shown once
-        // the remaining time has been fulfilled.
-        mainThreadRunner.executeWithDelay(
-            TAG + " onSessionStart",
-            () -> {
-              // Only show content if model providers are the same. If they are different, this
-              // indicates that the session finished before the spinner show time elapsed.
-              if (modelProvider == localModelProvider) {
-                updateAdapterAfterSessionStart(localModelProvider);
-              }
-            },
-            minimumSpinnerShowTime - spinnerDisplayTime);
-      }
-    } else {
-      updateAdapterAfterSessionStart(localModelProvider);
-    }
-  }
-
-  private void logContent() {
-    if (loggingState == LoggingState.STARTING) {
-      long timeToPopulateMs = clock.currentTimeMillis() - sessionStartTimestamp;
-      if (timeToPopulateMs > immediateContentThreshold) {
-        basicLoggingApi.onOpenedWithNoImmediateContent();
-      }
-
-      if (checkNotNull(streamDriver).hasContent()) {
-        basicLoggingApi.onOpenedWithContent(
-            (int) timeToPopulateMs, checkNotNull(streamDriver).getLeafFeatureDrivers().size());
-        // onOpenedWithContent should only be logged the first time the Stream is opened up.
-        loggingState = LoggingState.LOGGED_CONTENT_SHOWN;
-      } else {
-        basicLoggingApi.onOpenedWithNoContent();
-        loggingState = LoggingState.LOGGED_NO_CONTENT;
-      }
-    }
-  }
-
-  @Override
-  public void onSessionFinished(UiContext uiContext) {
-    if (isDestroyed) {
-      // This seems to be getting called after onDestroy(), resulting in unregistering from the
-      // ModelProvider twice, which causes a crash.
-      Logger.e(TAG, "onSessionFinished called after onDestroy()");
-      return;
-    }
-
-    // Our previous session isn't valid anymore.  There are some circumstances we could probably
-    // restore our scroll (say if scroll was in headers), other times, if we were to restore scroll
-    // it would be to a card which is no longer present.  For simplicity just abandon scroll
-    // restoring for now.  We can improve logic if this doesn't prove to be sufficient enough.
-    scrollRestorer.abandonRestoringScroll();
-
-    // At this point, the StreamDriver shouldn't be null. However, the
-    // cancellableShowSpinnerRunnable could be null or not, depending on whether this spinner is
-    // finishing because a failed restore or because the session started. If a spinner is queued to
-    // show, we want to show that one with its delay, otherwise we show a new one with a new delay.
-    if (streamDriver != null && cancellableShowSpinnerRunnable == null) {
-      showSpinnerWithDelay();
-    }
-
-    isRestoring = false;
-
-    if (modelProvider != null) {
-      modelProvider.unregisterObserver(this);
-    }
-    uiRefreshReason = uiContext.getExtension(UiRefreshReason.uiRefreshReasonExtension);
-
-    // TODO: Instead of setting the refresh reseason, pipe the UiContext through here.
-    modelProvider =
-        modelProviderFactory.createNew(deepestContentTracker, UiContext.getDefaultInstance());
-
-    registerObserversOnModelProvider(modelProvider);
-  }
-
-  @Override
-  public void onError(ModelError modelError) {
-    if (modelError.getErrorType() != ErrorType.NO_CARDS_ERROR) {
-      Logger.wtf(TAG, "Not expecting non NO_CARDS_ERROR type.");
-    }
-
-    if (loggingState == LoggingState.STARTING) {
-      basicLoggingApi.onOpenedWithNoContent();
-      loggingState = LoggingState.LOGGED_NO_CONTENT;
-    }
-
-    scrollRestorer.abandonRestoringScroll();
-    if (streamDriver != null) {
-      streamDriver.showZeroState(ZeroStateShowReason.ERROR);
-    }
-  }
-
-  private void createModelProviderAndStreamDriver() {
-    if (modelProvider == null) {
-      // For nullness checker
-      ModelProvider localModelProvider = null;
-      String localSavedSessionId = savedSessionId;
-      if (localSavedSessionId != null) {
-        isRestoring = true;
-        Logger.d(TAG, "Attempting to restoring session with id: %s.", localSavedSessionId);
-        localModelProvider =
-            modelProviderFactory.create(localSavedSessionId, UiContext.getDefaultInstance());
-      }
-
-      if (localModelProvider == null) {
-        // If a session is no longer valid then a ModelProvider will not have been created above.
-        Logger.d(TAG, "Creating new session for showing.");
-        localModelProvider =
-            modelProviderFactory.createNew(deepestContentTracker, UiContext.getDefaultInstance());
-      }
-
-      sessionStartTimestamp = clock.currentTimeMillis();
-      modelProvider = localModelProvider;
-
-      registerObserversOnModelProvider(modelProvider);
-    }
-
-    if (streamDriver == null) {
-      // If the ModelProvider is not ready we don't want to restore the Stream at all.  Instead we
-      // need to wait for it to become active and we can reset the StreamDriver with the correct
-      // scroll restorer in order to finally restore scroll position.
-      ScrollRestorer initialScrollRestorer =
-          modelProvider.getCurrentState() == State.READY
-              ? scrollRestorer
-              : createNonRestoringScrollRestorer(
-                  configuration, recyclerView, scrollListenerNotifier);
-
-      streamDriver =
-          createStreamDriver(
-              actionApi,
-              actionManager,
-              actionParserFactory,
-              modelProvider,
-              threadUtils,
-              clock,
-              configuration,
-              context,
-              snackbarApi,
-              streamContentChangedListener,
-              initialScrollRestorer,
-              basicLoggingApi,
-              streamOfflineMonitor,
-              feedKnownContent,
-              contextMenuManager,
-              isRestoring,
-              isInitialLoad,
-              mainThreadRunner,
-              tooltipApi,
-              UiRefreshReason.getDefaultInstance(),
-              scrollListenerNotifier);
-
-      showSpinnerWithDelay();
-      adapter.setDriver(streamDriver);
-    }
-  }
-
-  private void showSpinnerWithDelay() {
-    cancellableShowSpinnerRunnable =
-        mainThreadRunner.executeWithDelay(
-            TAG + " onShow", new ShowSpinnerRunnable(), spinnerDelayTime);
-  }
-
-  private String convertStreamSavedInstanceStateToString(
-      StreamSavedInstanceState savedInstanceState) {
-    return Base64.encodeToString(savedInstanceState.toByteArray(), Base64.DEFAULT);
-  }
-
-  private void registerObserversOnModelProvider(ModelProvider modelProvider) {
-    modelProvider.registerObserver(this);
-    uiSessionRequestLogger.onSessionRequested(modelProvider);
-  }
-
-  @VisibleForTesting
-  StreamDriver createStreamDriver(
-      ActionApi actionApi,
-      ActionManager actionManager,
-      ActionParserFactory actionParserFactory,
-      ModelProvider modelProvider,
-      ThreadUtils threadUtils,
-      Clock clock,
-      Configuration configuration,
-      Context context,
-      SnackbarApi snackbarApi,
-      ContentChangedListener contentChangedListener,
-      ScrollRestorer scrollRestorer,
-      BasicLoggingApi basicLoggingApi,
-      StreamOfflineMonitor streamOfflineMonitor,
-      FeedKnownContent feedKnownContent,
-      ContextMenuManager contextMenuManager,
-      boolean restoring,
-      boolean isInitialLoad,
-      MainThreadRunner mainThreadRunner,
-      TooltipApi tooltipApi,
-      UiRefreshReason uiRefreshReason,
-      ScrollListenerNotifier scrollListenerNotifier) {
-    return new StreamDriver(
-        actionApi,
-        actionManager,
-        actionParserFactory,
-        modelProvider,
-        threadUtils,
-        clock,
-        configuration,
-        context,
-        snackbarApi,
-        contentChangedListener,
-        scrollRestorer,
-        basicLoggingApi,
-        streamOfflineMonitor,
-        feedKnownContent,
-        contextMenuManager,
-        restoring,
-        isInitialLoad,
-        mainThreadRunner,
-        viewLoggingUpdater,
-        tooltipApi,
-        uiRefreshReason,
-        scrollMonitor);
-  }
-
-  @VisibleForTesting
-  StreamRecyclerViewAdapter createRecyclerViewAdapter(
-      Context context,
-      CardConfiguration cardConfiguration,
-      PietManager pietManager,
-      DeepestContentTracker deepestContentTracker,
-      StreamContentChangedListener streamContentChangedListener,
-      ScrollObservable scrollObservable,
-      Configuration configuration,
-      PietEventLogger pietEventLogger) {
-    return new StreamRecyclerViewAdapter(
-        context,
-        recyclerView,
-        cardConfiguration,
-        pietManager,
-        deepestContentTracker,
-        streamContentChangedListener,
-        scrollObservable,
-        configuration,
-        pietEventLogger);
-  }
-
-  @VisibleForTesting
-  ScrollListenerNotifier createScrollListenerNotifier(
-      ContentChangedListener contentChangedListener,
-      BasicStreamScrollMonitor scrollMonitor,
-      MainThreadRunner mainThreadRunner) {
-    return new ScrollListenerNotifier(contentChangedListener, scrollMonitor, mainThreadRunner);
-  }
-
-  @VisibleForTesting
-  LinearLayoutManager createRecyclerViewLayoutManager(Context context) {
-    return new LinearLayoutManager(context);
-  }
-
-  @VisibleForTesting
-  StreamContentChangedListener createStreamContentChangedListener(
-      /*@UnderInitialization*/ BasicStream this) {
-    return new StreamContentChangedListener();
-  }
-
-  @VisibleForTesting
-  ScrollRestorer createScrollRestorer(
-      Configuration configuration,
-      RecyclerView recyclerView,
-      ScrollListenerNotifier scrollListenerNotifier,
-      /*@Nullable*/ ScrollState scrollState) {
-    return new ScrollRestorer(configuration, recyclerView, scrollListenerNotifier, scrollState);
-  }
-
-  @VisibleForTesting
-  ScrollRestorer createNonRestoringScrollRestorer(
-      Configuration configuration,
-      RecyclerView recyclerView,
-      ScrollListenerNotifier scrollListenerNotifier) {
-    return ScrollRestorer.nonRestoringRestorer(configuration, recyclerView, scrollListenerNotifier);
-  }
-
-  @VisibleForTesting
-  ContextMenuManager createContextMenuManager(
-      RecyclerView recyclerView, MenuMeasurer menuMeasurer) {
-    ContextMenuManager manager;
-    if (VERSION.SDK_INT > VERSION_CODES.M) {
-      manager = new ContextMenuManagerImpl(menuMeasurer, context);
-    } else {
-      manager = new FloatingContextMenuManager(context);
-    }
-    manager.setView(recyclerView);
-    return manager;
-  }
-
-  @VisibleForTesting
-  ViewLoggingUpdater createViewLoggingUpdater(/*@UnderInitialization*/ BasicStream this) {
-    return new ViewLoggingUpdater();
-  }
-
-  @IntDef({
-    LoggingState.STARTING,
-    LoggingState.LOGGED_NO_CONTENT,
-    LoggingState.LOGGED_CONTENT_SHOWN
-  })
-  @interface LoggingState {
-    int STARTING = 0;
-    int LOGGED_NO_CONTENT = 1;
-    int LOGGED_CONTENT_SHOWN = 2;
-  }
-
-  private final class ShowSpinnerRunnable implements Runnable {
-
-    @Override
-    public void run() {
-      checkNotNull(streamDriver).showSpinner();
-      initialLoadingSpinnerStartTime = clock.currentTimeMillis();
-      BasicStream.this.cancellableShowSpinnerRunnable = null;
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/BUILD b/src/main/java/com/google/android/libraries/feed/basicstream/internal/BUILD
deleted file mode 100644
index 85c223c..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/BUILD
+++ /dev/null
@@ -1,24 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "internal",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/client/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/host/config",
-        "//src/main/java/com/google/android/libraries/feed/api/host/stream",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders",
-        "//src/main/java/com/google/android/libraries/feed/common/logging",
-        "//src/main/java/com/google/android/libraries/feed/piet",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/deepestcontenttracker",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/piet",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/publicapi/scroll",
-        "@com_google_code_findbugs_jsr305//jar",
-        "@maven//:com_android_support_interpolator",
-        "@maven//:com_android_support_recyclerview_v7",
-        "@maven//:com_android_support_support_annotations",  # buildcleaner: keep
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamItemAnimator.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamItemAnimator.java
deleted file mode 100644
index 858c12c..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamItemAnimator.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal;
-
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.widget.DefaultItemAnimator;
-import android.support.v7.widget.RecyclerView;
-import com.google.android.libraries.feed.api.client.stream.Stream.ContentChangedListener;
-
-/**
- * {@link DefaultItemAnimator} implementation that notifies the given {@link ContentChangedListener}
- * after animations occur.
- */
-public class StreamItemAnimator extends DefaultItemAnimator {
-
-  private final ContentChangedListener contentChangedListener;
-  private boolean isStreamContentVisible;
-
-  public StreamItemAnimator(ContentChangedListener contentChangedListener) {
-    this.contentChangedListener = contentChangedListener;
-  }
-
-  @Override
-  public void onAnimationFinished(RecyclerView.ViewHolder viewHolder) {
-    super.onAnimationFinished(viewHolder);
-    contentChangedListener.onContentChanged();
-  }
-
-  public void setStreamVisibility(boolean isStreamContentVisible) {
-    if (this.isStreamContentVisible == isStreamContentVisible) {
-      return;
-    }
-
-    if (isStreamContentVisible) {
-      // Ending animations so that if any content is animating out the RecyclerView will be able to
-      // remove those views. This can occur if a user quickly presses hide and then show on the
-      // stream.
-      endAnimations();
-    }
-
-    this.isStreamContentVisible = isStreamContentVisible;
-  }
-
-  @VisibleForTesting
-  public boolean getStreamContentVisibility() {
-    return isStreamContentVisible;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamItemTouchCallbacks.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamItemTouchCallbacks.java
deleted file mode 100644
index eb1c616..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamItemTouchCallbacks.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal;
-
-import android.graphics.Canvas;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.RecyclerView.ViewHolder;
-import android.support.v7.widget.helper.ItemTouchHelper;
-import android.view.animation.Interpolator;
-import android.support.v4.view.animation.FastOutLinearInInterpolator;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.SwipeableViewHolder;
-
-/** {@link ItemTouchHelper.Callback} to allow dismissing cards via swiping. */
-public final class StreamItemTouchCallbacks extends ItemTouchHelper.Callback {
-
-  private static final Interpolator DISMISS_INTERPOLATOR = new FastOutLinearInInterpolator();
-
-  @Override
-  public int getMovementFlags(RecyclerView recyclerView, ViewHolder viewHolder) {
-    int swipeFlags = 0;
-    if (viewHolder instanceof SwipeableViewHolder
-        && ((SwipeableViewHolder) viewHolder).canSwipe()) {
-      swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
-    }
-    return makeMovementFlags(/* dragFlags= */ 0, swipeFlags);
-  }
-
-  @Override
-  public boolean onMove(RecyclerView recyclerView, ViewHolder viewHolder, ViewHolder viewHolder1) {
-    throw new AssertionError(
-        "onMove not supported."); // Drag and drop not supported, the method will never be called.
-  }
-
-  @Override
-  public void onSwiped(ViewHolder viewHolder, int i) {
-    // Only PietViewHolders support swipe to dismiss. If new ViewHolders support swipe to dismiss,
-    // this should instead use an interface.
-    ((SwipeableViewHolder) viewHolder).onSwiped();
-  }
-
-  @Override
-  public void onChildDraw(
-      Canvas canvas,
-      RecyclerView recyclerView,
-      ViewHolder viewHolder,
-      float dX,
-      float dY,
-      int i,
-      boolean isCurrentlyActive) {
-    float input = Math.abs(dX) / viewHolder.itemView.getMeasuredWidth();
-    float alpha = 1 - DISMISS_INTERPOLATOR.getInterpolation(input);
-
-    viewHolder.itemView.setTranslationX(dX);
-    viewHolder.itemView.setAlpha(alpha);
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamRecyclerViewAdapter.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamRecyclerViewAdapter.java
deleted file mode 100644
index 9533a42..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamRecyclerViewAdapter.java
+++ /dev/null
@@ -1,423 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal;
-
-import static com.google.android.libraries.feed.basicstream.internal.viewholders.ViewHolderType.TYPE_CONTINUATION;
-import static com.google.android.libraries.feed.basicstream.internal.viewholders.ViewHolderType.TYPE_HEADER;
-import static com.google.android.libraries.feed.basicstream.internal.viewholders.ViewHolderType.TYPE_NO_CONTENT;
-import static com.google.android.libraries.feed.basicstream.internal.viewholders.ViewHolderType.TYPE_ZERO_STATE;
-
-import android.content.Context;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.util.DiffUtil;
-import android.support.v7.util.DiffUtil.DiffResult;
-import android.support.v7.util.ListUpdateCallback;
-import android.support.v7.widget.RecyclerView;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.widget.FrameLayout;
-import com.google.android.libraries.feed.api.client.stream.Header;
-import com.google.android.libraries.feed.api.client.stream.Stream.ContentChangedListener;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.stream.CardConfiguration;
-import com.google.android.libraries.feed.basicstream.internal.drivers.HeaderDriver;
-import com.google.android.libraries.feed.basicstream.internal.drivers.LeafFeatureDriver;
-import com.google.android.libraries.feed.basicstream.internal.drivers.StreamDriver;
-import com.google.android.libraries.feed.basicstream.internal.drivers.StreamDriver.StreamContentListener;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.ContinuationViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.FeedViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.HeaderViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.NoContentViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.PietViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.ViewHolderType;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.ZeroStateViewHolder;
-import com.google.android.libraries.feed.common.logging.Logger;
-import com.google.android.libraries.feed.piet.PietManager;
-import com.google.android.libraries.feed.sharedstream.deepestcontenttracker.DeepestContentTracker;
-import com.google.android.libraries.feed.sharedstream.piet.PietEventLogger;
-import com.google.android.libraries.feed.sharedstream.publicapi.scroll.ScrollObservable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-
-/** A RecyclerView adapter which can show a list of views with Piet Stream features. */
-public class StreamRecyclerViewAdapter extends RecyclerView.Adapter<FeedViewHolder>
-    implements StreamContentListener {
-  private static final String TAG = "StreamRecyclerViewAdapt";
-
-  private final Context context;
-  private final View viewport;
-  private final CardConfiguration cardConfiguration;
-  private final PietManager pietManager;
-  private final Configuration configuration;
-  private final List<LeafFeatureDriver> leafFeatureDrivers;
-  private final List<HeaderDriver> headers;
-  private final HashMap<FeedViewHolder, LeafFeatureDriver> boundViewHolderToLeafFeatureDriverMap;
-  private final DeepestContentTracker deepestContentTracker;
-  private final ContentChangedListener contentChangedListener;
-  private final PietEventLogger eventLogger;
-
-  private boolean streamContentVisible;
-  private boolean shown;
-
-  /*@Nullable*/ private StreamDriver streamDriver;
-  private final ScrollObservable scrollObservable;
-
-  // Suppress initialization warnings for calling setHasStableIds on RecyclerView.Adapter
-  @SuppressWarnings("initialization")
-  public StreamRecyclerViewAdapter(
-      Context context,
-      View viewport,
-      CardConfiguration cardConfiguration,
-      PietManager pietManager,
-      DeepestContentTracker deepestContentTracker,
-      ContentChangedListener contentChangedListener,
-      ScrollObservable scrollObservable,
-      Configuration configuration,
-      PietEventLogger eventLogger) {
-    this.context = context;
-    this.viewport = viewport;
-    this.cardConfiguration = cardConfiguration;
-    this.pietManager = pietManager;
-    this.contentChangedListener = contentChangedListener;
-    this.configuration = configuration;
-    headers = new ArrayList<>();
-    leafFeatureDrivers = new ArrayList<>();
-    setHasStableIds(true);
-    boundViewHolderToLeafFeatureDriverMap = new HashMap<>();
-    streamContentVisible = true;
-    this.deepestContentTracker = deepestContentTracker;
-    this.scrollObservable = scrollObservable;
-    this.eventLogger = eventLogger;
-  }
-
-  @Override
-  public FeedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-    FrameLayout frameLayout = new FrameLayout(parent.getContext());
-    frameLayout.setLayoutParams(
-        new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
-    if (viewType == TYPE_HEADER) {
-      return new HeaderViewHolder(frameLayout);
-    } else if (viewType == TYPE_CONTINUATION) {
-      return new ContinuationViewHolder(
-          configuration, parent.getContext(), frameLayout, cardConfiguration);
-    } else if (viewType == TYPE_NO_CONTENT) {
-      return new NoContentViewHolder(cardConfiguration, parent.getContext(), frameLayout);
-    } else if (viewType == TYPE_ZERO_STATE) {
-      return new ZeroStateViewHolder(parent.getContext(), frameLayout, cardConfiguration);
-    }
-
-    return new PietViewHolder(
-        cardConfiguration,
-        frameLayout,
-        pietManager,
-        scrollObservable,
-        viewport,
-        context,
-        configuration,
-        eventLogger);
-  }
-
-  @Override
-  public void onBindViewHolder(FeedViewHolder viewHolder, int index) {
-    Logger.d(TAG, "onBindViewHolder for index: %s", index);
-    if (isHeader(index)) {
-
-      Logger.d(TAG, "Binding header at index %s", index);
-      HeaderDriver headerDriver = headers.get(index);
-      headerDriver.bind(viewHolder);
-      boundViewHolderToLeafFeatureDriverMap.put(viewHolder, headerDriver);
-      return;
-    }
-
-    int streamIndex = positionToStreamIndex(index);
-
-    Logger.d(TAG, "onBindViewHolder for stream index: %s", streamIndex);
-    LeafFeatureDriver leafFeatureDriver = leafFeatureDrivers.get(streamIndex);
-
-    deepestContentTracker.updateDeepestContentTracker(
-        streamIndex, leafFeatureDriver.getContentId());
-
-    leafFeatureDriver.bind(viewHolder);
-    boundViewHolderToLeafFeatureDriverMap.put(viewHolder, leafFeatureDriver);
-  }
-
-  @Override
-  public void onViewRecycled(FeedViewHolder viewHolder) {
-    LeafFeatureDriver leafFeatureDriver = boundViewHolderToLeafFeatureDriverMap.get(viewHolder);
-
-    if (leafFeatureDriver == null) {
-      Logger.wtf(TAG, "Could not find driver for unbinding");
-      return;
-    }
-
-    leafFeatureDriver.unbind();
-    boundViewHolderToLeafFeatureDriverMap.remove(viewHolder);
-  }
-
-  @Override
-  public int getItemCount() {
-    int driverSize = streamContentVisible ? leafFeatureDrivers.size() : 0;
-    return driverSize + headers.size();
-  }
-
-  @Override
-  @ViewHolderType
-  public int getItemViewType(int position) {
-    if (isHeader(position)) {
-      return TYPE_HEADER;
-    }
-
-    return leafFeatureDrivers.get(positionToStreamIndex(position)).getItemViewType();
-  }
-
-  @Override
-  public long getItemId(int position) {
-    if (isHeader(position)) {
-      return headers.get(position).hashCode();
-    }
-
-    return leafFeatureDrivers.get(positionToStreamIndex(position)).itemId();
-  }
-
-  public void rebind() {
-    for (LeafFeatureDriver driver : boundViewHolderToLeafFeatureDriverMap.values()) {
-      driver.maybeRebind();
-    }
-  }
-
-  @VisibleForTesting
-  public List<LeafFeatureDriver> getLeafFeatureDrivers() {
-    return leafFeatureDrivers;
-  }
-
-  private boolean isHeader(int position) {
-    return position < headers.size();
-  }
-
-  private int positionToStreamIndex(int position) {
-    return position - headers.size();
-  }
-
-  public void setHeaders(List<Header> newHeaders) {
-    // TODO: Move header orchestration into separate class once header orchestration
-    // logic is complex enough.
-    List<Header> oldHeaders = new ArrayList<>();
-    for (HeaderDriver headerDriver : headers) {
-      oldHeaders.add(headerDriver.getHeader());
-    }
-    DiffResult diffResult =
-        DiffUtil.calculateDiff(new HeaderDiffCallback(oldHeaders, newHeaders), true);
-    diffResult.dispatchUpdatesTo(new HeaderListUpdateCallback(newHeaders));
-  }
-
-  public int getHeaderCount() {
-    return headers.size();
-  }
-
-  public void setStreamContentVisible(boolean streamContentVisible) {
-    if (this.streamContentVisible == streamContentVisible) {
-      return;
-    }
-    this.streamContentVisible = streamContentVisible;
-
-    if (leafFeatureDrivers.isEmpty()) {
-      // Nothing to alter in RecyclerView if there is no leaf content.
-      return;
-    }
-
-    if (streamContentVisible) {
-      notifyItemRangeInserted(headers.size(), leafFeatureDrivers.size());
-    } else {
-      notifyItemRangeRemoved(headers.size(), leafFeatureDrivers.size());
-    }
-  }
-
-  public void setDriver(StreamDriver newStreamDriver) {
-    if (streamDriver != null) {
-      streamDriver.setStreamContentListener(null);
-    }
-
-    notifyItemRangeRemoved(headers.size(), leafFeatureDrivers.size());
-    leafFeatureDrivers.clear();
-
-    // It is important that we get call getLeafFeatureDrivers before setting the content listener.
-    // If this is done in the other order, it is possible that the StreamDriver notifies us of
-    // something being added inside of the getLeafFeatureDrivers() call, resulting in two copies of
-    // the LeafFeatureDriver being shown.
-    leafFeatureDrivers.addAll(newStreamDriver.getLeafFeatureDrivers());
-    newStreamDriver.setStreamContentListener(this);
-
-    streamDriver = newStreamDriver;
-    if (streamContentVisible) {
-      notifyItemRangeInserted(headers.size(), leafFeatureDrivers.size());
-    }
-
-    newStreamDriver.maybeRestoreScroll();
-  }
-
-  @Override
-  public void notifyContentsAdded(int index, List<LeafFeatureDriver> newFeatureDrivers) {
-    if (newFeatureDrivers.size() == 0) {
-      return;
-    }
-
-    leafFeatureDrivers.addAll(index, newFeatureDrivers);
-
-    int insertionIndex = headers.size() + index;
-
-    if (streamContentVisible) {
-      notifyItemRangeInserted(insertionIndex, newFeatureDrivers.size());
-    }
-    maybeNotifyContentChanged();
-  }
-
-  @Override
-  public void notifyContentRemoved(int index) {
-    int removalIndex = headers.size() + index;
-
-    leafFeatureDrivers.remove(index);
-    deepestContentTracker.removeContentId(index);
-
-    if (streamContentVisible) {
-      notifyItemRemoved(removalIndex);
-    }
-    maybeNotifyContentChanged();
-  }
-
-  @Override
-  public void notifyContentsCleared() {
-    int itemCount = leafFeatureDrivers.size();
-    leafFeatureDrivers.clear();
-
-    if (streamContentVisible) {
-      notifyItemRangeRemoved(headers.size(), itemCount);
-    }
-    maybeNotifyContentChanged();
-  }
-
-  public void onDestroy() {
-    for (HeaderDriver header : headers) {
-      header.unbind();
-    }
-
-    setHeaders(Collections.emptyList());
-  }
-
-  public void setShown(boolean shown) {
-    this.shown = shown;
-  }
-
-  private void maybeNotifyContentChanged() {
-    // If Stream is not shown on screen, host should be notified as animations will not run and the
-    // host will not be notified through StreamItemAnimator.
-    if (!shown) {
-      contentChangedListener.onContentChanged();
-    }
-  }
-
-  @VisibleForTesting
-  void dismissHeader(Header header) {
-    int indexToRemove = -1;
-    for (int i = 0; i < headers.size(); i++) {
-      if (headers.get(i).getHeader() == header) {
-        indexToRemove = i;
-      }
-    }
-    if (indexToRemove == -1) {
-      Logger.w(TAG, "Header has already been removed.");
-      return;
-    }
-
-    headers.remove(indexToRemove).onDestroy();
-    notifyItemRemoved(indexToRemove);
-    header.onDismissed();
-  }
-
-  @VisibleForTesting
-  HeaderDriver createHeaderDriver(Header header) {
-    return new HeaderDriver(header, () -> dismissHeader(header));
-  }
-
-  private static class HeaderDiffCallback extends DiffUtil.Callback {
-
-    private final List<Header> oldHeaders;
-    private final List<Header> newHeaders;
-
-    private HeaderDiffCallback(List<Header> oldHeaders, List<Header> newHeaders) {
-      this.oldHeaders = oldHeaders;
-      this.newHeaders = newHeaders;
-    }
-
-    @Override
-    public int getOldListSize() {
-      return oldHeaders.size();
-    }
-
-    @Override
-    public int getNewListSize() {
-      return newHeaders.size();
-    }
-
-    @Override
-    public boolean areItemsTheSame(int i, int i1) {
-      return oldHeaders.get(i).getView().equals(newHeaders.get(i1).getView());
-    }
-
-    @Override
-    public boolean areContentsTheSame(int i, int i1) {
-      return oldHeaders.get(i).getView().equals(newHeaders.get(i1).getView());
-    }
-  }
-
-  private class HeaderListUpdateCallback implements ListUpdateCallback {
-
-    private final List<Header> newHeaders;
-
-    public HeaderListUpdateCallback(List<Header> newHeaders) {
-      this.newHeaders = newHeaders;
-    }
-
-    @Override
-    public void onInserted(int i, int i1) {
-      for (int index = i; index < newHeaders.size() && index < i + i1; index++) {
-        HeaderDriver headerDriver = createHeaderDriver(newHeaders.get(index));
-        headers.add(index, headerDriver);
-      }
-      notifyItemRangeInserted(i, i1);
-    }
-
-    @Override
-    public void onRemoved(int i, int i1) {
-      for (int index = i + i1 - 1; index >= 0 && index > i - i1; index--) {
-        headers.get(index).onDestroy();
-        headers.remove(index);
-      }
-      notifyItemRangeRemoved(i, i1);
-    }
-
-    @Override
-    public void onMoved(int i, int i1) {
-      notifyItemMoved(i, i1);
-    }
-
-    @Override
-    public void onChanged(int i, int i1, /*@Nullable*/ Object o) {
-      notifyItemRangeChanged(i, i1, o);
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/actions/BUILD b/src/main/java/com/google/android/libraries/feed/basicstream/internal/actions/BUILD
deleted file mode 100644
index 55b43e7..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/actions/BUILD
+++ /dev/null
@@ -1,24 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "actions",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/client/knowncontent",
-        "//src/main/java/com/google/android/libraries/feed/api/host/action",
-        "//src/main/java/com/google/android/libraries/feed/api/host/logging",
-        "//src/main/java/com/google/android/libraries/feed/api/host/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/actionmanager",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/actionparser",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/pendingdismiss",
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/contextmenumanager",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/pendingdismiss",
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "//src/main/proto/search/now/ui/action:feed_action_java_proto_lite",
-        "//src/main/proto/search/now/wire/feed:feed_java_proto_lite",
-        "@com_google_code_findbugs_jsr305//jar",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/actions/StreamActionApiImpl.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/actions/StreamActionApiImpl.java
deleted file mode 100644
index d41e9a6..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/actions/StreamActionApiImpl.java
+++ /dev/null
@@ -1,362 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.actions;
-
-import android.view.View;
-import com.google.android.libraries.feed.api.client.knowncontent.ContentMetadata;
-import com.google.android.libraries.feed.api.host.action.ActionApi;
-import com.google.android.libraries.feed.api.host.action.StreamActionApi;
-import com.google.android.libraries.feed.api.host.logging.ActionType;
-import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
-import com.google.android.libraries.feed.api.host.logging.ContentLoggingData;
-import com.google.android.libraries.feed.api.host.stream.TooltipApi;
-import com.google.android.libraries.feed.api.host.stream.TooltipCallbackApi;
-import com.google.android.libraries.feed.api.host.stream.TooltipInfo;
-import com.google.android.libraries.feed.api.internal.actionmanager.ActionManager;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionParser;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionSource;
-import com.google.android.libraries.feed.basicstream.internal.pendingdismiss.ClusterPendingDismissHelper;
-import com.google.android.libraries.feed.common.functional.Supplier;
-import com.google.android.libraries.feed.sharedstream.contextmenumanager.ContextMenuManager;
-import com.google.android.libraries.feed.sharedstream.pendingdismiss.PendingDismissCallback;
-import com.google.search.now.feed.client.StreamDataProto.StreamDataOperation;
-import com.google.search.now.ui.action.FeedActionProto.FeedActionMetadata.ElementType;
-import com.google.search.now.ui.action.FeedActionProto.LabelledFeedActionData;
-import com.google.search.now.ui.action.FeedActionProto.OpenContextMenuData;
-import com.google.search.now.ui.action.FeedActionProto.UndoAction;
-import com.google.search.now.wire.feed.ActionPayloadProto.ActionPayload;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/** Action handler for Stream. */
-public class StreamActionApiImpl implements StreamActionApi {
-
-  private static final String TAG = "StreamActionApiImpl";
-
-  private final ActionApi actionApi;
-  private final ActionParser actionParser;
-  private final ActionManager actionManager;
-  private final BasicLoggingApi basicLoggingApi;
-  private final Supplier<ContentLoggingData> contentLoggingData;
-  private final ContextMenuManager contextMenuManager;
-  private final ClusterPendingDismissHelper clusterPendingDismissHelper;
-  private final ViewElementActionHandler viewElementActionHandler;
-  private final String contentId;
-  private final TooltipApi tooltipApi;
-
-  /*@Nullable*/ private final String sessionId;
-
-  public StreamActionApiImpl(
-      ActionApi actionApi,
-      ActionParser actionParser,
-      ActionManager actionManager,
-      BasicLoggingApi basicLoggingApi,
-      Supplier<ContentLoggingData> contentLoggingData,
-      ContextMenuManager contextMenuManager,
-      /*@Nullable*/ String sessionId,
-      ClusterPendingDismissHelper clusterPendingDismissHelper,
-      ViewElementActionHandler viewElementActionHandler,
-      String contentId,
-      TooltipApi tooltipApi) {
-    this.actionApi = actionApi;
-    this.actionParser = actionParser;
-    this.actionManager = actionManager;
-    this.basicLoggingApi = basicLoggingApi;
-    this.contentLoggingData = contentLoggingData;
-    this.contextMenuManager = contextMenuManager;
-    this.sessionId = sessionId;
-    this.clusterPendingDismissHelper = clusterPendingDismissHelper;
-    this.viewElementActionHandler = viewElementActionHandler;
-    this.contentId = contentId;
-    this.tooltipApi = tooltipApi;
-  }
-
-  @Override
-  public void openContextMenu(OpenContextMenuData openContextMenuData, View anchorView) {
-    List<String> actionLabels = new ArrayList<>();
-    List<LabelledFeedActionData> enabledActions = new ArrayList<>();
-    for (LabelledFeedActionData labelledFeedActionData :
-        openContextMenuData.getContextMenuDataList()) {
-      if (actionParser.canPerformAction(labelledFeedActionData.getFeedActionPayload(), this)) {
-        actionLabels.add(labelledFeedActionData.getLabel());
-        enabledActions.add(labelledFeedActionData);
-      }
-    }
-
-    boolean menuOpened =
-        contextMenuManager.openContextMenu(
-            anchorView,
-            actionLabels,
-            (int position) ->
-                actionParser.parseFeedActionPayload(
-                    enabledActions.get(position).getFeedActionPayload(),
-                    StreamActionApiImpl.this,
-                    anchorView,
-                    ActionSource.CONTEXT_MENU));
-
-    if (menuOpened) {
-      basicLoggingApi.onContentContextMenuOpened(contentLoggingData.get());
-    }
-  }
-
-  @Override
-  public boolean canOpenContextMenu() {
-    return true;
-  }
-
-  @Override
-  public boolean canDismiss() {
-    return true;
-  }
-
-  @Override
-  public boolean canHandleNotInterestedIn() {
-    return true;
-  }
-
-  @Override
-  public void handleNotInterestedIn(
-      List<StreamDataOperation> dataOperations,
-      UndoAction undoAction,
-      ActionPayload payload,
-      int interestType) {
-    if (!undoAction.hasConfirmationLabel()) {
-      dismiss(dataOperations);
-      basicLoggingApi.onNotInterestedIn(
-          interestType, contentLoggingData.get(), /* wasCommitted = */ true);
-    } else {
-      dismissWithSnackbar(
-          undoAction,
-          new PendingDismissCallback() {
-            @Override
-            public void onDismissReverted() {
-              basicLoggingApi.onNotInterestedIn(
-                  interestType, contentLoggingData.get(), /* wasCommitted = */ false);
-            }
-
-            @Override
-            public void onDismissCommitted() {
-              dismiss(dataOperations);
-              actionManager.createAndUploadAction(contentId, payload);
-              basicLoggingApi.onNotInterestedIn(
-                  interestType, contentLoggingData.get(), /* wasCommitted = */ true);
-            }
-          });
-    }
-  }
-
-  @Override
-  public void dismiss(
-      String contentId,
-      List<StreamDataOperation> dataOperations,
-      UndoAction undoAction,
-      ActionPayload payload) {
-    if (!undoAction.hasConfirmationLabel()) {
-      dismissLocal(contentId, dataOperations);
-      basicLoggingApi.onContentDismissed(contentLoggingData.get(), /* wasCommitted = */ true);
-    } else {
-      dismissWithSnackbar(
-          undoAction,
-          new PendingDismissCallback() {
-            @Override
-            public void onDismissReverted() {
-              basicLoggingApi.onContentDismissed(
-                  contentLoggingData.get(), /* wasCommitted = */ false);
-            }
-
-            @Override
-            public void onDismissCommitted() {
-              dismissLocal(contentId, dataOperations);
-              dismiss(dataOperations);
-              actionManager.createAndUploadAction(contentId, payload);
-              basicLoggingApi.onContentDismissed(
-                  contentLoggingData.get(), /* wasCommitted = */ true);
-            }
-          });
-    }
-  }
-
-  private void dismiss(List<StreamDataOperation> dataOperations) {
-    actionManager.dismiss(dataOperations, sessionId);
-  }
-
-  private void dismissLocal(String contentId, List<StreamDataOperation> dataOperations) {
-    actionManager.dismissLocal(Collections.singletonList(contentId), dataOperations, sessionId);
-  }
-
-  private void dismissWithSnackbar(
-      UndoAction undoAction, PendingDismissCallback pendingDismissCallback) {
-    clusterPendingDismissHelper.triggerPendingDismissForCluster(undoAction, pendingDismissCallback);
-  }
-
-  @Override
-  public void onClientAction(@ActionType int actionType) {
-    basicLoggingApi.onClientAction(contentLoggingData.get(), actionType);
-  }
-
-  @Override
-  public void openUrl(String url) {
-    actionApi.openUrl(url);
-  }
-
-  @Override
-  public void openUrl(String url, String consistencyTokenQueryParamName) {
-    actionManager.uploadAllActionsAndUpdateUrl(
-        url,
-        consistencyTokenQueryParamName,
-        result -> {
-          actionApi.openUrl(result);
-        });
-  }
-
-  @Override
-  public boolean canOpenUrl() {
-    return actionApi.canOpenUrl();
-  }
-
-  @Override
-  public void openUrlInIncognitoMode(String url) {
-    actionApi.openUrlInIncognitoMode(url);
-  }
-
-  @Override
-  public void openUrlInIncognitoMode(String url, String consistencyTokenQueryParamName) {
-    actionManager.uploadAllActionsAndUpdateUrl(
-        url,
-        consistencyTokenQueryParamName,
-        result -> {
-          actionApi.openUrlInIncognitoMode(result);
-        });
-  }
-
-  @Override
-  public boolean canOpenUrlInIncognitoMode() {
-    return actionApi.canOpenUrlInIncognitoMode();
-  }
-
-  @Override
-  public void openUrlInNewTab(String url) {
-    actionApi.openUrlInNewTab(url);
-  }
-
-  @Override
-  public void openUrlInNewTab(String url, String consistencyTokenQueryParamName) {
-    actionManager.uploadAllActionsAndUpdateUrl(
-        url,
-        consistencyTokenQueryParamName,
-        result -> {
-          actionApi.openUrlInNewTab(result);
-        });
-  }
-
-  @Override
-  public boolean canOpenUrlInNewTab() {
-    return actionApi.canOpenUrlInNewTab();
-  }
-
-  @Override
-  public void openUrlInNewWindow(String url) {
-    actionApi.openUrlInNewWindow(url);
-  }
-
-  @Override
-  public void openUrlInNewWindow(String url, String consistencyTokenQueryParamName) {
-    actionManager.uploadAllActionsAndUpdateUrl(
-        url,
-        consistencyTokenQueryParamName,
-        result -> {
-          actionApi.openUrlInNewWindow(result);
-        });
-  }
-
-  @Override
-  public boolean canOpenUrlInNewWindow() {
-    return actionApi.canOpenUrlInNewWindow();
-  }
-
-  @Override
-  public void downloadUrl(ContentMetadata contentMetadata) {
-    actionApi.downloadUrl(contentMetadata);
-  }
-
-  @Override
-  public boolean canDownloadUrl() {
-    return actionApi.canDownloadUrl();
-  }
-
-  @Override
-  public void learnMore() {
-    actionApi.learnMore();
-  }
-
-  @Override
-  public boolean canLearnMore() {
-    return actionApi.canLearnMore();
-  }
-
-  @Override
-  public boolean canHandleElementView() {
-    return true;
-  }
-
-  @Override
-  public boolean canHandleElementHide() {
-    return true;
-  }
-
-  @Override
-  public boolean canHandleElementClick() {
-    return true;
-  }
-
-  @Override
-  public void onElementView(int elementType) {
-    viewElementActionHandler.onElementView(elementType);
-  }
-
-  @Override
-  public void onElementHide(int elementType) {
-    viewElementActionHandler.onElementHide(elementType);
-  }
-
-  @Override
-  public void onElementClick(int elementType) {
-    basicLoggingApi.onVisualElementClicked(contentLoggingData.get(), elementType);
-  }
-
-  @Override
-  public boolean canShowTooltip() {
-    return true;
-  }
-
-  @Override
-  public void maybeShowTooltip(TooltipInfo tooltipInfo, View view) {
-    tooltipApi.maybeShowHelpUi(
-        tooltipInfo,
-        view,
-        new TooltipCallbackApi() {
-          @Override
-          public void onShow() {
-            onElementView(ElementType.TOOLTIP.getNumber());
-          }
-
-          @Override
-          public void onHide(int dismissType) {
-            onElementHide(ElementType.TOOLTIP.getNumber());
-          }
-        });
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/actions/ViewElementActionHandler.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/actions/ViewElementActionHandler.java
deleted file mode 100644
index 19e7424..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/actions/ViewElementActionHandler.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2019 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.android.libraries.feed.basicstream.internal.actions;
-
-/** Interface used for communicating view and hide events */
-public interface ViewElementActionHandler {
-  /**
-   * Called when a hide action has been performed on a {@link
-   * com.google.search.now.ui.action.FeedActionProto.FeedActionMetadata.ElementType} value.
-   */
-  void onElementHide(int elementType);
-
-  /**
-   * Called when a view action has been performed on a {@link
-   * com.google.search.now.ui.action.FeedActionProto.FeedActionMetadata.ElementType} value.
-   */
-  void onElementView(int elementType);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/AndroidManifest.xml b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/AndroidManifest.xml
deleted file mode 100644
index efbe264..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/AndroidManifest.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018 The Feed Authors.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.google.android.libraries.feed.basicstream.internal.drivers">
-</manifest>
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/BUILD b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/BUILD
deleted file mode 100644
index 5b19520..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/BUILD
+++ /dev/null
@@ -1,51 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "drivers",
-    srcs = glob(["*.java"]),
-    manifest = "AndroidManifest.xml",
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/client/knowncontent",
-        "//src/main/java/com/google/android/libraries/feed/api/client/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/host/action",
-        "//src/main/java/com/google/android/libraries/feed/api/host/config",
-        "//src/main/java/com/google/android/libraries/feed/api/host/logging",
-        "//src/main/java/com/google/android/libraries/feed/api/host/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/actionmanager",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/actionparser",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/common",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/knowncontent",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/modelprovider",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/actions",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/pendingdismiss",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/viewloggingupdater",
-        "//src/main/java/com/google/android/libraries/feed/common",
-        "//src/main/java/com/google/android/libraries/feed/common/concurrent",
-        "//src/main/java/com/google/android/libraries/feed/common/functional",
-        "//src/main/java/com/google/android/libraries/feed/common/logging",
-        "//src/main/java/com/google/android/libraries/feed/common/time",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/constants",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/contextmenumanager",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/logging",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/offlinemonitor",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/pendingdismiss",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/removetrackingfactory",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/scroll",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/ui",
-        "//src/main/proto/com/google/android/libraries/feed/api/internal/proto:client_feed_java_proto_lite",
-        "//src/main/proto/com/google/android/libraries/feed/sharedstream/proto:ui_refresh_reason_java_proto_lite",
-        "//src/main/proto/search/now/ui/action:feed_action_java_proto_lite",
-        "//src/main/proto/search/now/ui/action:feed_action_payload_java_proto_lite",
-        "//src/main/proto/search/now/ui/piet:piet_java_proto_lite",
-        "//src/main/proto/search/now/ui/stream:stream_java_proto_lite",
-        "//src/main/proto/search/now/ui/stream:stream_swipe_extension_java_proto_lite",
-        "//src/main/proto/search/now/wire/feed:feed_java_proto_lite",
-        "@com_google_code_findbugs_jsr305//jar",
-        "@maven//:com_android_support_recyclerview_v7",
-        "@maven//:com_android_support_support_annotations",  # buildcleaner: keep
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/CardDriver.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/CardDriver.java
deleted file mode 100644
index 693cba3..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/CardDriver.java
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.drivers;
-
-import static com.google.android.libraries.feed.common.Validators.checkState;
-
-import android.support.annotation.VisibleForTesting;
-import com.google.android.libraries.feed.api.client.stream.Stream.ContentChangedListener;
-import com.google.android.libraries.feed.api.host.action.ActionApi;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
-import com.google.android.libraries.feed.api.host.logging.InternalFeedError;
-import com.google.android.libraries.feed.api.host.stream.TooltipApi;
-import com.google.android.libraries.feed.api.internal.actionmanager.ActionManager;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionParserFactory;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelChild;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelChild.Type;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelCursor;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelFeature;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProvider;
-import com.google.android.libraries.feed.basicstream.internal.pendingdismiss.ClusterPendingDismissHelper;
-import com.google.android.libraries.feed.basicstream.internal.viewloggingupdater.ViewLoggingUpdater;
-import com.google.android.libraries.feed.common.concurrent.MainThreadRunner;
-import com.google.android.libraries.feed.common.logging.Logger;
-import com.google.android.libraries.feed.sharedstream.contextmenumanager.ContextMenuManager;
-import com.google.android.libraries.feed.sharedstream.offlinemonitor.StreamOfflineMonitor;
-import com.google.search.now.ui.action.FeedActionPayloadProto.FeedActionPayload;
-import com.google.search.now.ui.stream.StreamSwipeExtensionProto.SwipeActionExtension;
-
-/** {@link FeatureDriver} for cards. */
-public class CardDriver implements FeatureDriver {
-  private static final String TAG = "CardDriver";
-
-  private final ActionApi actionApi;
-  private final ActionManager actionManager;
-  private final ActionParserFactory actionParserFactory;
-  private final BasicLoggingApi basicLoggingApi;
-  private final ModelFeature cardModel;
-  private final ModelProvider modelProvider;
-  private final int position;
-  private final ClusterPendingDismissHelper clusterPendingDismissHelper;
-  private final StreamOfflineMonitor streamOfflineMonitor;
-  private final ContentChangedListener contentChangedListener;
-  private final ContextMenuManager contextMenuManager;
-  private final MainThreadRunner mainThreadRunner;
-  private final Configuration configuration;
-  private final ViewLoggingUpdater viewLoggingUpdater;
-  private final TooltipApi tooltipApi;
-
-  /*@Nullable*/ private ContentDriver contentDriver;
-
-  CardDriver(
-      ActionApi actionApi,
-      ActionManager actionManager,
-      ActionParserFactory actionParserFactory,
-      BasicLoggingApi basicLoggingApi,
-      ModelFeature cardModel,
-      ModelProvider modelProvider,
-      int position,
-      ClusterPendingDismissHelper clusterPendingDismissHelper,
-      StreamOfflineMonitor streamOfflineMonitor,
-      ContentChangedListener contentChangedListener,
-      ContextMenuManager contextMenuManager,
-      MainThreadRunner mainThreadRunner,
-      Configuration configuration,
-      ViewLoggingUpdater viewLoggingUpdater,
-      TooltipApi tooltipApi) {
-    this.actionApi = actionApi;
-    this.actionManager = actionManager;
-    this.actionParserFactory = actionParserFactory;
-    this.basicLoggingApi = basicLoggingApi;
-    this.cardModel = cardModel;
-    this.modelProvider = modelProvider;
-    this.position = position;
-    this.clusterPendingDismissHelper = clusterPendingDismissHelper;
-    this.streamOfflineMonitor = streamOfflineMonitor;
-    this.contentChangedListener = contentChangedListener;
-    this.contextMenuManager = contextMenuManager;
-    this.mainThreadRunner = mainThreadRunner;
-    this.configuration = configuration;
-    this.viewLoggingUpdater = viewLoggingUpdater;
-    this.tooltipApi = tooltipApi;
-  }
-
-  @Override
-  public void onDestroy() {
-    if (contentDriver != null) {
-      contentDriver.onDestroy();
-    }
-  }
-
-  @Override
-  /*@Nullable*/
-  public LeafFeatureDriver getLeafFeatureDriver() {
-    if (contentDriver == null) {
-      contentDriver = createContentChild(cardModel);
-    }
-
-    if (contentDriver != null) {
-      return contentDriver.getLeafFeatureDriver();
-    }
-
-    return null;
-  }
-
-  /*@Nullable*/
-  private ContentDriver createContentChild(ModelFeature modelFeature) {
-    ModelCursor cursor = modelFeature.getCursor();
-    // TODO: add change listener to ModelFeature.
-    ModelChild child;
-    if ((child = cursor.getNextItem()) != null) {
-      if (child.getType() != Type.FEATURE) {
-        basicLoggingApi.onInternalError(InternalFeedError.CARD_CHILD_MISSING_FEATURE);
-        Logger.e(TAG, "ContentChild was not bound to a Feature, found type: %s", child.getType());
-        return null;
-      }
-      ModelFeature contentModel = child.getModelFeature();
-      checkState(contentModel.getStreamFeature().hasContent(), "Expected content for feature");
-      return createContentDriver(
-          contentModel,
-          cardModel
-              .getStreamFeature()
-              .getCard()
-              .getExtension(SwipeActionExtension.swipeActionExtension)
-              .getSwipeAction());
-    }
-
-    return null;
-  }
-
-  @VisibleForTesting
-  ContentDriver createContentDriver(ModelFeature contentModel, FeedActionPayload swipeAction) {
-    return new ContentDriver(
-        actionApi,
-        actionManager,
-        actionParserFactory,
-        basicLoggingApi,
-        contentModel,
-        modelProvider,
-        position,
-        swipeAction,
-        clusterPendingDismissHelper,
-        streamOfflineMonitor,
-        contentChangedListener,
-        contextMenuManager,
-        mainThreadRunner,
-        configuration,
-        viewLoggingUpdater,
-        tooltipApi);
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ClusterDriver.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ClusterDriver.java
deleted file mode 100644
index 07b3196..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ClusterDriver.java
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.drivers;
-
-import android.support.annotation.VisibleForTesting;
-import com.google.android.libraries.feed.api.client.stream.Stream.ContentChangedListener;
-import com.google.android.libraries.feed.api.host.action.ActionApi;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
-import com.google.android.libraries.feed.api.host.logging.InternalFeedError;
-import com.google.android.libraries.feed.api.host.stream.TooltipApi;
-import com.google.android.libraries.feed.api.internal.actionmanager.ActionManager;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionParserFactory;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelChild;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelChild.Type;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelCursor;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelFeature;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProvider;
-import com.google.android.libraries.feed.basicstream.internal.pendingdismiss.ClusterPendingDismissHelper;
-import com.google.android.libraries.feed.basicstream.internal.pendingdismiss.PendingDismissHandler;
-import com.google.android.libraries.feed.basicstream.internal.viewloggingupdater.ViewLoggingUpdater;
-import com.google.android.libraries.feed.common.concurrent.MainThreadRunner;
-import com.google.android.libraries.feed.common.logging.Logger;
-import com.google.android.libraries.feed.sharedstream.contextmenumanager.ContextMenuManager;
-import com.google.android.libraries.feed.sharedstream.offlinemonitor.StreamOfflineMonitor;
-import com.google.android.libraries.feed.sharedstream.pendingdismiss.PendingDismissCallback;
-import com.google.search.now.ui.action.FeedActionProto.UndoAction;
-
-/** {@link FeatureDriver} for Clusters. */
-public class ClusterDriver implements FeatureDriver, ClusterPendingDismissHelper {
-
-  private static final String TAG = "ClusterDriver";
-  private final ActionApi actionApi;
-  private final ActionManager actionManager;
-  private final ActionParserFactory actionParserFactory;
-  private final BasicLoggingApi basicLoggingApi;
-  private final ModelFeature clusterModel;
-  private final ModelProvider modelProvider;
-  private final int position;
-  private final PendingDismissHandler pendingDismissHandler;
-  private final StreamOfflineMonitor streamOfflineMonitor;
-  private final ContentChangedListener contentChangedListener;
-  private final ContextMenuManager contextMenuManager;
-  private final MainThreadRunner mainThreadRunner;
-  private final Configuration configuration;
-  private final ViewLoggingUpdater viewLoggingUpdater;
-  private final TooltipApi tooltipApi;
-
-  /*@Nullable*/ private CardDriver cardDriver;
-
-  ClusterDriver(
-      ActionApi actionApi,
-      ActionManager actionManager,
-      ActionParserFactory actionParserFactory,
-      BasicLoggingApi basicLoggingApi,
-      ModelFeature clusterModel,
-      ModelProvider modelProvider,
-      int position,
-      PendingDismissHandler pendingDismissHandler,
-      StreamOfflineMonitor streamOfflineMonitor,
-      ContentChangedListener contentChangedListener,
-      ContextMenuManager contextMenuManager,
-      MainThreadRunner mainThreadRunner,
-      Configuration configuration,
-      ViewLoggingUpdater viewLoggingUpdater,
-      TooltipApi tooltipApi) {
-    this.actionApi = actionApi;
-    this.actionManager = actionManager;
-    this.actionParserFactory = actionParserFactory;
-    this.basicLoggingApi = basicLoggingApi;
-    this.clusterModel = clusterModel;
-    this.modelProvider = modelProvider;
-    this.position = position;
-    this.pendingDismissHandler = pendingDismissHandler;
-    this.streamOfflineMonitor = streamOfflineMonitor;
-    this.contentChangedListener = contentChangedListener;
-    this.contextMenuManager = contextMenuManager;
-    this.mainThreadRunner = mainThreadRunner;
-    this.configuration = configuration;
-    this.viewLoggingUpdater = viewLoggingUpdater;
-    this.tooltipApi = tooltipApi;
-  }
-
-  @Override
-  public void onDestroy() {
-    if (cardDriver != null) {
-      cardDriver.onDestroy();
-    }
-  }
-
-  @Override
-  /*@Nullable*/
-  public LeafFeatureDriver getLeafFeatureDriver() {
-    if (cardDriver == null) {
-      cardDriver = createCardChild(clusterModel);
-    }
-
-    if (cardDriver != null) {
-      return cardDriver.getLeafFeatureDriver();
-    }
-
-    return null;
-  }
-
-  /*@Nullable*/
-  private CardDriver createCardChild(ModelFeature clusterFeature) {
-    ModelCursor cursor = clusterFeature.getCursor();
-    // TODO: add change listener to clusterCursor.
-    ModelChild child;
-    while ((child = cursor.getNextItem()) != null) {
-      if (child.getType() != Type.FEATURE) {
-        basicLoggingApi.onInternalError(InternalFeedError.CLUSTER_CHILD_MISSING_FEATURE);
-        Logger.e(TAG, "Child of cursor is not a feature");
-        continue;
-      }
-
-      ModelFeature childModelFeature = child.getModelFeature();
-
-      if (!childModelFeature.getStreamFeature().hasCard()) {
-        basicLoggingApi.onInternalError(InternalFeedError.CLUSTER_CHILD_NOT_CARD);
-        Logger.e(TAG, "Content not card.");
-        continue;
-      }
-
-      return createCardDriver(childModelFeature);
-    }
-
-    return null;
-  }
-
-  @VisibleForTesting
-  CardDriver createCardDriver(ModelFeature content) {
-    return new CardDriver(
-        actionApi,
-        actionManager,
-        actionParserFactory,
-        basicLoggingApi,
-        content,
-        modelProvider,
-        position,
-        this,
-        streamOfflineMonitor,
-        contentChangedListener,
-        contextMenuManager,
-        mainThreadRunner,
-        configuration,
-        viewLoggingUpdater,
-        tooltipApi);
-  }
-
-  @Override
-  public void triggerPendingDismissForCluster(
-      UndoAction undoAction, PendingDismissCallback pendingDismissCallback) {
-    // Get the content id assoc with this ClusterDriver and pass the dismiss to the StreamDriver.
-    pendingDismissHandler.triggerPendingDismiss(
-        clusterModel.getStreamFeature().getContentId(), undoAction, pendingDismissCallback);
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ContentDriver.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ContentDriver.java
deleted file mode 100644
index 386d82d..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ContentDriver.java
+++ /dev/null
@@ -1,371 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.drivers;
-
-import static com.google.android.libraries.feed.common.Validators.checkState;
-
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.widget.RecyclerView;
-import com.google.android.libraries.feed.api.client.knowncontent.ContentMetadata;
-import com.google.android.libraries.feed.api.client.stream.Stream.ContentChangedListener;
-import com.google.android.libraries.feed.api.host.action.ActionApi;
-import com.google.android.libraries.feed.api.host.action.StreamActionApi;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.config.Configuration.ConfigKey;
-import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
-import com.google.android.libraries.feed.api.host.logging.ContentLoggingData;
-import com.google.android.libraries.feed.api.host.logging.InternalFeedError;
-import com.google.android.libraries.feed.api.host.stream.TooltipApi;
-import com.google.android.libraries.feed.api.internal.actionmanager.ActionManager;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionParser;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionParserFactory;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelFeature;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProvider;
-import com.google.android.libraries.feed.basicstream.internal.actions.StreamActionApiImpl;
-import com.google.android.libraries.feed.basicstream.internal.actions.ViewElementActionHandler;
-import com.google.android.libraries.feed.basicstream.internal.pendingdismiss.ClusterPendingDismissHelper;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.FeedViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.PietViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.ViewHolderType;
-import com.google.android.libraries.feed.basicstream.internal.viewloggingupdater.ResettableOneShotVisibilityLoggingListener;
-import com.google.android.libraries.feed.basicstream.internal.viewloggingupdater.ViewLoggingUpdater;
-import com.google.android.libraries.feed.common.concurrent.CancelableTask;
-import com.google.android.libraries.feed.common.concurrent.MainThreadRunner;
-import com.google.android.libraries.feed.common.functional.Consumer;
-import com.google.android.libraries.feed.common.functional.Supplier;
-import com.google.android.libraries.feed.common.logging.Logger;
-import com.google.android.libraries.feed.sharedstream.constants.Constants;
-import com.google.android.libraries.feed.sharedstream.contextmenumanager.ContextMenuManager;
-import com.google.android.libraries.feed.sharedstream.logging.LoggingListener;
-import com.google.android.libraries.feed.sharedstream.logging.StreamContentLoggingData;
-import com.google.android.libraries.feed.sharedstream.offlinemonitor.StreamOfflineMonitor;
-import com.google.search.now.feed.client.StreamDataProto.StreamSharedState;
-import com.google.search.now.ui.action.FeedActionPayloadProto.FeedActionPayload;
-import com.google.search.now.ui.piet.PietProto.Frame;
-import com.google.search.now.ui.piet.PietProto.PietSharedState;
-import com.google.search.now.ui.stream.StreamStructureProto;
-import com.google.search.now.ui.stream.StreamStructureProto.Content;
-import com.google.search.now.ui.stream.StreamStructureProto.PietContent;
-import com.google.search.now.ui.stream.StreamStructureProto.RepresentationData;
-import com.google.search.now.wire.feed.ContentIdProto.ContentId;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-/** {@link FeatureDriver} for content. */
-public class ContentDriver extends LeafFeatureDriver
-    implements LoggingListener, ViewElementActionHandler {
-
-  private static final String TAG = "ContentDriver";
-
-  private final BasicLoggingApi basicLoggingApi;
-  private final List<PietSharedState> pietSharedStates;
-  private final Frame frame;
-  private final StreamActionApi streamActionApi;
-  private final FeedActionPayload swipeAction;
-  private final String contentId;
-  private final StreamOfflineMonitor streamOfflineMonitor;
-  private final OfflineStatusConsumer offlineStatusConsumer;
-  private final String contentUrl;
-  private final ContentChangedListener contentChangedListener;
-  private final ActionParser actionParser;
-  private final MainThreadRunner mainThreadRunner;
-  private final long viewDelayMs;
-  private final HashMap<Integer, CancelableTask> viewActionTaskMap = new HashMap<>();
-  private final ViewLoggingUpdater viewLoggingUpdater;
-  private final ResettableOneShotVisibilityLoggingListener loggingListener;
-
-  private StreamContentLoggingData contentLoggingData;
-  private boolean availableOffline;
-  /*@Nullable*/ private PietViewHolder viewHolder;
-
-  // TODO: Remove these suppressions when drivers have a proper lifecycle.
-  @SuppressWarnings({
-    "nullness:argument.type.incompatible",
-    "nullness:assignment.type.incompatible"
-  })
-  ContentDriver(
-      ActionApi actionApi,
-      ActionManager actionManager,
-      ActionParserFactory actionParserFactory,
-      BasicLoggingApi basicLoggingApi,
-      ModelFeature contentFeatureModel,
-      ModelProvider modelProvider,
-      int position,
-      FeedActionPayload swipeAction,
-      ClusterPendingDismissHelper clusterPendingDismissHelper,
-      StreamOfflineMonitor streamOfflineMonitor,
-      ContentChangedListener contentChangedListener,
-      ContextMenuManager contextMenuManager,
-      MainThreadRunner mainThreadRunner,
-      Configuration configuration,
-      ViewLoggingUpdater viewLoggingUpdater,
-      TooltipApi tooltipApi) {
-    this.mainThreadRunner = mainThreadRunner;
-    viewDelayMs =
-        configuration.getValueOrDefault(
-            ConfigKey.VIEW_MIN_TIME_MS, Constants.VIEW_MIN_TIME_MS_DEFAULT);
-    Content content = contentFeatureModel.getStreamFeature().getContent();
-
-    PietContent pietContent = getPietContent(content);
-    this.basicLoggingApi = basicLoggingApi;
-    frame = pietContent.getFrame();
-    pietSharedStates = getPietSharedStates(pietContent, modelProvider, basicLoggingApi);
-    contentId = contentFeatureModel.getStreamFeature().getContentId();
-    RepresentationData representationData = content.getRepresentationData();
-    contentUrl = representationData.getUri();
-    availableOffline = streamOfflineMonitor.isAvailableOffline(contentUrl);
-    offlineStatusConsumer = new OfflineStatusConsumer();
-    streamOfflineMonitor.addOfflineStatusConsumer(contentUrl, offlineStatusConsumer);
-    contentLoggingData =
-        new StreamContentLoggingData(
-            position, content.getBasicLoggingMetadata(), representationData, availableOffline);
-    actionParser =
-        actionParserFactory.build(
-            () ->
-                ContentMetadata.maybeCreateContentMetadata(
-                    content.getOfflineMetadata(), representationData));
-    streamActionApi =
-        createStreamActionApi(
-            actionApi,
-            actionParser,
-            actionManager,
-            basicLoggingApi,
-            () -> contentLoggingData,
-            modelProvider.getSessionId(),
-            contextMenuManager,
-            clusterPendingDismissHelper,
-            this,
-            contentId,
-            tooltipApi);
-    this.swipeAction = swipeAction;
-    this.streamOfflineMonitor = streamOfflineMonitor;
-    this.contentChangedListener = contentChangedListener;
-    this.viewLoggingUpdater = viewLoggingUpdater;
-    loggingListener = new ResettableOneShotVisibilityLoggingListener(this);
-    viewLoggingUpdater.registerObserver(loggingListener);
-  }
-
-  @Override
-  public void onDestroy() {
-    streamOfflineMonitor.removeOfflineStatusConsumer(contentUrl, offlineStatusConsumer);
-    removeAllPendingTasks();
-    viewLoggingUpdater.unregisterObserver(loggingListener);
-  }
-
-  @Override
-  public LeafFeatureDriver getLeafFeatureDriver() {
-    return this;
-  }
-
-  private PietContent getPietContent(/*@UnderInitialization*/ ContentDriver this, Content content) {
-    checkState(
-        content.getType() == StreamStructureProto.Content.Type.PIET,
-        "Expected Piet type for feature");
-
-    checkState(
-        content.hasExtension(PietContent.pietContentExtension),
-        "Expected Piet content for feature");
-
-    return content.getExtension(PietContent.pietContentExtension);
-  }
-
-  private List<PietSharedState> getPietSharedStates(
-      /*@UnderInitialization*/ ContentDriver this,
-      PietContent pietContent,
-      ModelProvider modelProvider,
-      BasicLoggingApi basicLoggingApi) {
-    List<PietSharedState> sharedStates = new ArrayList<>();
-    for (ContentId contentId : pietContent.getPietSharedStatesList()) {
-      PietSharedState pietSharedState =
-          extractPietSharedState(contentId, modelProvider, basicLoggingApi);
-      if (pietSharedState == null) {
-        return new ArrayList<>();
-      }
-
-      sharedStates.add(pietSharedState);
-    }
-    return sharedStates;
-  }
-
-  /*@Nullable*/
-  private PietSharedState extractPietSharedState(
-      /*@UnderInitialization*/ ContentDriver this,
-      ContentId pietSharedStateId,
-      ModelProvider modelProvider,
-      BasicLoggingApi basicLoggingApi) {
-    StreamSharedState sharedState = modelProvider.getSharedState(pietSharedStateId);
-    if (sharedState != null) {
-      return sharedState.getPietSharedStateItem().getPietSharedState();
-    }
-
-    basicLoggingApi.onInternalError(InternalFeedError.NULL_SHARED_STATES);
-    Logger.e(
-        TAG,
-        "Shared state was null. Stylesheets and templates on PietSharedState "
-            + "will not be loaded.");
-    return null;
-  }
-
-  @Override
-  public void bind(FeedViewHolder viewHolder) {
-    if (!(viewHolder instanceof PietViewHolder)) {
-      throw new AssertionError();
-    }
-
-    this.viewHolder = (PietViewHolder) viewHolder;
-
-    ((PietViewHolder) viewHolder)
-        .bind(frame, pietSharedStates, streamActionApi, swipeAction, loggingListener, actionParser);
-  }
-
-  @Override
-  public void unbind() {
-    if (viewHolder == null) {
-      return;
-    }
-
-    viewHolder.unbind();
-    viewHolder = null;
-  }
-
-  @Override
-  public void maybeRebind() {
-    if (viewHolder == null) {
-      return;
-    }
-
-    // Unbinding clears the viewHolder, so storing to rebind.
-    PietViewHolder localViewHolder = viewHolder;
-    unbind();
-    bind(localViewHolder);
-    contentChangedListener.onContentChanged();
-  }
-
-  @Override
-  public int getItemViewType() {
-    return ViewHolderType.TYPE_CARD;
-  }
-
-  @Override
-  public long itemId() {
-    return hashCode();
-  }
-
-  @VisibleForTesting
-  boolean isBound() {
-    return viewHolder != null;
-  }
-
-  @Override
-  public String getContentId() {
-    return contentId;
-  }
-
-  @Override
-  public void onViewVisible() {
-    basicLoggingApi.onContentViewed(contentLoggingData);
-  }
-
-  @Override
-  public void onContentClicked() {
-    basicLoggingApi.onContentClicked(contentLoggingData);
-  }
-
-  @Override
-  public void onContentSwiped() {
-    basicLoggingApi.onContentSwiped(contentLoggingData);
-  }
-
-  @Override
-  public void onScrollStateChanged(int newScrollState) {
-    if (newScrollState != RecyclerView.SCROLL_STATE_IDLE) {
-      removeAllPendingTasks();
-    }
-  }
-
-  private void removeAllPendingTasks() {
-    for (CancelableTask cancellable : viewActionTaskMap.values()) {
-      cancellable.cancel();
-    }
-
-    viewActionTaskMap.clear();
-  }
-
-  private void removePendingViewActionTaskForElement(int elementType) {
-    CancelableTask cancelable = viewActionTaskMap.remove(elementType);
-    if (cancelable != null) {
-      cancelable.cancel();
-    }
-  }
-
-  @VisibleForTesting
-  StreamActionApi createStreamActionApi(
-      /*@UnknownInitialization*/ ContentDriver this,
-      ActionApi actionApi,
-      ActionParser actionParser,
-      ActionManager actionManager,
-      BasicLoggingApi basicLoggingApi,
-      Supplier<ContentLoggingData> contentLoggingData,
-      /*@Nullable*/ String sessionId,
-      ContextMenuManager contextMenuManager,
-      ClusterPendingDismissHelper clusterPendingDismissHelper,
-      ViewElementActionHandler handler,
-      String contentId,
-      TooltipApi tooltipApi) {
-    return new StreamActionApiImpl(
-        actionApi,
-        actionParser,
-        actionManager,
-        basicLoggingApi,
-        contentLoggingData,
-        contextMenuManager,
-        sessionId,
-        clusterPendingDismissHelper,
-        handler,
-        contentId,
-        tooltipApi);
-  }
-
-  @Override
-  public void onElementView(int elementType) {
-    removePendingViewActionTaskForElement(elementType);
-    CancelableTask cancelableTask =
-        mainThreadRunner.executeWithDelay(
-            TAG + elementType,
-            () -> basicLoggingApi.onVisualElementViewed(contentLoggingData, elementType),
-            viewDelayMs);
-    viewActionTaskMap.put(elementType, cancelableTask);
-  }
-
-  @Override
-  public void onElementHide(int elementType) {
-    removePendingViewActionTaskForElement(elementType);
-  }
-
-  private class OfflineStatusConsumer implements Consumer<Boolean> {
-
-    @Override
-    public void accept(Boolean offlineStatus) {
-      if (offlineStatus.equals(availableOffline)) {
-        return;
-      }
-
-      availableOffline = offlineStatus;
-      contentLoggingData = contentLoggingData.createWithOfflineStatus(offlineStatus);
-      maybeRebind();
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ContinuationDriver.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ContinuationDriver.java
deleted file mode 100644
index d840344..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ContinuationDriver.java
+++ /dev/null
@@ -1,327 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.drivers;
-
-import static com.google.android.libraries.feed.common.Validators.checkNotNull;
-import static com.google.android.libraries.feed.common.Validators.checkState;
-
-import android.content.Context;
-import android.support.annotation.VisibleForTesting;
-import android.view.View;
-import android.view.View.OnClickListener;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.config.Configuration.ConfigKey;
-import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
-import com.google.android.libraries.feed.api.host.logging.InternalFeedError;
-import com.google.android.libraries.feed.api.host.logging.SpinnerType;
-import com.google.android.libraries.feed.api.host.stream.SnackbarApi;
-import com.google.android.libraries.feed.api.internal.common.ThreadUtils;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelChild;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelChild.Type;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelCursor;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelError;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProvider;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelToken;
-import com.google.android.libraries.feed.api.internal.modelprovider.TokenCompleted;
-import com.google.android.libraries.feed.api.internal.modelprovider.TokenCompletedObserver;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.ContinuationViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.FeedViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.R;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.ViewHolderType;
-import com.google.android.libraries.feed.common.logging.Logger;
-import com.google.android.libraries.feed.common.time.Clock;
-import com.google.android.libraries.feed.sharedstream.logging.LoggingListener;
-import com.google.android.libraries.feed.sharedstream.logging.SpinnerLogger;
-import java.util.ArrayList;
-import java.util.List;
-
-/** {@link FeatureDriver} for the more button. */
-public class ContinuationDriver extends LeafFeatureDriver
-    implements OnClickListener, LoggingListener, TokenCompletedObserver {
-
-  private static final String TAG = "ContinuationDriver";
-  private final BasicLoggingApi basicLoggingApi;
-  private final Context context;
-  private final CursorChangedListener cursorChangedListener;
-  private final ModelChild modelChild;
-  private final ModelToken modelToken;
-  private final ModelProvider modelProvider;
-  private final int position;
-  private final SnackbarApi snackbarApi;
-  private final SpinnerLogger spinnerLogger;
-  private final ThreadUtils threadUtils;
-  private final boolean consumeSyntheticTokens;
-
-  private boolean showSpinner;
-  private boolean initialized;
-  private boolean viewLogged;
-  private boolean destroyed;
-  private boolean tokenHandled;
-  private int failureCount = 0;
-  @SpinnerType private int spinnerType = SpinnerType.INFINITE_FEED;
-  /*@Nullable*/ private ContinuationViewHolder continuationViewHolder;
-
-  ContinuationDriver(
-      BasicLoggingApi basicLoggingApi,
-      Clock clock,
-      Configuration configuration,
-      Context context,
-      CursorChangedListener cursorChangedListener,
-      ModelChild modelChild,
-      ModelProvider modelProvider,
-      int position,
-      SnackbarApi snackbarApi,
-      ThreadUtils threadUtils,
-      boolean restoring) {
-    this.basicLoggingApi = basicLoggingApi;
-    this.context = context;
-    this.cursorChangedListener = cursorChangedListener;
-    this.modelChild = modelChild;
-    this.modelProvider = modelProvider;
-    this.modelToken = modelChild.getModelToken();
-    this.position = position;
-    this.snackbarApi = snackbarApi;
-    this.spinnerLogger = createSpinnerLogger(basicLoggingApi, clock);
-    this.threadUtils = threadUtils;
-    this.showSpinner =
-        configuration.getValueOrDefault(ConfigKey.TRIGGER_IMMEDIATE_PAGINATION, false);
-    this.consumeSyntheticTokens =
-        configuration.getValueOrDefault(ConfigKey.CONSUME_SYNTHETIC_TOKENS, false)
-            || (restoring
-                && configuration.getValueOrDefault(
-                    ConfigKey.CONSUME_SYNTHETIC_TOKENS_WHILE_RESTORING, false));
-  }
-
-  public boolean hasTokenBeenHandled() {
-    return tokenHandled;
-  }
-
-  public void initialize() {
-    if (initialized) {
-      return;
-    }
-
-    initialized = true;
-    modelToken.registerObserver(this);
-    if (modelToken.isSynthetic() && consumeSyntheticTokens) {
-      Logger.d(TAG, "Handling synthetic token");
-      boolean tokenWillBeHandled = modelProvider.handleToken(modelToken);
-      if (tokenWillBeHandled) {
-        showSpinner = true;
-        spinnerType = SpinnerType.SYNTHETIC_TOKEN;
-        tokenHandled = true;
-      } else {
-        Logger.e(TAG, "Synthetic token was not handled");
-        basicLoggingApi.onInternalError(InternalFeedError.UNHANDLED_TOKEN);
-      }
-    }
-  }
-
-  @Override
-  public void onDestroy() {
-    destroyed = true;
-
-    if (initialized) {
-      modelToken.unregisterObserver(this);
-    }
-    // If the spinner was being shown, it will only be removed when the ContinuationDriver is
-    // destroyed. So onSpinnerShown should be logged then.
-    if (spinnerLogger.isSpinnerActive()) {
-      spinnerLogger.spinnerDestroyedWithoutCompleting();
-    }
-  }
-
-  // TODO: Instead of implementing an onClickListener, define a new interface with a method
-  // with no view argument.
-  @Override
-  public void onClick(View v) {
-    if (!isBound()) {
-      Logger.wtf(TAG, "Calling onClick before binding.");
-      return;
-    }
-    boolean tokenWillBeHandled = modelProvider.handleToken(modelToken);
-    if (tokenWillBeHandled) {
-      showSpinner = true;
-      spinnerLogger.spinnerStarted(SpinnerType.MORE_BUTTON);
-      checkNotNull(continuationViewHolder).setShowSpinner(true);
-      tokenHandled = true;
-    } else {
-      Logger.e(TAG, "Continuation token was not handled");
-      basicLoggingApi.onInternalError(InternalFeedError.UNHANDLED_TOKEN);
-      showErrorUi();
-    }
-  }
-
-  @Override
-  public void bind(FeedViewHolder viewHolder) {
-    checkState(initialized);
-    if (isBound()) {
-      Logger.wtf(TAG, "Rebinding.");
-    }
-    checkState(viewHolder instanceof ContinuationViewHolder);
-
-    continuationViewHolder = (ContinuationViewHolder) viewHolder;
-    continuationViewHolder.bind(
-        /* onClickListener= */ this, /* loggingListener= */ this, showSpinner);
-    if (showSpinner && !spinnerLogger.isSpinnerActive()) {
-      spinnerLogger.spinnerStarted(spinnerType);
-    }
-  }
-
-  @Override
-  public int getItemViewType() {
-    return ViewHolderType.TYPE_CONTINUATION;
-  }
-
-  @Override
-  public void unbind() {
-    if (continuationViewHolder == null) {
-      return;
-    }
-
-    continuationViewHolder.unbind();
-    continuationViewHolder = null;
-  }
-
-  @Override
-  public void maybeRebind() {
-    if (continuationViewHolder == null) {
-      return;
-    }
-
-    // Unbinding clears the viewHolder, so storing to rebind.
-    ContinuationViewHolder localViewHolder = continuationViewHolder;
-    unbind();
-    bind(localViewHolder);
-  }
-
-  @Override
-  public void onTokenCompleted(TokenCompleted tokenCompleted) {
-    threadUtils.checkMainThread();
-    if (destroyed) {
-      // Tokens are able to send onTokenCompleted even after unregistering.  This can happen due to
-      // thread switching.  This prevents tokens from being handled after the driver has been
-      // destroyed and should no longer be handled.
-      Logger.w(TAG, "Received onTokenCompleted after being destroyed.");
-      return;
-    }
-
-    // Spinner wouldn't be active if we are automatically consuming a synthetic token on restore.
-    if (spinnerLogger.isSpinnerActive()) {
-      spinnerLogger.spinnerFinished();
-    }
-
-    ModelCursor cursor = tokenCompleted.getCursor();
-    List<ModelChild> modelChildren = extractModelChildrenFromCursor(cursor);
-
-    // Display snackbar if there are no more cards. The snackbar should only be shown if the
-    // spinner is being shown. This ensures the snackbar is only shown in the instance of the Stream
-    // that triggered the pagination.
-    if (showSpinner
-        && (modelChildren.isEmpty()
-            || (modelChildren.size() == 1 && modelChildren.get(0).getType() == Type.TOKEN))) {
-      snackbarApi.show(
-          context.getResources().getString(R.string.snackbar_fetch_no_new_suggestions));
-    }
-
-    cursorChangedListener.onNewChildren(modelChild, modelChildren, modelToken.isSynthetic());
-  }
-
-  @Override
-  public void onError(ModelError modelError) {
-    basicLoggingApi.onTokenFailedToComplete(modelToken.isSynthetic(), ++failureCount);
-    showErrorUi();
-    spinnerLogger.spinnerFinished();
-  }
-
-  private void showErrorUi() {
-    showSpinner = false;
-
-    if (continuationViewHolder != null) {
-      continuationViewHolder.setShowSpinner(false);
-    }
-
-    snackbarApi.show(context.getString(R.string.snackbar_fetch_failed));
-  }
-
-  @Override
-  public void onViewVisible() {
-    // Do not log a view if the spinner is being shown.
-    if (viewLogged || showSpinner) {
-      return;
-    }
-
-    basicLoggingApi.onMoreButtonViewed(position);
-    viewLogged = true;
-  }
-
-  @Override
-  public void onContentClicked() {
-    basicLoggingApi.onMoreButtonClicked(position);
-  }
-
-  @Override
-  public void onContentSwiped() {}
-
-  // TODO: add similar view logging cancelation and time delay for the More button
-  @Override
-  public void onScrollStateChanged(int newScrollState) {}
-
-  private List<ModelChild> extractModelChildrenFromCursor(ModelCursor cursor) {
-    List<ModelChild> modelChildren = new ArrayList<>();
-    ModelChild child;
-    while ((child = cursor.getNextItem()) != null) {
-      if (child.getType() == Type.UNBOUND) {
-        Logger.e(TAG, "Found unbound child %s, ignoring it", child.getContentId());
-        continue;
-      } else if (child.getType() != Type.FEATURE && child.getType() != Type.TOKEN) {
-        Logger.wtf(TAG, "Received illegal child: %s from cursor.", child.getType());
-        continue;
-      }
-      modelChildren.add(child);
-    }
-
-    return modelChildren;
-  }
-
-  /** Interface for notifying parents of new model children from a token. */
-  public interface CursorChangedListener {
-
-    /**
-     * Called to inform parent of new model children.
-     *
-     * @param modelChild the {@link ModelChild} representing the token that was processed.
-     * @param modelChildren the list of new {@link ModelChild} from the token.
-     * @param wasSynthetic whether the token was synthetic.
-     */
-    void onNewChildren(ModelChild modelChild, List<ModelChild> modelChildren, boolean wasSynthetic);
-  }
-
-  @VisibleForTesting
-  boolean isBound() {
-    return continuationViewHolder != null;
-  }
-
-  @VisibleForTesting
-  SpinnerLogger createSpinnerLogger(
-      /*@UnderInitialization*/ ContinuationDriver this, BasicLoggingApi basicLoggingApi, Clock clock) {
-    return new SpinnerLogger(basicLoggingApi, clock);
-  }
-
-  @Override
-  public String getContentId() {
-    return modelToken.getStreamToken().getContentId();
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/FeatureDriver.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/FeatureDriver.java
deleted file mode 100644
index c23fd55..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/FeatureDriver.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.drivers;
-
-
-/**
- * A FeatureDriver is an object which can generate a {@link LeafFeatureDriver} from a {@link
- * com.google.android.libraries.feed.api.internal.modelprovider.ModelFeature}.
- */
-public interface FeatureDriver {
-
-  void onDestroy();
-
-  /*@Nullable*/
-  LeafFeatureDriver getLeafFeatureDriver();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/HeaderDriver.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/HeaderDriver.java
deleted file mode 100644
index b0d7ac4..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/HeaderDriver.java
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.drivers;
-
-import static com.google.android.libraries.feed.common.Validators.checkState;
-
-import android.support.annotation.VisibleForTesting;
-import com.google.android.libraries.feed.api.client.stream.Header;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.FeedViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.HeaderViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.SwipeNotifier;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.ViewHolderType;
-import com.google.android.libraries.feed.common.logging.Logger;
-
-/** {@link FeatureDriver} for headers. */
-public class HeaderDriver extends LeafFeatureDriver {
-
-  private static final String TAG = "HeaderDriver";
-
-  private final Header header;
-  private final SwipeNotifier swipeNotifier;
-  /*@Nullable*/ private HeaderViewHolder headerViewHolder;
-
-  public HeaderDriver(Header header, SwipeNotifier swipeNotifier) {
-    this.header = header;
-    this.swipeNotifier = swipeNotifier;
-  }
-
-  @Override
-  public void bind(FeedViewHolder viewHolder) {
-    if (isBound()) {
-      if (viewHolder == this.headerViewHolder) {
-        Logger.e(TAG, "Being rebound to the previously bound viewholder");
-        return;
-      }
-      unbind();
-    }
-
-    checkState(viewHolder instanceof HeaderViewHolder);
-    headerViewHolder = (HeaderViewHolder) viewHolder;
-    headerViewHolder.bind(header, swipeNotifier);
-  }
-
-  @Override
-  public void unbind() {
-    if (headerViewHolder == null) {
-      return;
-    }
-
-    headerViewHolder.unbind();
-    headerViewHolder = null;
-  }
-
-  @Override
-  public void maybeRebind() {
-    if (headerViewHolder == null) {
-      return;
-    }
-
-    // Unbinding clears the viewHolder, so storing to rebind.
-    HeaderViewHolder localViewHolder = headerViewHolder;
-    unbind();
-    bind(localViewHolder);
-  }
-
-  @Override
-  public int getItemViewType() {
-    return ViewHolderType.TYPE_HEADER;
-  }
-
-  @Override
-  public void onDestroy() {}
-
-  public Header getHeader() {
-    return header;
-  }
-
-  @VisibleForTesting
-  boolean isBound() {
-    return headerViewHolder != null;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/LeafFeatureDriver.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/LeafFeatureDriver.java
deleted file mode 100644
index 81f180b..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/LeafFeatureDriver.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.drivers;
-
-import com.google.android.libraries.feed.basicstream.internal.viewholders.FeedViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.ViewHolderType;
-
-/** A {@link FeatureDriver} that can bind to a {@link FeedViewHolder}. */
-public abstract class LeafFeatureDriver implements FeatureDriver {
-
-  @Override
-  public LeafFeatureDriver getLeafFeatureDriver() {
-    return this;
-  }
-
-  /** Bind to the given {@link FeedViewHolder}. */
-  public abstract void bind(FeedViewHolder viewHolder);
-
-  /**
-   * Returns a {@link ViewHolderType} that corresponds to the type of {@link FeedViewHolder} that
-   * can be bound to.
-   */
-  @ViewHolderType
-  public abstract int getItemViewType();
-
-  /** Returns an ID corresponding to this item, typically a hashcode. */
-  public long itemId() {
-    return hashCode();
-  }
-
-  /**
-   * Called when the {@link
-   * com.google.android.libraries.feed.basicstream.internal.viewholders.FeedViewHolder} is
-   * offscreen/unbound.
-   *
-   * <p>Note: {@link LeafFeatureDriver} instances should do work they need to to unbind themselves
-   * and their previously bound {@link FeedViewHolder}.
-   */
-  public abstract void unbind();
-
-  /**
-   * This will cause the FeatureHolder associated with the Driver to rebind (unbind followed by
-   * bind).
-   */
-  public abstract void maybeRebind();
-
-  /** Returns the contentId of the {@link LeafFeatureDriver} if it has one. */
-  /*@Nullable*/
-  public String getContentId() {
-    return null;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/NoContentDriver.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/NoContentDriver.java
deleted file mode 100644
index 4805633..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/NoContentDriver.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.drivers;
-
-import static com.google.android.libraries.feed.common.Validators.checkState;
-
-import android.support.annotation.VisibleForTesting;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.FeedViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.NoContentViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.ViewHolderType;
-import com.google.android.libraries.feed.common.logging.Logger;
-
-/** {@link FeatureDriver} for NoContent card. */
-public class NoContentDriver extends LeafFeatureDriver {
-  private static final String TAG = "NoContentDriver";
-  /*@Nullable*/ private NoContentViewHolder noContentViewHolder;
-
-  @Override
-  public void bind(FeedViewHolder viewHolder) {
-    if (isBound()) {
-      Logger.wtf(TAG, "Rebinding.");
-    }
-
-    checkState(viewHolder instanceof NoContentViewHolder);
-    noContentViewHolder = (NoContentViewHolder) viewHolder;
-    noContentViewHolder.bind();
-  }
-
-  @Override
-  public int getItemViewType() {
-    return ViewHolderType.TYPE_NO_CONTENT;
-  }
-
-  @Override
-  public void unbind() {
-    if (noContentViewHolder == null) {
-      return;
-    }
-
-    noContentViewHolder.unbind();
-    noContentViewHolder = null;
-  }
-
-  @Override
-  public void maybeRebind() {
-    if (noContentViewHolder == null) {
-      return;
-    }
-
-    // Unbinding clears the viewHolder, so storing to rebind.
-    NoContentViewHolder localViewHolder = noContentViewHolder;
-    unbind();
-    bind(localViewHolder);
-  }
-
-  @VisibleForTesting
-  boolean isBound() {
-    return noContentViewHolder != null;
-  }
-
-  @Override
-  public void onDestroy() {}
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/StreamDriver.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/StreamDriver.java
deleted file mode 100644
index 284051f..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/StreamDriver.java
+++ /dev/null
@@ -1,752 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.drivers;
-
-import static com.google.android.libraries.feed.common.Validators.checkNotNull;
-
-import android.content.Context;
-import android.support.annotation.VisibleForTesting;
-import com.google.android.libraries.feed.api.client.stream.Stream.ContentChangedListener;
-import com.google.android.libraries.feed.api.host.action.ActionApi;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
-import com.google.android.libraries.feed.api.host.logging.InternalFeedError;
-import com.google.android.libraries.feed.api.host.logging.ZeroStateShowReason;
-import com.google.android.libraries.feed.api.host.stream.SnackbarApi;
-import com.google.android.libraries.feed.api.host.stream.SnackbarCallbackApi;
-import com.google.android.libraries.feed.api.host.stream.TooltipApi;
-import com.google.android.libraries.feed.api.internal.actionmanager.ActionManager;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionParserFactory;
-import com.google.android.libraries.feed.api.internal.common.ThreadUtils;
-import com.google.android.libraries.feed.api.internal.knowncontent.FeedKnownContent;
-import com.google.android.libraries.feed.api.internal.modelprovider.FeatureChange;
-import com.google.android.libraries.feed.api.internal.modelprovider.FeatureChangeObserver;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelChild;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelChild.Type;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelCursor;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelFeature;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProvider;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProvider.State;
-import com.google.android.libraries.feed.basicstream.internal.drivers.ContinuationDriver.CursorChangedListener;
-import com.google.android.libraries.feed.basicstream.internal.pendingdismiss.PendingDismissHandler;
-import com.google.android.libraries.feed.basicstream.internal.scroll.BasicStreamScrollMonitor;
-import com.google.android.libraries.feed.basicstream.internal.scroll.BasicStreamScrollTracker;
-import com.google.android.libraries.feed.basicstream.internal.scroll.ScrollRestorer;
-import com.google.android.libraries.feed.basicstream.internal.viewloggingupdater.ViewLoggingUpdater;
-import com.google.android.libraries.feed.common.concurrent.MainThreadRunner;
-import com.google.android.libraries.feed.common.logging.Logger;
-import com.google.android.libraries.feed.common.time.Clock;
-import com.google.android.libraries.feed.sharedstream.contextmenumanager.ContextMenuManager;
-import com.google.android.libraries.feed.sharedstream.offlinemonitor.StreamOfflineMonitor;
-import com.google.android.libraries.feed.sharedstream.pendingdismiss.PendingDismissCallback;
-import com.google.android.libraries.feed.sharedstream.proto.UiRefreshReasonProto.UiRefreshReason;
-import com.google.android.libraries.feed.sharedstream.proto.UiRefreshReasonProto.UiRefreshReason.Reason;
-import com.google.android.libraries.feed.sharedstream.removetrackingfactory.StreamRemoveTrackingFactory;
-import com.google.android.libraries.feed.sharedstream.scroll.ScrollLogger;
-import com.google.android.libraries.feed.sharedstream.scroll.ScrollTracker;
-import com.google.search.now.ui.action.FeedActionProto.UndoAction;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/** Generates a list of {@link LeafFeatureDriver} instances for an entire stream. */
-public class StreamDriver
-    implements CursorChangedListener, FeatureChangeObserver, PendingDismissHandler {
-
-  private static final String TAG = "StreamDriver";
-  private final ActionApi actionApi;
-  private final ActionManager actionManager;
-  private final ActionParserFactory actionParserFactory;
-  private final ThreadUtils threadUtils;
-  private final ModelProvider modelProvider;
-  private final Map<ModelChild, FeatureDriver> modelChildFeatureDriverMap;
-  private final List<FeatureDriver> featureDrivers;
-  private final Clock clock;
-  private final Configuration configuration;
-  private final Context context;
-  private final SnackbarApi snackbarApi;
-  private final ContentChangedListener contentChangedListener;
-  private final ScrollRestorer scrollRestorer;
-  private final BasicLoggingApi basicLoggingApi;
-  private final StreamOfflineMonitor streamOfflineMonitor;
-  private final ContextMenuManager contextMenuManager;
-  private final boolean isInitialLoad;
-  private final MainThreadRunner mainThreadRunner;
-  private final ViewLoggingUpdater viewLoggingUpdater;
-  private final TooltipApi tooltipApi;
-  private final UiRefreshReason uiRefreshReason;
-  private final ScrollTracker scrollTracker;
-
-  private boolean restoring;
-  private boolean rootFeatureConsumed;
-  private boolean modelFeatureChangeObserverRegistered;
-  /*@Nullable*/ private StreamContentListener contentListener;
-
-  public StreamDriver(
-      ActionApi actionApi,
-      ActionManager actionManager,
-      ActionParserFactory actionParserFactory,
-      ModelProvider modelProvider,
-      ThreadUtils threadUtils,
-      Clock clock,
-      Configuration configuration,
-      Context context,
-      SnackbarApi snackbarApi,
-      ContentChangedListener contentChangedListener,
-      ScrollRestorer scrollRestorer,
-      BasicLoggingApi basicLoggingApi,
-      StreamOfflineMonitor streamOfflineMonitor,
-      FeedKnownContent feedKnownContent,
-      ContextMenuManager contextMenuManager,
-      boolean restoring,
-      boolean isInitialLoad,
-      MainThreadRunner mainThreadRunner,
-      ViewLoggingUpdater viewLoggingUpdater,
-      TooltipApi tooltipApi,
-      UiRefreshReason uiRefreshReason,
-      BasicStreamScrollMonitor scrollMonitor) {
-    this.actionApi = actionApi;
-    this.actionManager = actionManager;
-    this.actionParserFactory = actionParserFactory;
-    this.threadUtils = threadUtils;
-    this.modelProvider = modelProvider;
-    this.clock = clock;
-    this.context = context;
-    this.snackbarApi = snackbarApi;
-    this.contextMenuManager = contextMenuManager;
-    this.modelChildFeatureDriverMap = new HashMap<>();
-    this.featureDrivers = new ArrayList<>();
-    this.configuration = configuration;
-    this.contentChangedListener = contentChangedListener;
-    this.scrollRestorer = scrollRestorer;
-    this.basicLoggingApi = basicLoggingApi;
-    this.streamOfflineMonitor = streamOfflineMonitor;
-    this.restoring = restoring;
-    this.isInitialLoad = isInitialLoad;
-    this.mainThreadRunner = mainThreadRunner;
-    this.viewLoggingUpdater = viewLoggingUpdater;
-    this.tooltipApi = tooltipApi;
-    this.uiRefreshReason = uiRefreshReason;
-    scrollTracker =
-        new BasicStreamScrollTracker(
-            mainThreadRunner, new ScrollLogger(basicLoggingApi), clock, scrollMonitor);
-
-    modelProvider.enableRemoveTracking(
-        new StreamRemoveTrackingFactory(modelProvider, feedKnownContent));
-  }
-
-  /**
-   * Returns a the list of {@link LeafFeatureDriver} instances for the children generated from the
-   * given {@link ModelFeature}.
-   */
-  public List<LeafFeatureDriver> getLeafFeatureDrivers() {
-    if (modelProvider.getCurrentState() == State.READY && !rootFeatureConsumed) {
-      ChildCreationPayload childCreationPayload;
-      rootFeatureConsumed = true;
-      ModelFeature rootFeature = modelProvider.getRootFeature();
-      if (rootFeature != null) {
-        childCreationPayload = createAndInsertChildren(rootFeature, modelProvider);
-        rootFeature.registerObserver(this);
-        modelFeatureChangeObserverRegistered = true;
-        if (uiRefreshReason.getReason().equals(Reason.ZERO_STATE)) {
-          basicLoggingApi.onZeroStateRefreshCompleted(
-              childCreationPayload.contentCount, childCreationPayload.tokenCount);
-        }
-      } else {
-        basicLoggingApi.onInternalError(InternalFeedError.NO_ROOT_FEATURE);
-        Logger.w(TAG, "found null root feature loading Leaf Feature Drivers");
-        if (uiRefreshReason.getReason().equals(Reason.ZERO_STATE)) {
-          basicLoggingApi.onZeroStateRefreshCompleted(
-              /* newContentCount= */ 0, /* newTokenCount= */ 0);
-        }
-      }
-    }
-
-    if (!isInitialLoad) {
-      addNoContentCardOrZeroStateIfNecessary(ZeroStateShowReason.NO_CONTENT);
-    }
-
-    return buildLeafFeatureDrivers(featureDrivers);
-  }
-
-  public void maybeRestoreScroll() {
-    if (!restoring) {
-      return;
-    }
-
-    if (isLastDriverContinuationDriver()) {
-      ContinuationDriver continuationDriver =
-          (ContinuationDriver) featureDrivers.get(featureDrivers.size() - 1);
-      // If there is a synthetic token, we should only restore if it has not been handled yet.
-      if (continuationDriver.hasTokenBeenHandled()) {
-        return;
-      }
-    }
-
-    restoring = false;
-
-    scrollRestorer.maybeRestoreScroll();
-  }
-
-  private ChildCreationPayload createAndInsertChildren(
-      ModelFeature streamFeature, ModelProvider modelProvider) {
-    return createAndInsertChildren(streamFeature.getCursor(), modelProvider);
-  }
-
-  private ChildCreationPayload createAndInsertChildren(
-      ModelCursor streamCursor, ModelProvider modelProvider) {
-    return createAndInsertChildrenAtIndex(streamCursor, modelProvider, 0);
-  }
-
-  private ChildCreationPayload createAndInsertChildrenAtIndex(
-      ModelCursor streamCursor, ModelProvider modelProvider, int insertionIndex) {
-
-    Iterable<ModelChild> cursorIterable =
-        () ->
-            new Iterator<ModelChild>() {
-              /*@Nullable*/ private ModelChild next;
-
-              @Override
-              public boolean hasNext() {
-                next = streamCursor.getNextItem();
-                return next != null;
-              }
-
-              @Override
-              public ModelChild next() {
-                return checkNotNull(next);
-              }
-            };
-    return createAndInsertChildrenAtIndex(cursorIterable, modelProvider, insertionIndex);
-  }
-
-  private ChildCreationPayload createAndInsertChildrenAtIndex(
-      Iterable<ModelChild> modelChildren, ModelProvider modelProvider, int insertionIndex) {
-    List<FeatureDriver> newChildren = new ArrayList<>();
-
-    int tokenCount = 0;
-    int contentCount = 0;
-
-    for (ModelChild child : modelChildren) {
-      FeatureDriver featureDriverChild = createChild(child, modelProvider, insertionIndex);
-      if (featureDriverChild != null) {
-        if (child.getType() == Type.FEATURE) {
-          contentCount++;
-        } else if (child.getType() == Type.TOKEN) {
-          tokenCount++;
-        }
-        newChildren.add(featureDriverChild);
-        featureDrivers.add(insertionIndex, featureDriverChild);
-        modelChildFeatureDriverMap.put(child, featureDriverChild);
-        insertionIndex++;
-      }
-    }
-
-    return new ChildCreationPayload(newChildren, tokenCount, contentCount);
-  }
-
-  /*@Nullable*/
-  private FeatureDriver createChild(ModelChild child, ModelProvider modelProvider, int position) {
-    switch (child.getType()) {
-      case Type.FEATURE:
-        return createFeatureChild(child.getModelFeature(), position);
-      case Type.TOKEN:
-        ContinuationDriver continuationDriver =
-            createContinuationDriver(
-                basicLoggingApi,
-                clock,
-                configuration,
-                context,
-                child,
-                modelProvider,
-                position,
-                snackbarApi,
-                restoring);
-
-        // TODO: Look into moving initialize() into a more generic location. We don't
-        // really want work to be done in the constructor so we call an initialize() method to
-        // kick off any expensive work the driver may need to do.
-        continuationDriver.initialize();
-        return continuationDriver;
-      case Type.UNBOUND:
-        basicLoggingApi.onInternalError(InternalFeedError.TOP_LEVEL_UNBOUND_CHILD);
-        Logger.e(TAG, "Found unbound child %s, ignoring it", child.getContentId());
-        return null;
-      default:
-        Logger.wtf(TAG, "Received illegal child: %s from cursor.", child.getType());
-        return null;
-    }
-  }
-
-  private /*@Nullable*/ FeatureDriver createFeatureChild(ModelFeature modelFeature, int position) {
-    if (modelFeature.getStreamFeature().hasCard()) {
-      return createCardDriver(modelFeature, position);
-    } else if (modelFeature.getStreamFeature().hasCluster()) {
-      return createClusterDriver(modelFeature, position);
-    }
-
-    basicLoggingApi.onInternalError(InternalFeedError.TOP_LEVEL_INVALID_FEATURE_TYPE);
-    Logger.w(
-        TAG,
-        "Invalid StreamFeature Type, must be Card or Cluster but was %s",
-        modelFeature.getStreamFeature().getFeaturePayloadCase());
-    return null;
-  }
-
-  private List<LeafFeatureDriver> buildLeafFeatureDrivers(List<FeatureDriver> featureDrivers) {
-    List<LeafFeatureDriver> leafFeatureDrivers = new ArrayList<>();
-    List<FeatureDriver> removes = new ArrayList<>();
-    for (FeatureDriver featureDriver : featureDrivers) {
-      LeafFeatureDriver leafFeatureDriver = featureDriver.getLeafFeatureDriver();
-      if (leafFeatureDriver != null) {
-        leafFeatureDrivers.add(leafFeatureDriver);
-      } else {
-        basicLoggingApi.onInternalError(InternalFeedError.FAILED_TO_CREATE_LEAF);
-        removes.add(featureDriver);
-      }
-    }
-    for (FeatureDriver driver : removes) {
-      this.featureDrivers.remove(driver);
-      driver.onDestroy();
-    }
-
-    streamOfflineMonitor.requestOfflineStatusForNewContent();
-
-    return leafFeatureDrivers;
-  }
-
-  @Override
-  public void onChange(FeatureChange change) {
-    Logger.v(TAG, "Received change.");
-
-    List<ModelChild> removedChildren = change.getChildChanges().getRemovedChildren();
-
-    for (ModelChild removedChild : removedChildren) {
-      if (!(removedChild.getType() == Type.FEATURE || removedChild.getType() == Type.TOKEN)) {
-        Logger.e(
-            TAG, "Attempting to remove non-removable child of type: %s", removedChild.getType());
-        continue;
-      }
-
-      removeDriver(removedChild);
-    }
-
-    List<ModelChild> appendedChildren = change.getChildChanges().getAppendedChildren();
-
-    if (!appendedChildren.isEmpty()) {
-      int insertionIndex = featureDrivers.size();
-
-      notifyContentsAdded(
-          insertionIndex,
-          buildLeafFeatureDrivers(
-              createAndInsertChildrenAtIndex(appendedChildren, modelProvider, insertionIndex)
-                  .featureDrivers));
-    }
-
-    addNoContentCardOrZeroStateIfNecessary(ZeroStateShowReason.CONTENT_DISMISSED);
-  }
-
-  @Override
-  public void onNewChildren(
-      ModelChild modelChild, List<ModelChild> modelChildren, boolean wasSynthetic) {
-    int continuationIndex = removeDriver(modelChild);
-    if (continuationIndex < 0) {
-      Logger.wtf(TAG, "Received an onNewChildren for an unknown child.");
-      return;
-    }
-    ChildCreationPayload tokenPayload =
-        createAndInsertChildrenAtIndex(modelChildren, modelProvider, continuationIndex);
-
-    List<FeatureDriver> newChildren = tokenPayload.featureDrivers;
-
-    basicLoggingApi.onTokenCompleted(
-        wasSynthetic, tokenPayload.contentCount, tokenPayload.tokenCount);
-    notifyContentsAdded(continuationIndex, buildLeafFeatureDrivers(newChildren));
-    maybeRemoveNoContentOrZeroStateCard();
-    // Swap no content card with zero state if there are no more drivers.
-    if (newChildren.isEmpty()
-        && featureDrivers.size() == 1
-        && featureDrivers.get(0) instanceof NoContentDriver) {
-      showZeroState(ZeroStateShowReason.NO_CONTENT_FROM_CONTINUATION_TOKEN);
-    }
-
-    maybeRestoreScroll();
-  }
-
-  private void alwaysRemoveNoContentOrZeroStateCardIfPresent() {
-    if (featureDrivers.size() == 1
-        && ((featureDrivers.get(0) instanceof NoContentDriver)
-            || (featureDrivers.get(0) instanceof ZeroStateDriver))) {
-      featureDrivers.get(0).onDestroy();
-      featureDrivers.remove(0);
-      notifyContentRemoved(0);
-    }
-  }
-
-  private void maybeRemoveNoContentOrZeroStateCard() {
-    if (shouldRemoveNoContentCardOrZeroState()) {
-      featureDrivers.get(0).onDestroy();
-      featureDrivers.remove(0);
-      notifyContentRemoved(0);
-    }
-  }
-
-  public void onDestroy() {
-    for (FeatureDriver featureDriver : featureDrivers) {
-      featureDriver.onDestroy();
-    }
-    ModelFeature modelFeature = modelProvider.getRootFeature();
-    if (modelFeature != null && modelFeatureChangeObserverRegistered) {
-      modelFeature.unregisterObserver(this);
-      modelFeatureChangeObserverRegistered = false;
-    }
-    featureDrivers.clear();
-    modelChildFeatureDriverMap.clear();
-    scrollTracker.onUnbind();
-  }
-
-  public boolean hasContent() {
-    if (featureDrivers.isEmpty()) {
-      return false;
-    }
-    return !(featureDrivers.get(0) instanceof NoContentDriver)
-        && !(featureDrivers.get(0) instanceof ZeroStateDriver);
-  }
-
-  public boolean isZeroStateBeingShown() {
-    return !featureDrivers.isEmpty()
-        && featureDrivers.get(0) instanceof ZeroStateDriver
-        && !((ZeroStateDriver) featureDrivers.get(0)).isSpinnerShowing();
-  }
-
-  public void setModelProviderForZeroState(ModelProvider modelProvider) {
-    if (!isZeroStateBeingShown()) {
-      Logger.wtf(
-          TAG, "setModelProviderForZeroState should only be called when zero state is shown");
-      return;
-    }
-    ((ZeroStateDriver) featureDrivers.get(0)).setModelProvider(modelProvider);
-  }
-
-  private void addNoContentCardOrZeroStateIfNecessary(
-      @ZeroStateShowReason int zeroStateShowReason) {
-    LeafFeatureDriver leafFeatureDriver = null;
-    if (!restoring && featureDrivers.isEmpty()) {
-      leafFeatureDriver = createAndLogZeroState(zeroStateShowReason);
-    } else if (featureDrivers.size() == 1 && isLastDriverContinuationDriver()) {
-      leafFeatureDriver = createNoContentDriver();
-    }
-
-    if (leafFeatureDriver != null) {
-      featureDrivers.add(0, leafFeatureDriver);
-      notifyContentsAdded(0, Collections.singletonList(leafFeatureDriver));
-    }
-  }
-
-  private boolean shouldRemoveNoContentCardOrZeroState() {
-    if (featureDrivers.isEmpty()) {
-      return false;
-    }
-
-    if (!(featureDrivers.get(0) instanceof NoContentDriver)
-        && !(featureDrivers.get(0) instanceof ZeroStateDriver)) {
-      return false;
-    }
-
-    return featureDrivers.size() > 2
-        || (featureDrivers.size() == 2 && !isLastDriverContinuationDriver());
-  }
-
-  private boolean isLastDriverContinuationDriver() {
-    return !featureDrivers.isEmpty()
-        && featureDrivers.get(featureDrivers.size() - 1) instanceof ContinuationDriver;
-  }
-
-  /**
-   * Removes the {@link FeatureDriver} represented by the {@link ModelChild} from all collections
-   * containing it and updates any listening instances of {@link StreamContentListener} of the
-   * removal.
-   *
-   * <p>Returns the index at which the {@link FeatureDriver} was removed, or -1 if it was not found.
-   */
-  private int removeDriver(ModelChild modelChild) {
-    FeatureDriver featureDriver = modelChildFeatureDriverMap.get(modelChild);
-    if (featureDriver == null) {
-      Logger.w(
-          TAG,
-          "Attempting to remove feature from ModelChild not in map, %s",
-          modelChild.getContentId());
-      return -1;
-    }
-
-    for (int i = 0; i < featureDrivers.size(); i++) {
-      if (featureDrivers.get(i) == featureDriver) {
-        featureDrivers.remove(i);
-        featureDriver.onDestroy();
-        modelChildFeatureDriverMap.remove(modelChild);
-        notifyContentRemoved(i);
-        return i;
-      }
-    }
-
-    Logger.wtf(TAG, "Attempting to remove feature contained on map but not on list of children.");
-    return -1;
-  }
-
-  private void notifyContentsAdded(int index, List<LeafFeatureDriver> leafFeatureDrivers) {
-    if (contentListener != null) {
-      contentListener.notifyContentsAdded(index, leafFeatureDrivers);
-    }
-  }
-
-  private void notifyContentRemoved(int index) {
-    if (contentListener != null) {
-      contentListener.notifyContentRemoved(index);
-    }
-  }
-
-  private void notifyContentsCleared() {
-    if (contentListener != null) {
-      contentListener.notifyContentsCleared();
-    }
-  }
-
-  /** Dismisses all content and immediately shows a spinner. */
-  public void showSpinner() {
-    ZeroStateDriver zeroStateDriver = createSpinner();
-    clearAllContent();
-    featureDrivers.add(zeroStateDriver);
-    notifyContentsAdded(0, Collections.singletonList(zeroStateDriver));
-  }
-
-  /** Dismisses all content and shows the zero-state. */
-  public void showZeroState(@ZeroStateShowReason int zeroStateShowReason) {
-    ZeroStateDriver zeroStateDriver = createAndLogZeroState(zeroStateShowReason);
-    clearAllContent();
-    featureDrivers.add(zeroStateDriver);
-    notifyContentsAdded(0, Collections.singletonList(zeroStateDriver));
-  }
-
-  private void clearAllContent() {
-    // TODO: Make sure to not notify listeners when driver is destroyed.
-    for (FeatureDriver featureDriver : featureDrivers) {
-      featureDriver.onDestroy();
-    }
-    featureDrivers.clear();
-    notifyContentsCleared();
-  }
-
-  private ZeroStateDriver createAndLogZeroState(@ZeroStateShowReason int zeroStateShowReason) {
-    basicLoggingApi.onZeroStateShown(zeroStateShowReason);
-
-    return createZeroStateDriver();
-  }
-
-  @VisibleForTesting
-  FeatureDriver createClusterDriver(ModelFeature modelFeature, int position) {
-    return new ClusterDriver(
-        actionApi,
-        actionManager,
-        actionParserFactory,
-        basicLoggingApi,
-        modelFeature,
-        modelProvider,
-        position,
-        this,
-        streamOfflineMonitor,
-        contentChangedListener,
-        contextMenuManager,
-        mainThreadRunner,
-        configuration,
-        viewLoggingUpdater,
-        tooltipApi);
-  }
-
-  @VisibleForTesting
-  FeatureDriver createCardDriver(ModelFeature modelFeature, int position) {
-    return new CardDriver(
-        actionApi,
-        actionManager,
-        actionParserFactory,
-        basicLoggingApi,
-        modelFeature,
-        modelProvider,
-        position,
-        (undoAction, pendingDismissCallback) -> {
-          Logger.wtf(TAG, "Dismissing a card without a cluster is not supported.");
-        },
-        streamOfflineMonitor,
-        contentChangedListener,
-        contextMenuManager,
-        mainThreadRunner,
-        configuration,
-        viewLoggingUpdater,
-        tooltipApi);
-  }
-
-  @VisibleForTesting
-  ContinuationDriver createContinuationDriver(
-      BasicLoggingApi basicLoggingApi,
-      Clock clock,
-      Configuration configuration,
-      Context context,
-      ModelChild modelChild,
-      ModelProvider modelProvider,
-      int position,
-      SnackbarApi snackbarApi,
-      boolean restoring) {
-    return new ContinuationDriver(
-        basicLoggingApi,
-        clock,
-        configuration,
-        context,
-        this,
-        modelChild,
-        modelProvider,
-        position,
-        snackbarApi,
-        threadUtils,
-        restoring);
-  }
-
-  @VisibleForTesting
-  NoContentDriver createNoContentDriver() {
-    return new NoContentDriver();
-  }
-
-  @VisibleForTesting
-  ZeroStateDriver createZeroStateDriver() {
-    return new ZeroStateDriver(
-        basicLoggingApi, clock, modelProvider, contentChangedListener, /* spinnerShown = */ false);
-  }
-
-  @VisibleForTesting
-  ZeroStateDriver createSpinner() {
-    return new ZeroStateDriver(
-        basicLoggingApi, clock, modelProvider, contentChangedListener, /* spinnerShown= */ true);
-  }
-
-  public void setStreamContentListener(/*@Nullable*/ StreamContentListener contentListener) {
-    this.contentListener = contentListener;
-  }
-
-  @Override
-  public void triggerPendingDismiss(
-      String contentId, UndoAction undoAction, PendingDismissCallback pendingDismissCallback) {
-
-    // Remove the feature driver to temporarily hide the card. Find the modelChild and index so the
-    // driver can be recreated and inserted if dismiss is undone.
-    ModelChild modelChild = getModelChildForContentId(contentId);
-    if (modelChild == null) {
-      Logger.wtf(TAG, "No model child found with that content id.");
-      pendingDismissCallback.onDismissCommitted();
-      return;
-    }
-
-    FeatureDriver featureDriver = modelChildFeatureDriverMap.get(modelChild);
-    if (featureDriver == null) {
-      Logger.wtf(TAG, "No FeatureDriver found for that model child.");
-      pendingDismissCallback.onDismissCommitted();
-      return;
-    }
-
-    int index = featureDrivers.indexOf(featureDriver);
-    if (index < 0) {
-      Logger.wtf(TAG, "No FeatureDriver found in the FeatureDriver list.");
-      pendingDismissCallback.onDismissCommitted();
-      return;
-    }
-
-    removeDriver(modelChild);
-    addNoContentCardOrZeroStateIfNecessary(ZeroStateShowReason.CONTENT_DISMISSED);
-    snackbarApi.show(
-        undoAction.getConfirmationLabel(),
-        undoAction.hasUndoLabel()
-            ? undoAction.getUndoLabel()
-            : context.getResources().getString(R.string.snackbar_default_action),
-        new SnackbarCallbackApi() {
-          @Override
-          public void onDismissNoAction() {
-            pendingDismissCallback.onDismissCommitted();
-          }
-
-          @Override
-          public void onDismissedWithAction() {
-            alwaysRemoveNoContentOrZeroStateCardIfPresent();
-            pendingDismissCallback.onDismissReverted();
-            createFeatureChildAndInsertAtIndex(modelChild, index);
-          }
-        });
-  }
-
-  private void createFeatureChildAndInsertAtIndex(ModelChild modelChild, int index) {
-    FeatureDriver featureDriver = createFeatureChild(modelChild.getModelFeature(), index);
-    if (featureDriver == null) {
-      Logger.wtf(TAG, "Could not recreate the FeatureDriver.");
-      return;
-    }
-    featureDrivers.add(index, featureDriver);
-    if (modelChild != null) {
-      modelChildFeatureDriverMap.put(modelChild, featureDriver);
-    }
-    LeafFeatureDriver leafFeatureDriver = featureDriver.getLeafFeatureDriver();
-    if (leafFeatureDriver == null) {
-      Logger.wtf(TAG, "No LeafFeatureDriver found.");
-      return;
-    }
-    notifyContentsAdded(
-        featureDrivers.indexOf(featureDriver), Collections.singletonList(leafFeatureDriver));
-  }
-
-  /*@Nullable*/
-  private ModelChild getModelChildForContentId(String contentId) {
-    for (ModelChild model : modelChildFeatureDriverMap.keySet()) {
-      if (model.getContentId().equals(contentId)) {
-        return model;
-      }
-    }
-    return null;
-  }
-
-  /** Contains the {@link FeatureDriver} instances that were created and metadata about them. */
-  private static class ChildCreationPayload {
-    private final List<FeatureDriver> featureDrivers;
-    private final int tokenCount;
-    private final int contentCount;
-
-    private ChildCreationPayload(
-        List<FeatureDriver> featureDrivers, int tokenCount, int contentCount) {
-      this.featureDrivers = featureDrivers;
-      this.tokenCount = tokenCount;
-      this.contentCount = contentCount;
-    }
-  }
-
-  /** Allows listening for changes in the contents held by a {@link StreamDriver} */
-  public interface StreamContentListener {
-
-    /** Called when the given content has been added at the given index of stream content. */
-    void notifyContentsAdded(int index, List<LeafFeatureDriver> newFeatureDrivers);
-
-    /** Called when the content at the given index of stream content has been removed. */
-    void notifyContentRemoved(int index);
-
-    /** Called when the content in the stream has been cleared. */
-    void notifyContentsCleared();
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ZeroStateDriver.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ZeroStateDriver.java
deleted file mode 100644
index a458bbe..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ZeroStateDriver.java
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.drivers;
-
-import static com.google.android.libraries.feed.common.Validators.checkState;
-
-import android.support.annotation.VisibleForTesting;
-import android.view.View;
-import android.view.View.OnClickListener;
-import com.google.android.libraries.feed.api.client.stream.Stream.ContentChangedListener;
-import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
-import com.google.android.libraries.feed.api.host.logging.RequestReason;
-import com.google.android.libraries.feed.api.host.logging.SpinnerType;
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelProvider;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.FeedViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.ViewHolderType;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.ZeroStateViewHolder;
-import com.google.android.libraries.feed.common.logging.Logger;
-import com.google.android.libraries.feed.common.time.Clock;
-import com.google.android.libraries.feed.sharedstream.logging.SpinnerLogger;
-import com.google.android.libraries.feed.sharedstream.proto.UiRefreshReasonProto.UiRefreshReason;
-import com.google.android.libraries.feed.sharedstream.proto.UiRefreshReasonProto.UiRefreshReason.Reason;
-import com.google.search.now.feed.client.StreamDataProto.UiContext;
-
-/** {@link FeatureDriver} for the zero state. */
-public class ZeroStateDriver extends LeafFeatureDriver implements OnClickListener {
-  private static final String TAG = "ZeroStateDriver";
-
-  private final ContentChangedListener contentChangedListener;
-  private final SpinnerLogger spinnerLogger;
-
-  private ModelProvider modelProvider;
-  private boolean spinnerShown;
-  /*@Nullable*/ private ZeroStateViewHolder zeroStateViewHolder;
-
-  ZeroStateDriver(
-      BasicLoggingApi basicLoggingApi,
-      Clock clock,
-      ModelProvider modelProvider,
-      ContentChangedListener contentChangedListener,
-      boolean spinnerShown) {
-    this.contentChangedListener = contentChangedListener;
-    this.modelProvider = modelProvider;
-    this.spinnerLogger = createSpinnerLogger(basicLoggingApi, clock);
-    this.spinnerShown = spinnerShown;
-  }
-
-  @Override
-  public void bind(FeedViewHolder viewHolder) {
-    if (isBound()) {
-      Logger.w(TAG, "Rebinding.");
-      if (viewHolder == zeroStateViewHolder) {
-        Logger.e(TAG, "Being rebound to the previously bound viewholder");
-        return;
-      }
-      unbind();
-    }
-    checkState(viewHolder instanceof ZeroStateViewHolder);
-
-    zeroStateViewHolder = (ZeroStateViewHolder) viewHolder;
-    zeroStateViewHolder.bind(this, spinnerShown);
-    // Only log that spinner is being shown if it has not been logged before.
-    if (spinnerShown && !spinnerLogger.isSpinnerActive()) {
-      spinnerLogger.spinnerStarted(SpinnerType.INITIAL_LOAD);
-    }
-  }
-
-  @Override
-  public int getItemViewType() {
-    return ViewHolderType.TYPE_ZERO_STATE;
-  }
-
-  @Override
-  public void unbind() {
-    if (zeroStateViewHolder == null) {
-      return;
-    }
-
-    zeroStateViewHolder.unbind();
-    zeroStateViewHolder = null;
-  }
-
-  @Override
-  public void maybeRebind() {
-    if (zeroStateViewHolder == null) {
-      return;
-    }
-
-    // Unbinding clears the viewHolder, so storing to rebind.
-    ZeroStateViewHolder localViewHolder = zeroStateViewHolder;
-    unbind();
-    bind(localViewHolder);
-  }
-
-  @Override
-  public void onClick(View v) {
-    if (zeroStateViewHolder == null) {
-      Logger.wtf(TAG, "Calling onClick before binding.");
-      return;
-    }
-
-    spinnerShown = true;
-    zeroStateViewHolder.showSpinner(spinnerShown);
-    contentChangedListener.onContentChanged();
-    UiContext uiContext =
-        UiContext.newBuilder()
-            .setExtension(
-                UiRefreshReason.uiRefreshReasonExtension,
-                UiRefreshReason.newBuilder().setReason(Reason.ZERO_STATE).build())
-            .build();
-    modelProvider.triggerRefresh(RequestReason.ZERO_STATE, uiContext);
-
-    spinnerLogger.spinnerStarted(SpinnerType.ZERO_STATE_REFRESH);
-  }
-
-  @Override
-  public void onDestroy() {
-    // If the spinner was being shown, it will only be removed when the ZeroStateDriver is
-    // destroyed. So spinner should be logged then.
-    if (spinnerLogger.isSpinnerActive()) {
-      spinnerLogger.spinnerFinished();
-    }
-  }
-
-  /**
-   * Updates the model provider.
-   *
-   * <p>This is a hacky way to keep the model providers in sync in the situation where switching
-   * stream drivers would result in the zero state flashing.
-   */
-  void setModelProvider(ModelProvider modelProvider) {
-    this.modelProvider = modelProvider;
-  }
-
-  @VisibleForTesting
-  boolean isBound() {
-    return zeroStateViewHolder != null;
-  }
-
-  @VisibleForTesting
-  SpinnerLogger createSpinnerLogger(
-      /*@UnderInitialization*/ ZeroStateDriver this, BasicLoggingApi basicLoggingApi, Clock clock) {
-    return new SpinnerLogger(basicLoggingApi, clock);
-  }
-
-  /** Returns whether the spinner is showing. */
-  boolean isSpinnerShowing() {
-    return spinnerShown;
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/testing/BUILD b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/testing/BUILD
deleted file mode 100644
index 334611f..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/testing/BUILD
+++ /dev/null
@@ -1,26 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "fake_feature_driver",
-    testonly = True,
-    srcs = ["FakeFeatureDriver.java"],
-    deps = [
-        ":fake_leaf_feature_driver",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/modelprovider",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers",
-        "//src/main/java/com/google/android/libraries/feed/testing/modelprovider",
-        "@com_google_code_findbugs_jsr305//jar",
-    ],
-)
-
-android_library(
-    name = "fake_leaf_feature_driver",
-    testonly = True,
-    srcs = ["FakeLeafFeatureDriver.java"],
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers",
-        "//src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/testing/FakeFeatureDriver.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/testing/FakeFeatureDriver.java
deleted file mode 100644
index 54646d4..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/testing/FakeFeatureDriver.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.drivers.testing;
-
-import com.google.android.libraries.feed.api.internal.modelprovider.ModelFeature;
-import com.google.android.libraries.feed.basicstream.internal.drivers.FeatureDriver;
-import com.google.android.libraries.feed.basicstream.internal.drivers.LeafFeatureDriver;
-import com.google.android.libraries.feed.testing.modelprovider.FakeModelFeature;
-
-/** Fake for {@link FeatureDriver}. */
-public class FakeFeatureDriver implements FeatureDriver {
-  /*@Nullable*/ private final LeafFeatureDriver leafFeatureDriver;
-  private final ModelFeature modelFeature;
-
-  private FakeFeatureDriver(
-      /*@Nullable*/ LeafFeatureDriver leafFeatureDriver, ModelFeature modelFeature) {
-    this.leafFeatureDriver = leafFeatureDriver;
-    this.modelFeature = modelFeature;
-  }
-
-  @Override
-  public void onDestroy() {}
-
-  @Override
-  /*@Nullable*/
-  public LeafFeatureDriver getLeafFeatureDriver() {
-    return leafFeatureDriver;
-  }
-
-  public ModelFeature getModelFeature() {
-    return modelFeature;
-  }
-
-  public static class Builder {
-    /*@Nullable*/
-    private LeafFeatureDriver leafFeatureDriver = new FakeLeafFeatureDriver.Builder().build();
-
-    private ModelFeature modelFeature = FakeModelFeature.newBuilder().build();
-
-    public Builder setLeafFeatureDriver(/*@Nullable*/ LeafFeatureDriver contentModel) {
-      this.leafFeatureDriver = contentModel;
-      return this;
-    }
-
-    public Builder setModelFeature(ModelFeature modelFeature) {
-      this.modelFeature = modelFeature;
-      return this;
-    }
-
-    public FakeFeatureDriver build() {
-      return new FakeFeatureDriver(leafFeatureDriver, modelFeature);
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/testing/FakeLeafFeatureDriver.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/testing/FakeLeafFeatureDriver.java
deleted file mode 100644
index 1ff345d..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/testing/FakeLeafFeatureDriver.java
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.drivers.testing;
-
-import com.google.android.libraries.feed.basicstream.internal.drivers.LeafFeatureDriver;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.FeedViewHolder;
-import com.google.android.libraries.feed.basicstream.internal.viewholders.ViewHolderType;
-
-/** Fake for {@link LeafFeatureDriver}. */
-public class FakeLeafFeatureDriver extends LeafFeatureDriver {
-
-  private final int itemViewType;
-
-  private FakeLeafFeatureDriver(int itemViewType) {
-    this.itemViewType = itemViewType;
-  }
-
-  @Override
-  public void bind(FeedViewHolder viewHolder) {}
-
-  @Override
-  public void unbind() {}
-
-  @Override
-  public void maybeRebind() {}
-
-  @Override
-  @ViewHolderType
-  public int getItemViewType() {
-    return itemViewType;
-  }
-
-  @Override
-  public long itemId() {
-    return hashCode();
-  }
-
-  @Override
-  public void onDestroy() {}
-
-  @Override
-  public LeafFeatureDriver getLeafFeatureDriver() {
-    return this;
-  }
-
-  public static class Builder {
-    @ViewHolderType private int itemViewType = ViewHolderType.TYPE_CARD;
-
-    public Builder setItemViewType(@ViewHolderType int viewType) {
-      itemViewType = viewType;
-      return this;
-    }
-
-    public LeafFeatureDriver build() {
-      return new FakeLeafFeatureDriver(itemViewType);
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/pendingdismiss/BUILD b/src/main/java/com/google/android/libraries/feed/basicstream/internal/pendingdismiss/BUILD
deleted file mode 100644
index 6368864..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/pendingdismiss/BUILD
+++ /dev/null
@@ -1,12 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "pendingdismiss",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/pendingdismiss",
-        "//src/main/proto/search/now/ui/action:feed_action_java_proto_lite",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/pendingdismiss/ClusterPendingDismissHelper.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/pendingdismiss/ClusterPendingDismissHelper.java
deleted file mode 100644
index 7be398f..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/pendingdismiss/ClusterPendingDismissHelper.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.pendingdismiss;
-
-import com.google.android.libraries.feed.sharedstream.pendingdismiss.PendingDismissCallback;
-import com.google.search.now.ui.action.FeedActionProto.UndoAction;
-
-/**
- * Interface that is passed through the stream hierarchy so during a dismissLocal we can find the
- * cluster FeatureDriver and pass that to the StreamDriver to handle a pending dismissLocal.
- */
-public interface ClusterPendingDismissHelper {
-
-  /**
-   * Triggers the temporary removal of the content with snackbar. Content will either come back or
-   * be fully removed based on the interactions with the snackbar.
-   *
-   * @param undoAction - Information for the rendering of the snackbar.
-   * @param pendingDismissCallback - Callbacks to call once content has been committed or reversed.
-   */
-  void triggerPendingDismissForCluster(
-      UndoAction undoAction, PendingDismissCallback pendingDismissCallback);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/pendingdismiss/PendingDismissHandler.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/pendingdismiss/PendingDismissHandler.java
deleted file mode 100644
index 58ed075..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/pendingdismiss/PendingDismissHandler.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.pendingdismiss;
-
-import com.google.android.libraries.feed.sharedstream.pendingdismiss.PendingDismissCallback;
-import com.google.search.now.ui.action.FeedActionProto.UndoAction;
-
-/** Interface that handles dismissing a card with an undo option. */
-public interface PendingDismissHandler {
-
-  /**
-   * Triggers the temporary removal of the content with snackbar. Content will either come back or
-   * be fully removed based on the interactions with the snackbar.
-   *
-   * @param contentId - The content that should be temporary hidden until the dismiss is committed.
-   * @param undoAction - Information for the rendering of the snackbar.
-   * @param pendingDismissCallback - Callbacks to call once content has been committed or reversed.
-   */
-  void triggerPendingDismiss(
-      String contentId, UndoAction undoAction, PendingDismissCallback pendingDismissCallback);
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/BUILD b/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/BUILD
deleted file mode 100644
index 69155eb..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/BUILD
+++ /dev/null
@@ -1,21 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "scroll",
-    srcs = glob(["*.java"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/host/config",
-        "//src/main/java/com/google/android/libraries/feed/api/host/logging",
-        "//src/main/java/com/google/android/libraries/feed/common",
-        "//src/main/java/com/google/android/libraries/feed/common/concurrent",
-        "//src/main/java/com/google/android/libraries/feed/common/logging",
-        "//src/main/java/com/google/android/libraries/feed/common/time",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/publicapi/scroll",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/scroll",
-        "//src/main/proto/com/google/android/libraries/feed/sharedstream/proto:scroll_state_java_proto_lite",
-        "@com_google_code_findbugs_jsr305//jar",
-        "@maven//:com_android_support_recyclerview_v7",
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/BasicStreamScrollMonitor.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/BasicStreamScrollMonitor.java
deleted file mode 100644
index 9829c21..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/BasicStreamScrollMonitor.java
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.scroll;
-
-import android.support.v7.widget.RecyclerView;
-import com.google.android.libraries.feed.common.time.Clock;
-import com.google.android.libraries.feed.sharedstream.publicapi.scroll.ScrollObservable;
-import com.google.android.libraries.feed.sharedstream.publicapi.scroll.ScrollObserver;
-import java.util.Collections;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Monitors and dispatches scroll events to the registered listeners.
- *
- * <p>Note: This is intentionally unscoped, because we want features to be able to manage their
- * scroll locally, instead of having a singleton ScrollMonitor.
- */
-public class BasicStreamScrollMonitor extends RecyclerView.OnScrollListener
-    implements ScrollObservable {
-
-  private final Set<ScrollObserver> scrollObservers;
-  private final Clock clock;
-
-  private int currentScrollState = RecyclerView.SCROLL_STATE_IDLE;
-
-  public BasicStreamScrollMonitor(Clock clock) {
-    this.clock = clock;
-    scrollObservers = Collections.newSetFromMap(new ConcurrentHashMap<>());
-  }
-
-  @Override
-  public void addScrollObserver(ScrollObserver scrollObserver) {
-    scrollObservers.add(scrollObserver);
-  }
-
-  @Override
-  public void removeScrollObserver(ScrollObserver scrollObserver) {
-    scrollObservers.remove(scrollObserver);
-  }
-
-  @Override
-  public int getCurrentScrollState() {
-    return currentScrollState;
-  }
-
-  public int getObserverCount() {
-    return scrollObservers.size();
-  }
-
-  /**
-   * Notify the monitor of a scroll state change event that should be dispatched to the observers.
-   */
-  @Override
-  public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
-    currentScrollState = newState;
-    for (ScrollObserver observer : scrollObservers) {
-      observer.onScrollStateChanged(recyclerView, "", newState, clock.currentTimeMillis());
-    }
-  }
-
-  /** Notify the monitor of a scroll event that should be dispatched to its observers. */
-  @Override
-  public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
-    for (ScrollObserver observer : scrollObservers) {
-      observer.onScroll(recyclerView, "", dx, dy);
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/BasicStreamScrollTracker.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/BasicStreamScrollTracker.java
deleted file mode 100644
index ba2a487..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/BasicStreamScrollTracker.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.scroll;
-
-import android.view.View;
-import com.google.android.libraries.feed.api.host.logging.ScrollType;
-import com.google.android.libraries.feed.common.concurrent.MainThreadRunner;
-import com.google.android.libraries.feed.common.time.Clock;
-import com.google.android.libraries.feed.sharedstream.publicapi.scroll.ScrollObservable;
-import com.google.android.libraries.feed.sharedstream.publicapi.scroll.ScrollObserver;
-import com.google.android.libraries.feed.sharedstream.scroll.ScrollLogger;
-import com.google.android.libraries.feed.sharedstream.scroll.ScrollTracker;
-
-/** A @link{ScrollTracker} used by BasicStream */
-public class BasicStreamScrollTracker extends ScrollTracker {
-  private final ScrollLogger scrollLogger;
-  private final ScrollObserver scrollObserver;
-  private final ScrollObservable scrollObservable;
-
-  public BasicStreamScrollTracker(
-      MainThreadRunner mainThreadRunner,
-      ScrollLogger scrollLogger,
-      Clock clock,
-      ScrollObservable scrollObservable) {
-    super(mainThreadRunner, clock);
-    this.scrollLogger = scrollLogger;
-    this.scrollObservable = scrollObservable;
-    this.scrollObserver = new BasicStreamScrollObserver();
-    scrollObservable.addScrollObserver(scrollObserver);
-  }
-
-  @Override
-  protected void onScrollEvent(int scrollAmount, long timestamp) {
-    scrollLogger.handleScroll(ScrollType.STREAM_SCROLL, scrollAmount);
-  }
-
-  @Override
-  public void onUnbind() {
-    super.onUnbind();
-    scrollObservable.removeScrollObserver(scrollObserver);
-  }
-
-  private class BasicStreamScrollObserver implements ScrollObserver {
-
-    @Override
-    public void onScrollStateChanged(View view, String featureId, int newState, long timestamp) {}
-
-    @Override
-    public void onScroll(View view, String featureId, int dx, int dy) {
-      trackScroll(dx, dy);
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/ScrollRestorer.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/ScrollRestorer.java
deleted file mode 100644
index 5c9bee6..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/ScrollRestorer.java
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.scroll;
-
-import static com.google.android.libraries.feed.common.Validators.checkNotNull;
-import static com.google.android.libraries.feed.common.Validators.checkState;
-
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.common.logging.Logger;
-import com.google.android.libraries.feed.sharedstream.proto.ScrollStateProto.ScrollState;
-import com.google.android.libraries.feed.sharedstream.scroll.ScrollListenerNotifier;
-import com.google.android.libraries.feed.sharedstream.scroll.ScrollRestoreHelper;
-
-/**
- * Class which is able to save a scroll position for a RecyclerView and restore to that scroll
- * position at a later time.
- */
-public class ScrollRestorer {
-
-  private static final String TAG = "ScrollRestorer";
-
-  private final Configuration configuration;
-  private final RecyclerView recyclerView;
-  private final ScrollListenerNotifier scrollListenerNotifier;
-  private final int scrollPosition;
-  private final int scrollOffset;
-
-  private boolean canRestore;
-
-  public ScrollRestorer(
-      Configuration configuration,
-      RecyclerView recyclerView,
-      ScrollListenerNotifier scrollListenerNotifier,
-      /*@Nullable*/ ScrollState scrollState) {
-    this.configuration = configuration;
-    this.recyclerView = recyclerView;
-    this.scrollListenerNotifier = scrollListenerNotifier;
-
-    if (scrollState != null) {
-      canRestore = true;
-      scrollPosition = scrollState.getPosition();
-      scrollOffset = scrollState.getOffset();
-    } else {
-      this.scrollPosition = 0;
-      this.scrollOffset = 0;
-    }
-  }
-
-  private ScrollRestorer(
-      Configuration configuration,
-      RecyclerView recyclerView,
-      ScrollListenerNotifier scrollListenerNotifier) {
-    canRestore = false;
-    this.configuration = configuration;
-    this.recyclerView = recyclerView;
-    this.scrollListenerNotifier = scrollListenerNotifier;
-    scrollPosition = 0;
-    scrollOffset = 0;
-  }
-
-  /**
-   * Creates a {@code StreamRestorer} which will never restore state. This can be used to fulfill
-   * {@code StreamRestorer} requests when no restore state is present.
-   */
-  public static ScrollRestorer nonRestoringRestorer(
-      Configuration configuration,
-      RecyclerView recyclerView,
-      ScrollListenerNotifier scrollListenerNotifier) {
-    return new ScrollRestorer(configuration, recyclerView, scrollListenerNotifier);
-  }
-
-  /**
-   * Disables the ability of the {@code ScrollRestorer} from restoring the scroll. This should be
-   * call if the previous scroll position is no longer valid. An example use case of this would be
-   * if the restoring session is no longer valid.
-   */
-  public void abandonRestoringScroll() {
-    canRestore = false;
-  }
-
-  /**
-   * Attempts to restore scroll position if possible. If the scroll position has already been
-   * restored, then this method will no-op.
-   */
-  public void maybeRestoreScroll() {
-    if (!canRestore) {
-      return;
-    }
-    Logger.d(TAG, "Restoring scroll");
-    getLayoutManager().scrollToPositionWithOffset(scrollPosition, scrollOffset);
-    scrollListenerNotifier.onProgrammaticScroll(recyclerView);
-    canRestore = false;
-  }
-
-  /**
-   * Returns a bundle which can be used for restoring scroll state on an activity restart.
-   *
-   * @param currentHeaderCount The amount of headers which appear before Stream content.
-   */
-  /*@Nullable*/
-  public ScrollState getScrollStateForScrollRestore(int currentHeaderCount) {
-    return ScrollRestoreHelper.getScrollStateForScrollRestore(
-        getLayoutManager(), configuration, currentHeaderCount);
-  }
-
-  private LinearLayoutManager getLayoutManager() {
-    checkState(
-        recyclerView.getLayoutManager() instanceof LinearLayoutManager,
-        "Scroll state can only be restored when using a LinearLayoutManager.");
-    return checkNotNull((LinearLayoutManager) recyclerView.getLayoutManager());
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/AndroidManifest.xml b/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/AndroidManifest.xml
deleted file mode 100644
index 67f9c3f..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/AndroidManifest.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018 The Feed Authors.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.google.android.libraries.feed.basicstream.internal.viewholders">
-</manifest>
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/BUILD b/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/BUILD
deleted file mode 100644
index 648d4e7..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/BUILD
+++ /dev/null
@@ -1,32 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2
-
-android_library(
-    name = "viewholders",
-    srcs = glob(["*.java"]),
-    manifest = "AndroidManifest.xml",
-    resource_files = glob(["res/**"]),
-    deps = [
-        "//src/main/java/com/google/android/libraries/feed/api/client/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/host/action",
-        "//src/main/java/com/google/android/libraries/feed/api/host/config",
-        "//src/main/java/com/google/android/libraries/feed/api/host/stream",
-        "//src/main/java/com/google/android/libraries/feed/api/internal/actionparser",
-        "//src/main/java/com/google/android/libraries/feed/common",
-        "//src/main/java/com/google/android/libraries/feed/common/logging",
-        "//src/main/java/com/google/android/libraries/feed/common/ui",
-        "//src/main/java/com/google/android/libraries/feed/piet",
-        "//src/main/java/com/google/android/libraries/feed/piet/host",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/logging",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/piet",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/publicapi/scroll",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/scroll",
-        "//src/main/java/com/google/android/libraries/feed/sharedstream/ui",  # buildcleaner: keep
-        "//src/main/proto/search/now/ui/action:feed_action_payload_java_proto_lite",
-        "//src/main/proto/search/now/ui/piet:piet_java_proto_lite",
-        "@com_google_code_findbugs_jsr305//jar",
-        "@maven//:com_android_support_recyclerview_v7",
-        "@maven//:com_android_support_support_annotations",  # buildcleaner: keep
-    ],
-)
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/ContinuationViewHolder.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/ContinuationViewHolder.java
deleted file mode 100644
index da159b0..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/ContinuationViewHolder.java
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.viewholders;
-
-import static com.google.android.libraries.feed.common.Validators.checkNotNull;
-
-import android.content.Context;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.widget.RecyclerView.LayoutParams;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.view.ViewGroup.MarginLayoutParams;
-import android.widget.FrameLayout;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.stream.CardConfiguration;
-import com.google.android.libraries.feed.common.ui.LayoutUtils;
-import com.google.android.libraries.feed.sharedstream.logging.LoggingListener;
-import com.google.android.libraries.feed.sharedstream.logging.VisibilityMonitor;
-
-/** {@link android.support.v7.widget.RecyclerView.ViewHolder} for the more button. */
-public class ContinuationViewHolder extends FeedViewHolder {
-
-  private final View actionButton;
-  private final View spinner;
-  private final VisibilityMonitor visibilityMonitor;
-  private final CardConfiguration cardConfiguration;
-  private final Context context;
-
-  public ContinuationViewHolder(
-      Configuration configuration,
-      Context context,
-      FrameLayout frameLayout,
-      CardConfiguration cardConfiguration) {
-    super(frameLayout);
-    View containerView =
-        LayoutInflater.from(context).inflate(R.layout.feed_more_button, frameLayout);
-    actionButton = checkNotNull(frameLayout.findViewById(R.id.action_button));
-    spinner = checkNotNull(frameLayout.findViewById(R.id.loading_spinner));
-    visibilityMonitor = createVisibilityMonitor(containerView, configuration);
-    this.cardConfiguration = cardConfiguration;
-    this.context = context;
-  }
-
-  public void bind(
-      OnClickListener onClickListener, LoggingListener loggingListener, boolean showSpinner) {
-    ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams();
-    if (layoutParams == null) {
-      layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
-      itemView.setLayoutParams(layoutParams);
-    } else if (!(layoutParams instanceof MarginLayoutParams)) {
-      layoutParams = new LayoutParams(layoutParams);
-      itemView.setLayoutParams(layoutParams);
-    }
-    LayoutUtils.setMarginsRelative(
-        (MarginLayoutParams) layoutParams,
-        cardConfiguration.getCardStartMargin(),
-        (int) context.getResources().getDimension(R.dimen.feed_more_button_container_top_margins),
-        cardConfiguration.getCardEndMargin(),
-        cardConfiguration.getCardBottomMargin());
-
-    actionButton.setOnClickListener(
-        v -> {
-          onClickListener.onClick(v);
-          loggingListener.onContentClicked();
-        });
-    visibilityMonitor.setListener(loggingListener);
-    setButtonSpinnerVisibility(showSpinner);
-  }
-
-  @Override
-  public void unbind() {
-    // Clear OnClickListener to null to allow for GC.
-    actionButton.setOnClickListener(null);
-    visibilityMonitor.setListener(null);
-
-    // Set clickable to false as setting OnClickListener to null sets clickable to true.
-    actionButton.setClickable(false);
-  }
-
-  public void setShowSpinner(boolean showSpinner) {
-    setButtonSpinnerVisibility(/* showSpinner= */ showSpinner);
-  }
-
-  private void setButtonSpinnerVisibility(boolean showSpinner) {
-    actionButton.setVisibility(showSpinner ? View.GONE : View.VISIBLE);
-    spinner.setVisibility(showSpinner ? View.VISIBLE : View.GONE);
-  }
-
-  @VisibleForTesting
-  VisibilityMonitor createVisibilityMonitor(
-      /*@UnderInitialization*/ ContinuationViewHolder this, View view, Configuration configuration) {
-    return new VisibilityMonitor(view, configuration);
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/FeedViewHolder.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/FeedViewHolder.java
deleted file mode 100644
index ebf82c0..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/FeedViewHolder.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.viewholders;
-
-import android.support.v7.widget.RecyclerView.ViewHolder;
-import android.view.View;
-
-/** {@link android.support.v7.widget.RecyclerView.ViewHolder} for the Feed. */
-public abstract class FeedViewHolder extends ViewHolder {
-
-  public FeedViewHolder(View view) {
-    super(view);
-  }
-
-  public abstract void unbind();
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/HeaderViewHolder.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/HeaderViewHolder.java
deleted file mode 100644
index bbf21b6..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/HeaderViewHolder.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.viewholders;
-
-
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.widget.FrameLayout;
-import com.google.android.libraries.feed.api.client.stream.Header;
-import com.google.android.libraries.feed.common.logging.Logger;
-
-/** {@link FeedViewHolder} for headers. */
-public class HeaderViewHolder extends FeedViewHolder implements SwipeableViewHolder {
-
-  private static final String TAG = "HeaderViewHolder";
-  private final FrameLayout frameLayout;
-
-  /*@Nullable*/ private Header header;
-  /*@Nullable*/ private SwipeNotifier swipeNotifier;
-
-  public HeaderViewHolder(FrameLayout itemView) {
-    super(itemView);
-    this.frameLayout = itemView;
-  }
-
-  public void bind(Header header, SwipeNotifier swipeNotifier) {
-    this.header = header;
-    this.swipeNotifier = swipeNotifier;
-    ViewParent parent = header.getView().getParent();
-    if (parent == frameLayout) {
-      return;
-    }
-    // If header was bound to another HeaderViewHolder but not unbound properly, remove it from its
-    // parent view.
-    if (parent != null) {
-      ((ViewGroup) parent).removeView(header.getView());
-    }
-    frameLayout.addView(header.getView());
-  }
-
-  @Override
-  public void unbind() {
-    frameLayout.removeAllViews();
-    this.header = null;
-    this.swipeNotifier = null;
-  }
-
-  @Override
-  public boolean canSwipe() {
-    if (header == null) {
-      Logger.w(TAG, "canSwipe should not be called before viewholder is bound.");
-
-      // Instead of crashing if viewholder is not bound, disable swiping behavior.
-      return false;
-    }
-    return header.isDismissible();
-  }
-
-  @Override
-  public void onSwiped() {
-    if (swipeNotifier == null) {
-      Logger.w(TAG, "onSwiped should not be called before viewholder is bound.");
-
-      // Instead of crashing if viewholder is not bound, disable swiping behavior.
-      return;
-    }
-
-    swipeNotifier.onSwiped();
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/NoContentViewHolder.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/NoContentViewHolder.java
deleted file mode 100644
index 15d77bc..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/NoContentViewHolder.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.viewholders;
-
-import android.content.Context;
-import android.support.v7.widget.RecyclerView.LayoutParams;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.MarginLayoutParams;
-import android.widget.FrameLayout;
-import com.google.android.libraries.feed.api.host.stream.CardConfiguration;
-import com.google.android.libraries.feed.common.ui.LayoutUtils;
-
-/** {@link android.support.v7.widget.RecyclerView.ViewHolder} for no content card. */
-public class NoContentViewHolder extends FeedViewHolder {
-  private final CardConfiguration cardConfiguration;
-  private final View view;
-
-  public NoContentViewHolder(
-      CardConfiguration cardConfiguration, Context context, FrameLayout frameLayout) {
-    super(frameLayout);
-    this.cardConfiguration = cardConfiguration;
-    view = LayoutInflater.from(context).inflate(R.layout.no_content, frameLayout);
-  }
-
-  public void bind() {
-    ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams();
-    if (layoutParams == null) {
-      layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
-      itemView.setLayoutParams(layoutParams);
-    } else if (!(layoutParams instanceof MarginLayoutParams)) {
-      layoutParams = new LayoutParams(layoutParams);
-      itemView.setLayoutParams(layoutParams);
-    }
-    LayoutUtils.setMarginsRelative(
-        (MarginLayoutParams) layoutParams,
-        cardConfiguration.getCardStartMargin(),
-        0,
-        cardConfiguration.getCardEndMargin(),
-        cardConfiguration.getCardBottomMargin());
-
-    view.setBackground(cardConfiguration.getCardBackground());
-  }
-
-  @Override
-  public void unbind() {}
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/PietViewHolder.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/PietViewHolder.java
deleted file mode 100644
index a614431..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/PietViewHolder.java
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright 2018 The Feed Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.libraries.feed.basicstream.internal.viewholders;
-
-import static com.google.android.libraries.feed.common.Validators.checkNotNull;
-
-import android.content.Context;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.widget.RecyclerView.LayoutParams;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.MarginLayoutParams;
-import android.widget.FrameLayout;
-import com.google.android.libraries.feed.api.host.action.StreamActionApi;
-import com.google.android.libraries.feed.api.host.config.Configuration;
-import com.google.android.libraries.feed.api.host.stream.CardConfiguration;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionParser;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionSource;
-import com.google.android.libraries.feed.api.internal.actionparser.ActionSourceConverter;
-import com.google.android.libraries.feed.common.logging.Logger;
-import com.google.android.libraries.feed.common.ui.LayoutUtils;
-import com.google.android.libraries.feed.piet.FrameAdapter;
-import com.google.android.libraries.feed.piet.PietManager;
-import com.google.android.libraries.feed.piet.host.ActionHandler.ActionType;
-import com.google.android.libraries.feed.sharedstream.logging.LoggingListener;
-import com.google.android.libraries.feed.sharedstream.logging.VisibilityMonitor;
-import com.google.android.libraries.feed.sharedstream.piet.PietEventLogger;
-import com.google.android.libraries.feed.sharedstream.publicapi.scroll.ScrollObservable;
-import com.google.android.libraries.feed.sharedstream.scroll.PietScrollObserver;
-import com.google.android.libraries.feed.sharedstream.scroll.ScrollListenerNotifier;
-import com.google.search.now.ui.action.FeedActionPayloadProto.FeedActionPayload;
-import com.google.search.now.ui.piet.PietProto.Frame;
-import com.google.search.now.ui.piet.PietProto.PietSharedState;
-import java.util.List;
-
-/**
- * {@link android.support.v7.widget.RecyclerView.ViewHolder} for {@link
- * com.google.search.now.ui.stream.StreamStructureProto.PietContent}.
- */
-public class PietViewHolder extends FeedViewHolder implements SwipeableViewHolder {
-
-  private static final String TAG = "PietViewHolder";
-  private final CardConfiguration cardConfiguration;
-  private final FrameLayout cardView;
-  private final ScrollObservable scrollObservable;
-  private final FrameAdapter frameAdapter;
-  private final VisibilityMonitor visibilityMonitor;
-  private final View viewport;
-  private boolean bound;
-
-  /*@Nullable*/ private ActionParser actionParser;
-  /*@Nullable*/ private LoggingListener loggingListener;
-  /*@Nullable*/ private StreamActionApi streamActionApi;
-  /*@Nullable*/ private FeedActionPayload swipeAction;
-  /*@Nullable*/ private PietViewActionScrollObserver scrollObserver;
-
-  public PietViewHolder(
-      CardConfiguration cardConfiguration,
-      FrameLayout cardView,
-      PietManager pietManager,
-      ScrollObservable scrollObservable,
-      View viewport,
-      Context context,
-      Configuration configuration,
-      PietEventLogger eventLogger) {
-    super(cardView);
-    this.cardConfiguration = cardConfiguration;
-    this.cardView = cardView;
-    this.scrollObservable = scrollObservable;
-    this.viewport = viewport;
-    cardView.setId(R.id.feed_content_card);
-    this.frameAdapter =
-        pietManager.createPietFrameAdapter(
-            () -> cardView,
-            (action, actionType, frame, view, logData) -> {
-              if (actionParser == null) {
-                Logger.wtf(TAG, "Action being performed while unbound.");
-                return;
-              }
-
-              if (actionType == ActionType.CLICK) {
-                getLoggingListener().onContentClicked();
-              }
-              getActionParser()
-                  .parseAction(
-                      action,
-                      getStreamActionApi(),
-                      view,
-                      logData,
-                      ActionSourceConverter.convertPietAction(actionType));
-            },
-            eventLogger::logEvents,
-            context);
-    visibilityMonitor = createVisibilityMonitor(cardView, configuration);
-    cardView.addView(frameAdapter.getFrameContainer());
-  }
-
-  public void bind(
-      Frame frame,
-      List<PietSharedState> pietSharedStates,
-      StreamActionApi streamActionApi,
-      FeedActionPayload swipeAction,
-      LoggingListener loggingListener,
-      ActionParser actionParser) {
-    if (bound) {
-      return;
-    }
-    visibilityMonitor.setListener(loggingListener);
-    this.loggingListener = loggingListener;
-    this.streamActionApi = streamActionApi;
-    this.swipeAction = swipeAction;
-    this.actionParser = actionParser;
-    scrollObserver =
-        new PietViewActionScrollObserver(frameAdapter, viewport, scrollObservable, loggingListener);
-    // Need to reset padding here.  Setting a background can affect padding so if we switch from
-    // a background which has padding to one that does not, then the padding needs to be removed.
-    cardView.setPadding(0, 0, 0, 0);
-
-    cardView.setBackground(cardConfiguration.getCardBackground());
-
-    ViewGroup.LayoutParams layoutParams = cardView.getLayoutParams();
-    if (layoutParams == null) {
-      layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
-      cardView.setLayoutParams(layoutParams);
-    } else if (!(layoutParams instanceof MarginLayoutParams)) {
-      layoutParams = new LayoutParams(layoutParams);
-      cardView.setLayoutParams(layoutParams);
-    }
-    LayoutUtils.setMarginsRelative(
-        (MarginLayoutParams) layoutParams,
-        cardConfiguration.getCardStartMargin(),
-        0,
-        cardConfiguration.getCardEndMargin(),
-        cardConfiguration.getCardBottomMargin());
-
-    frameAdapter.bindModel(
-        frame,
-        0, // TODO: set the frame width here
-        null,
-        pietSharedStates);
-    if (scrollObserver != null) {
-      scrollObservable.addScrollObserver(scrollObserver);
-    }
-
-    bound = true;
-  }
-
-  @Override
-  public void unbind() {
-    if (!bound) {
-      return;
-    }
-
-    frameAdapter.unbindModel();
-    actionParser = null;
-    loggingListener = null;
-    streamActionApi = null;
-    swipeAction = null;
-    visibilityMonitor.setListener(null);
-    if (scrollObserver != null) {
-      scrollObservable.removeScrollObserver(scrollObserver);
-      scrollObserver.uninstallFirstDrawTrigger();
-    }
-    bound = false;
-  }
-
-  public boolean canSwipe() {
-    return swipeAction != null && !swipeAction.equals(FeedActionPayload.getDefaultInstance());
-  }
-
-  @Override
-  public void onSwiped() {
-    if (swipeAction == null || actionParser == null) {
-      Logger.wtf(TAG, "Swipe performed on unbound ViewHolder.");
-      return;
-    }
-    actionParser.parseFeedActionPayload(
-        swipeAction, getStreamActionApi(), itemView, ActionSource.SWIPE);
-
-    if (loggingListener == null) {
-      Logger.wtf(TAG, "Logging listener is null. Swipe perfomred on unbound ViewHolder.");
-      return;
-    }
-    loggingListener.onContentSwiped();
-  }
-
-  @VisibleForTesting
-  VisibilityMonitor createVisibilityMonitor(
-      /*@UnderInitialization*/ PietViewHolder this, View view, Configuration configuration) {
-    return new VisibilityMonitor(view, configuration);
-  }
-
-  private LoggingListener getLoggingListener(/*@UnknownInitialization*/ PietViewHolder this) {
-    return checkNotNull(
-        loggingListener, "Logging listener can only be retrieved once view holder has been bound.");
-  }
-
-  private StreamActionApi getStreamActionApi(/*@UnknownInitialization*/ PietViewHolder this) {
-    return checkNotNull(
-        streamActionApi,
-        "Stream action api can only be retrieved once view holder has been bound.");
-  }
-
-  private ActionParser getActionParser(/*@UnknownInitialization*/ PietViewHolder this) {
-    return checkNotNull(
-        actionParser, "Action parser can only be retrieved once view holder has been bound");
-  }
-
-  static class PietViewActionScrollObserver extends PietScrollObserver {
-    private final LoggingListener loggingListener;
-
-    PietViewActionScrollObserver(
-        FrameAdapter frameAdapter,
-        View viewport,
-        ScrollObservable scrollObservable,
-        LoggingListener loggingListener) {
-      super(frameAdapter, viewport, scrollObservable);
-      this.loggingListener = loggingListener;
-    }
-
-    @Override
-    public void onScrollStateChanged(View view, String featureId, int newState, long timestamp) {
-      super.onScrollStateChanged(view, featureId, newState, timestamp);
-      loggingListener.onScrollStateChanged(
-          ScrollListenerNotifier.convertRecyclerViewScrollStateToListenerState(newState));
-    }
-  }
-}
diff --git a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/SwipeNotifier.java b/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/SwipeNotifier.java
deleted file mode 100644
index 3f5d2dd..0000000
--- a/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/Sw