diff --git a/res/layout/fingerprint_enroll_introduction.xml b/res/layout/fingerprint_enroll_introduction.xml
index 6d1c699..2c0e7de 100644
--- a/res/layout/fingerprint_enroll_introduction.xml
+++ b/res/layout/fingerprint_enroll_introduction.xml
@@ -15,10 +15,51 @@
     limitations under the License
 -->
 
-<com.android.setupwizardlib.GlifRecyclerLayout
+<com.android.setupwizardlib.GlifLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     style="?attr/fingerprint_layout_theme"
     android:id="@+id/setup_wizard_layout"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:entries="@xml/fingerprint_enroll_introduction_items" />
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        style="@style/SuwContentFrame"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <com.android.setupwizardlib.view.RichTextView
+            style="@style/SuwDescription.Glif"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/security_settings_fingerprint_enroll_introduction_message" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/fingerprint_cancel_button"
+                style="@style/SetupWizardButton.Negative"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/security_settings_fingerprint_enroll_introduction_cancel" />
+
+            <Space
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:layout_weight="1" />
+
+            <Button
+                android:id="@+id/fingerprint_next_button"
+                style="@style/SetupWizardButton.Positive"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/suw_next_button_label" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+</com.android.setupwizardlib.GlifLayout>
diff --git a/res/xml/fingerprint_enroll_introduction_items.xml b/res/xml/fingerprint_enroll_introduction_items.xml
deleted file mode 100644
index 28a3f6b..0000000
--- a/res/xml/fingerprint_enroll_introduction_items.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2016 The Android Open Source Project
-
-    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.
--->
-
-<ItemGroup xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <Item
-        android:enabled="false"
-        android:id="@+id/fingerprint_introduction_message"
-        android:layout="@layout/suw_items_description" />
-
-    <Item
-        android:id="@+id/next_button"
-        android:icon="@drawable/ic_fingerprint_list_icon"
-        android:title="@string/security_settings_fingerprint_enroll_introduction_continue" />
-
-    <Item
-        android:id="@+id/cancel_button"
-        android:icon="@drawable/ic_skip"
-        android:title="@string/security_settings_fingerprint_enroll_introduction_cancel" />
-
-</ItemGroup>
\ No newline at end of file
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java
index c1a0925..23755fd 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java
@@ -24,24 +24,21 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.Log;
+import android.view.View;
+import android.widget.Button;
 
 import com.android.internal.logging.MetricsProto.MetricsEvent;
-import com.android.internal.util.CharSequences;
 import com.android.settings.ChooseLockGeneric;
 import com.android.settings.ChooseLockSettingsHelper;
 import com.android.settings.R;
 import com.android.settingslib.HelpUtils;
-import com.android.setupwizardlib.GlifRecyclerLayout;
-import com.android.setupwizardlib.items.IItem;
-import com.android.setupwizardlib.items.Item;
-import com.android.setupwizardlib.items.RecyclerItemAdapter;
 import com.android.setupwizardlib.span.LinkSpan;
 
 /**
  * Onboarding activity for fingerprint enrollment.
  */
 public class FingerprintEnrollIntroduction extends FingerprintEnrollBase
-        implements RecyclerItemAdapter.OnItemSelectedListener, LinkSpan.OnClickListener {
+        implements View.OnClickListener, LinkSpan.OnClickListener {
 
     private static final String TAG = "FingerprintIntro";
 
@@ -57,12 +54,11 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.fingerprint_enroll_introduction);
         setHeaderText(R.string.security_settings_fingerprint_enroll_introduction_title);
-        final GlifRecyclerLayout layout = (GlifRecyclerLayout) getLayout();
+
+        final Button cancelButton = (Button) findViewById(R.id.fingerprint_cancel_button);
+        cancelButton.setOnClickListener(this);
+
         mUserManager = UserManager.get(this);
-        final RecyclerItemAdapter adapter = (RecyclerItemAdapter) layout.getAdapter();
-        adapter.setOnItemSelectedListener(this);
-        Item item = (Item) adapter.findItemById(R.id.fingerprint_introduction_message);
-        item.setTitle(getText(R.string.security_settings_fingerprint_enroll_introduction_message));
         updatePasswordQuality();
     }
 
@@ -73,6 +69,11 @@
     }
 
     @Override
+    protected Button getNextButton() {
+        return (Button) findViewById(R.id.fingerprint_next_button);
+    }
+
+    @Override
     protected void onNextButtonClick() {
         if (!mHasPassword) {
             // No fingerprints registered, launch into enrollment wizard.
@@ -142,14 +143,11 @@
     }
 
     @Override
-    public void onItemSelected(IItem item) {
-        switch (((Item) item).getId()) {
-            case R.id.next_button:
-                onNextButtonClick();
-                break;
-            case R.id.cancel_button:
-                onCancelButtonClick();
-                break;
+    public void onClick(View v) {
+        if (v.getId() == R.id.fingerprint_cancel_button) {
+            onCancelButtonClick();
+        } else {
+            super.onClick(v);
         }
     }
 
diff --git a/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java b/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java
index aac2057..cc8e823 100644
--- a/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java
@@ -19,15 +19,13 @@
 import android.content.Intent;
 import android.content.res.Resources;
 import android.os.UserHandle;
+import android.widget.Button;
 
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
 import com.android.settings.SetupChooseLockGeneric;
 import com.android.settings.SetupWizardUtils;
-import com.android.setupwizardlib.GlifRecyclerLayout;
-import com.android.setupwizardlib.items.Item;
-import com.android.setupwizardlib.items.RecyclerItemAdapter;
 
 public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntroduction {
 
@@ -53,15 +51,14 @@
 
     @Override
     protected void initViews() {
-        GlifRecyclerLayout layout = (GlifRecyclerLayout) getLayout();
-        final RecyclerItemAdapter adapter = (RecyclerItemAdapter) layout.getAdapter();
-        final Item nextItem = (Item) adapter.findItemById(R.id.next_button);
-        nextItem.setTitle(
-                getText(R.string.security_settings_fingerprint_enroll_introduction_continue_setup));
+        super.initViews();
+        Button nextButton = getNextButton();
+        nextButton.setText(
+                R.string.security_settings_fingerprint_enroll_introduction_continue_setup);
 
-        final Item cancelItem = (Item) adapter.findItemById(R.id.cancel_button);
-        cancelItem.setTitle(
-                getText(R.string.security_settings_fingerprint_enroll_introduction_cancel_setup));
+        final Button cancelButton = (Button) findViewById(R.id.fingerprint_cancel_button);
+        cancelButton.setText(
+                R.string.security_settings_fingerprint_enroll_introduction_cancel_setup);
     }
 
     @Override
