diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
index ba6abc0..b2c45f4 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
@@ -228,7 +228,7 @@
         public Fragment createFragment(Object rowObj) {
             Row row = (Row) rowObj;
             if (row.getHeaderItem().getId() == HEADER_ID1) {
-                return new SampleFragment();
+                return new SampleRowsFragment();
             } else if (row.getHeaderItem().getId() == HEADER_ID2) {
                 return new SampleRowsFragment();
             } else if (row.getHeaderItem().getId() == HEADER_ID3) {
@@ -239,30 +239,30 @@
         }
     }
 
-    public static class PageFragmentAdapterImpl extends MainFragmentAdapter<SampleFragment> {
-
-        public PageFragmentAdapterImpl(SampleFragment fragment) {
-            super(fragment);
-            setScalingEnabled(true);
-        }
-
-        @Override
-        public void setEntranceTransitionState(boolean state) {
-            getFragment().setEntranceTransitionState(state);
-        }
-    }
-
     public static class SampleRowsFragment extends RowsFragment {
         final CardPresenter mCardPresenter = new CardPresenter();
         final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
 
-        public SampleRowsFragment() {
-            ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ListRowPresenter());
+        void loadFragmentData() {
+            ArrayObjectAdapter adapter = (ArrayObjectAdapter) getAdapter();
             for (int i = 0; i < 4; i++) {
                 ListRow row = new ListRow(new HeaderItem("Row " + i), createListRowAdapter(i));
                 adapter.add(row);
             }
+            if (getMainFragmentAdapter() != null) {
+                getMainFragmentAdapter().getFragmentHost().notifyDataReady(getMainFragmentAdapter());
+            }
+        }
+
+        public SampleRowsFragment() {
+            ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ListRowPresenter());
             setAdapter(adapter);
+            // simulates late data loading:
+            new Handler().postDelayed(new Runnable() {
+                public void run() {
+                    loadFragmentData();
+                }
+            }, 500);
 
             setOnItemViewClickedListener(new OnItemViewClickedListener() {
                 @Override
@@ -274,12 +274,12 @@
                     Intent intent;
                     Bundle bundle;
                     if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) {
-                        GuidedStepFragment.add(getFragmentManager(),
+                        GuidedStepFragment.add(getActivity().getFragmentManager(),
                                 new GuidedStepHalfScreenActivity.FirstStepFragment(),
                                 R.id.lb_guidedstep_host);
                         return;
                     } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) {
-                        GuidedStepFragment.add(getFragmentManager(),
+                        GuidedStepFragment.add(getActivity().getFragmentManager(),
                                 new GuidedStepActivity.FirstStepFragment(), R.id.lb_guidedstep_host);
                         return;
                     } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) {
@@ -339,6 +339,19 @@
         }
     }
 
+    public static class PageFragmentAdapterImpl extends MainFragmentAdapter<SampleFragment> {
+
+        public PageFragmentAdapterImpl(SampleFragment fragment) {
+            super(fragment);
+            setScalingEnabled(true);
+        }
+
+        @Override
+        public void setEntranceTransitionState(boolean state) {
+            getFragment().setEntranceTransitionState(state);
+        }
+    }
+
     public static class SampleFragment extends Fragment implements MainFragmentAdapterProvider {
 
         final PageFragmentAdapterImpl mMainFragmentAdapter = new PageFragmentAdapterImpl(this);
@@ -373,14 +386,10 @@
         }
 
         @Override
-        public void onStart() {
-            super.onStart();
-            mMainFragmentAdapter.getFragmentHost().notifyViewCreated(mMainFragmentAdapter);
-        }
-
-        @Override
         public void onViewCreated(View view, Bundle savedInstanceState) {
-            setEntranceTransitionState(mEntranceTransitionState);
+            // static layout has view and data ready immediately
+            mMainFragmentAdapter.getFragmentHost().notifyViewCreated(mMainFragmentAdapter);
+            mMainFragmentAdapter.getFragmentHost().notifyDataReady(mMainFragmentAdapter);
         }
 
         @Override
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java
index 58477d1..ecf6d48 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java
@@ -230,7 +230,7 @@
         public Fragment createFragment(Object rowObj) {
             Row row = (Row) rowObj;
             if (row.getHeaderItem().getId() == HEADER_ID1) {
-                return new SampleFragment();
+                return new SampleRowsSupportFragment();
             } else if (row.getHeaderItem().getId() == HEADER_ID2) {
                 return new SampleRowsSupportFragment();
             } else if (row.getHeaderItem().getId() == HEADER_ID3) {
@@ -241,30 +241,30 @@
         }
     }
 
-    public static class PageFragmentAdapterImpl extends MainFragmentAdapter<SampleFragment> {
-
-        public PageFragmentAdapterImpl(SampleFragment fragment) {
-            super(fragment);
-            setScalingEnabled(true);
-        }
-
-        @Override
-        public void setEntranceTransitionState(boolean state) {
-            getFragment().setEntranceTransitionState(state);
-        }
-    }
-
     public static class SampleRowsSupportFragment extends RowsSupportFragment {
         final CardPresenter mCardPresenter = new CardPresenter();
         final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
 
-        public SampleRowsSupportFragment() {
-            ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ListRowPresenter());
+        void loadFragmentData() {
+            ArrayObjectAdapter adapter = (ArrayObjectAdapter) getAdapter();
             for (int i = 0; i < 4; i++) {
                 ListRow row = new ListRow(new HeaderItem("Row " + i), createListRowAdapter(i));
                 adapter.add(row);
             }
+            if (getMainFragmentAdapter() != null) {
+                getMainFragmentAdapter().getFragmentHost().notifyDataReady(getMainFragmentAdapter());
+            }
+        }
+
+        public SampleRowsSupportFragment() {
+            ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ListRowPresenter());
             setAdapter(adapter);
+            // simulates late data loading:
+            new Handler().postDelayed(new Runnable() {
+                public void run() {
+                    loadFragmentData();
+                }
+            }, 500);
 
             setOnItemViewClickedListener(new OnItemViewClickedListener() {
                 @Override
@@ -276,12 +276,12 @@
                     Intent intent;
                     Bundle bundle;
                     if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) {
-                        GuidedStepSupportFragment.add(getFragmentManager(),
+                        GuidedStepSupportFragment.add(getActivity().getFragmentManager(),
                                 new GuidedStepSupportHalfScreenActivity.FirstStepFragment(),
                                 R.id.lb_guidedstep_host);
                         return;
                     } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) {
-                        GuidedStepSupportFragment.add(getFragmentManager(),
+                        GuidedStepSupportFragment.add(getActivity().getFragmentManager(),
                                 new GuidedStepSupportActivity.FirstStepFragment(), R.id.lb_guidedstep_host);
                         return;
                     } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) {
@@ -341,6 +341,19 @@
         }
     }
 
+    public static class PageFragmentAdapterImpl extends MainFragmentAdapter<SampleFragment> {
+
+        public PageFragmentAdapterImpl(SampleFragment fragment) {
+            super(fragment);
+            setScalingEnabled(true);
+        }
+
+        @Override
+        public void setEntranceTransitionState(boolean state) {
+            getFragment().setEntranceTransitionState(state);
+        }
+    }
+
     public static class SampleFragment extends Fragment implements MainFragmentAdapterProvider {
 
         final PageFragmentAdapterImpl mMainFragmentAdapter = new PageFragmentAdapterImpl(this);
@@ -375,14 +388,10 @@
         }
 
         @Override
-        public void onStart() {
-            super.onStart();
-            mMainFragmentAdapter.getFragmentHost().notifyViewCreated(mMainFragmentAdapter);
-        }
-
-        @Override
         public void onViewCreated(View view, Bundle savedInstanceState) {
-            setEntranceTransitionState(mEntranceTransitionState);
+            // static layout has view and data ready immediately
+            mMainFragmentAdapter.getFragmentHost().notifyViewCreated(mMainFragmentAdapter);
+            mMainFragmentAdapter.getFragmentHost().notifyDataReady(mMainFragmentAdapter);
         }
 
         @Override
