diff --git a/samples/Support7Demos/AndroidManifest.xml b/samples/Support7Demos/AndroidManifest.xml
index df9b2d1..e1a0f98 100644
--- a/samples/Support7Demos/AndroidManifest.xml
+++ b/samples/Support7Demos/AndroidManifest.xml
@@ -197,16 +197,6 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".app.ActionBarWithDrawerLayout"
-                android:label="@string/action_bar_with_navigation_drawer"
-                android:theme="@style/Theme.AppCompat"
-                >
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE"/>
-            </intent-filter>
-        </activity>
-
         <activity android:name=".app.ActionBarPreferences"
                   android:label="@string/action_bar_preferences"
                   android:theme="@style/Theme.AppCompat">
diff --git a/samples/Support7Demos/res/layout/action_bar_drawer_layout.xml b/samples/Support7Demos/res/layout/action_bar_drawer_layout.xml
deleted file mode 100644
index a68fdb4..0000000
--- a/samples/Support7Demos/res/layout/action_bar_drawer_layout.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 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.
--->
-
-<!--
-    A DrawerLayout is indended to be used as the top-level content view
-    using match_parent for both width and height to consume the full space available.
--->
-<android.support.v4.widget.DrawerLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:id="@+id/drawer_layout"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-    <!-- As the main content view, the view below consumes the entire
-         space available using match_parent in both dimensions. -->
-    <ScrollView
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:paddingLeft="16dp"
-            android:paddingRight="16dp"
-            android:scrollbarStyle="outsideOverlay">
-        <TextView android:id="@+id/content_text"
-                  android:layout_width="match_parent"
-                  android:layout_height="match_parent"
-                  android:text="@string/drawer_layout_summary"
-                  android:textAppearance="?android:attr/textAppearanceMedium"/>
-    </ScrollView>
-    <!-- android:layout_gravity="start" tells DrawerLayout to treat
-         this as a sliding drawer on the starting side, which is
-         left for left-to-right locales. The drawer is given a fixed
-         width in dp and extends the full height of the container. A
-         solid background is used for contrast with the content view. -->
-    <ListView android:id="@+id/start_drawer"
-              android:layout_width="300dp"
-              android:layout_height="match_parent"
-              android:layout_gravity="start"
-              android:background="#ff333333"/>
-</android.support.v4.widget.DrawerLayout>
diff --git a/samples/Support7Demos/res/values/strings.xml b/samples/Support7Demos/res/values/strings.xml
index 45bb459..5479a03 100644
--- a/samples/Support7Demos/res/values/strings.xml
+++ b/samples/Support7Demos/res/values/strings.xml
@@ -104,24 +104,6 @@
     <string name="action_bar_fragment_has_options_menu">Set has options menu to true</string>
     <string name="action_bar_fragment_menu_visibility">Set menu visibility to true</string>
 
-    <!-- actionbar w/ drawer layout -->
-    <string name="drawer_layout_support">Widget/Drawer layout</string>
-
-    <string name="drawer_layout_summary">This activity illustrates the use of sliding drawers. The
-        drawer may be pulled out from the starting edge, which is left on left-to-right locales,
-        with an edge swipe. If this demo is running on Ice Cream Sandwich or newer you may tap the
-        icon at the starting side of the action bar to open the drawer as well.
-    </string>
-
-    <!-- Title of the navigation drawer, used by accessibility to announce state changes. -->
-    <string name="drawer_title">Navigation</string>
-
-    <!-- Description of the icon that opens the navigation drawer, used by accessibility. -->
-    <string name="drawer_open">Open navigation drawer</string>
-
-    <!-- Description of the icon that closes the navigation drawer, used by accessibility. -->
-    <string name="drawer_close">Close navigation drawer</string>
-
     <string name="sliding_pane_layout_support">Widget/Sliding pane layout</string>
 
     <string name="sliding_pane_layout_summary">This activity illustrates the use of sliding panes.
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarWithDrawerLayout.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarWithDrawerLayout.java
deleted file mode 100644
index a45edc9..0000000
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarWithDrawerLayout.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-package com.example.android.supportv7.app;
-
-import com.example.android.supportv7.R;
-import com.example.android.supportv7.Shakespeare;
-
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.widget.DrawerLayout;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.ActionBarDrawerToggle;
-import android.support.v7.app.AppCompatActivity;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-
-public class ActionBarWithDrawerLayout extends AppCompatActivity {
-    private DrawerLayout mDrawerLayout;
-    private ListView mDrawer;
-    private TextView mContent;
-
-    private ActionBarHelper mActionBar;
-
-    private ActionBarDrawerToggle mDrawerToggle;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.action_bar_drawer_layout);
-        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
-        mDrawer = (ListView) findViewById(R.id.start_drawer);
-        mContent = (TextView) findViewById(R.id.content_text);
-
-        mDrawerLayout.setDrawerListener(new DemoDrawerListener());
-
-        // The drawer title must be set in order to announce state changes when
-        // accessibility is turned on. This is typically a simple description,
-        // e.g. "Navigation".
-        mDrawerLayout.setDrawerTitle(GravityCompat.START, getString(R.string.drawer_title));
-
-        mDrawer.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
-                Shakespeare.TITLES));
-        mDrawer.setOnItemClickListener(new DrawerItemClickListener());
-
-        mActionBar = createActionBarHelper();
-        mActionBar.init();
-
-        // ActionBarDrawerToggle provides convenient helpers for tying together the
-        // prescribed interactions between a top-level sliding drawer and the action bar.
-        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
-                R.string.drawer_open, R.string.drawer_close);
-    }
-
-    @Override
-    protected void onPostCreate(Bundle savedInstanceState) {
-        super.onPostCreate(savedInstanceState);
-
-        // Sync the toggle state after onRestoreInstanceState has occurred.
-        mDrawerToggle.syncState();
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        /*
-         * The action bar home/up action should open or close the drawer.
-         * mDrawerToggle will take care of this.
-         */
-        if (mDrawerToggle.onOptionsItemSelected(item)) {
-            return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-        mDrawerToggle.onConfigurationChanged(newConfig);
-    }
-
-    /**
-     * This list item click listener implements very simple view switching by changing
-     * the primary content text. The drawer is closed when a selection is made.
-     */
-    private class DrawerItemClickListener implements ListView.OnItemClickListener {
-        @Override
-        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-            mContent.setText(Shakespeare.DIALOGUE[position]);
-            mActionBar.setTitle(Shakespeare.TITLES[position]);
-            mDrawerLayout.closeDrawer(mDrawer);
-        }
-    }
-
-    /**
-     * A drawer listener can be used to respond to drawer events such as becoming
-     * fully opened or closed. You should always prefer to perform expensive operations
-     * such as drastic relayout when no animation is currently in progress, either before
-     * or after the drawer animates.
-     *
-     * When using ActionBarDrawerToggle, all DrawerLayout listener methods should be forwarded
-     * if the ActionBarDrawerToggle is not used as the DrawerLayout listener directly.
-     */
-    private class DemoDrawerListener implements DrawerLayout.DrawerListener {
-        @Override
-        public void onDrawerOpened(View drawerView) {
-            mDrawerToggle.onDrawerOpened(drawerView);
-            mActionBar.onDrawerOpened();
-        }
-
-        @Override
-        public void onDrawerClosed(View drawerView) {
-            mDrawerToggle.onDrawerClosed(drawerView);
-            mActionBar.onDrawerClosed();
-        }
-
-        @Override
-        public void onDrawerSlide(View drawerView, float slideOffset) {
-            mDrawerToggle.onDrawerSlide(drawerView, slideOffset);
-        }
-
-        @Override
-        public void onDrawerStateChanged(int newState) {
-            mDrawerToggle.onDrawerStateChanged(newState);
-        }
-    }
-
-    /**
-     * Create a compatible helper that will manipulate the action bar if available.
-     */
-    private ActionBarHelper createActionBarHelper() {
-        return new ActionBarHelper();
-    }
-
-    /**
-     * Action bar helper for use on ICS and newer devices.
-     */
-    private class ActionBarHelper {
-        private final ActionBar mActionBar;
-        private CharSequence mDrawerTitle;
-        private CharSequence mTitle;
-
-        ActionBarHelper() {
-            mActionBar = getSupportActionBar();
-        }
-
-        public void init() {
-            mActionBar.setDisplayHomeAsUpEnabled(true);
-            mActionBar.setDisplayShowHomeEnabled(false);
-            mTitle = mDrawerTitle = getTitle();
-        }
-
-        /**
-         * When the drawer is closed we restore the action bar state reflecting
-         * the specific contents in view.
-         */
-        public void onDrawerClosed() {
-            mActionBar.setTitle(mTitle);
-        }
-
-        /**
-         * When the drawer is open we set the action bar to a generic title.
-         * The action bar should only contain data relevant at the top level of
-         * the nav hierarchy represented by the drawer, as the rest of your content
-         * will be dimmed down and non-interactive.
-         */
-        public void onDrawerOpened() {
-            mActionBar.setTitle(mDrawerTitle);
-        }
-
-        public void setTitle(CharSequence title) {
-            mTitle = title;
-        }
-    }
-}
