diff -r a9aa43c1c740 javafx-ui-controls/src/com/sun/javafx/scene/control/behavior/TabPaneBehavior.java
--- a/javafx-ui-controls/src/com/sun/javafx/scene/control/behavior/TabPaneBehavior.java	Tue Apr 10 14:35:07 2012 -0700
+++ b/javafx-ui-controls/src/com/sun/javafx/scene/control/behavior/TabPaneBehavior.java	Fri Apr 13 15:41:33 2012 -0700
@@ -34,6 +34,7 @@
 import javafx.scene.input.MouseEvent;
 
 import com.sun.javafx.scene.control.skin.TabPaneSkin;
+import javafx.scene.control.SingleSelectionModel;
 
 public class TabPaneBehavior extends BehaviorBase<TabPane> {
 
@@ -158,23 +159,33 @@
         }
     }
 
+    // Find a tab after the currently selected that is not disabled.
     public void selectNextTab() {
-        selectNextTab(getControl().getSelectionModel().getSelectedItem());
+        SingleSelectionModel<Tab> selectionModel = getControl().getSelectionModel();
+        int current = selectionModel.getSelectedIndex();
+        int index = current;
+        while (index < getControl().getTabs().size()) {
+            selectionModel.selectNext();
+            index++;
+            if (!selectionModel.getSelectedItem().isDisable()) {
+                return;
+            }
+        }
+        selectionModel.select(current);
     }
 
-    public void selectNextTab(Tab tab) {
-        TabPane tabPane = getControl();
-        tabPane.getSelectionModel().select(tab);
-        tabPane.getSelectionModel().selectNext();
-    }
-
-    public void selectPreviousTab() {
-        selectPreviousTab(getControl().getSelectionModel().getSelectedItem());
-    }
-
-    public void selectPreviousTab(Tab tab) {
-        TabPane tabPane = getControl();
-        tabPane.getSelectionModel().select(tab);
-        tabPane.getSelectionModel().selectPrevious();
+    // Find a tab before the currently selected that is not disabled.
+    public void selectPreviousTab() {       
+        SingleSelectionModel<Tab> selectionModel = getControl().getSelectionModel();
+        int current = selectionModel.getSelectedIndex();
+        int index = current;
+        while (index > 0) {
+            selectionModel.selectPrevious();
+            index--;
+            if (!selectionModel.getSelectedItem().isDisable()) {
+                return;
+            }
+        }
+        selectionModel.select(current);
     }
 }
diff -r a9aa43c1c740 javafx-ui-controls/src/com/sun/javafx/scene/control/skin/TabPaneSkin.java
--- a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/TabPaneSkin.java	Tue Apr 10 14:35:07 2012 -0700
+++ b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/TabPaneSkin.java	Fri Apr 13 15:41:33 2012 -0700
@@ -149,8 +149,18 @@
         registerChangeListener(tabPane.getSelectionModel().selectedItemProperty(), "SELECTED_TAB");
         registerChangeListener(tabPane.sideProperty(), "SIDE");
 
-        previousSelectedTab = null;
+        previousSelectedTab = null;        
         selectedTab = getSkinnable().getSelectionModel().getSelectedItem();
+        // Could not find the selected tab try and get the selected tab using the selected index
+        if (selectedTab == null && getSkinnable().getSelectionModel().getSelectedIndex() != -1) {
+            getSkinnable().getSelectionModel().select(getSkinnable().getSelectionModel().getSelectedIndex());
+            selectedTab = getSkinnable().getSelectionModel().getSelectedItem();        
+        } 
+        if (selectedTab == null) {
+            // getSelectedItem and getSelectedIndex failed select the first.
+            getSkinnable().getSelectionModel().selectFirst();
+        } 
+        selectedTab = getSkinnable().getSelectionModel().getSelectedItem();        
         isSelectingTab = false;
     }
 
@@ -165,7 +175,7 @@
 
     @Override protected void handleControlPropertyChanged(String property) {
         super.handleControlPropertyChanged(property);
-        if (property == "SELECTED_TAB") {
+        if (property == "SELECTED_TAB") {            
             isSelectingTab = true;
             previousSelectedTab = selectedTab;
             selectedTab = getSkinnable().getSelectionModel().getSelectedItem();
@@ -967,6 +977,9 @@
                         }
                     } else if (valueModel == tab.styleProperty()) {
                         setStyle(tab.getStyle());
+                    } else if (valueModel == tab.disableProperty()) {
+                        impl_pseudoClassStateChanged("disabled");
+                        requestLayout();
                     }
                 }
             };
@@ -975,6 +988,7 @@
             tab.graphicProperty().addListener(tabListener);
             tab.contextMenuProperty().addListener(tabListener);
             tab.tooltipProperty().addListener(tabListener);
+            tab.disableProperty().addListener(tabListener);
             tab.styleProperty().addListener(tabListener);
             tab.getStyleClass().addListener(new ListChangeListener<String>() {
                 @Override
@@ -1023,6 +1037,9 @@
             });
             setOnMousePressed(new EventHandler<MouseEvent>() {
                 @Override public void handle(MouseEvent me) {
+                    if (getTab().isDisable()) {
+                        return;
+                    }
                     if (me.getButton().equals(MouseButton.MIDDLE)) {
                         if (showCloseButton()) {
                             removeListeners(getTab());
@@ -1160,7 +1177,11 @@
         public long impl_getPseudoClassState() {
             long mask = super.impl_getPseudoClassState();
 
-            if (getTab().isSelected()) mask |= SELECTED_PSEUDOCLASS_STATE;
+            if (getTab().isDisable()) {
+                mask |= DISABLED_PSEUDOCLASS_STATE;
+            } else if (getTab().isSelected()) {
+                mask |= SELECTED_PSEUDOCLASS_STATE;
+            }
 
             switch(getSkinnable().getSide()) {
                 case TOP:
@@ -1192,6 +1213,8 @@
             StyleManager.getInstance().getPseudoclassMask("left");
     private static final long RIGHT_PSEUDOCLASS_STATE =
             StyleManager.getInstance().getPseudoclassMask("right");
+    private static final long DISABLED_PSEUDOCLASS_STATE =
+            StyleManager.getInstance().getPseudoclassMask("disabled");    
 
 
    /**************************************************************************
diff -r a9aa43c1c740 javafx-ui-controls/src/com/sun/javafx/scene/control/skin/caspian/caspian.css
--- a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/caspian/caspian.css	Tue Apr 10 14:35:07 2012 -0700
+++ b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/caspian/caspian.css	Fri Apr 13 15:41:33 2012 -0700
@@ -2602,6 +2602,15 @@
     -fx-background-radius: 5 5 0 0, 4 4 0 0;
 }
 
+.tab:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.tab:disabled:hover {
+    -fx-color: -fx-base;
+    -fx-opacity: -fx-disabled-opacity;
+}
+
 .tab-pane *.tab-header-background {
     -fx-background-color: -fx-outer-border, -fx-inner-border, derive(-fx-color, -20%);
     -fx-effect: innershadow(two-pass-box , rgba(0,0,0,0.6) , 4, 0.0 , 0 , 0);
diff -r a9aa43c1c740 javafx-ui-controls/src/javafx/scene/control/Tab.java
--- a/javafx-ui-controls/src/javafx/scene/control/Tab.java	Tue Apr 10 14:35:07 2012 -0700
+++ b/javafx-ui-controls/src/javafx/scene/control/Tab.java	Fri Apr 13 15:41:33 2012 -0700
@@ -1,4 +1,4 @@
-/*
+ /*
  * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -495,6 +495,33 @@
     
     private final ObservableList<String> styleClass = FXCollections.observableArrayList();
 
+    private BooleanProperty disable;
+    
+    public final void setDisable(boolean value) { 
+        disableProperty().set(value);
+    }
+
+    /**
+     * Returns {@code true} if this tab is disable.
+     *
+     * @return {@code true} if the tab is disable.
+     */    
+    public final boolean isDisable() { return disable == null ? false : disable.getValue(); }
+
+    /**
+     * Sets the disabled state of this tab. Setting
+     * {@code disable} to true will cause this tab and the tab content to
+     * become disabled. 
+     * 
+     * @defaultValue false
+     */    
+    public final BooleanProperty disableProperty() {
+        if (disable == null) {
+            disable = new SimpleBooleanProperty(this, "disable", false);
+        }
+        return disable;
+    }
+    
     /**
      * A list of String identifiers which can be used to logically group
      * Nodes, specifically for an external style engine. This variable is
diff -r a9aa43c1c740 javafx-ui-controls/src/javafx/scene/control/TabPane.java
--- a/javafx-ui-controls/src/javafx/scene/control/TabPane.java	Tue Apr 10 14:35:07 2012 -0700
+++ b/javafx-ui-controls/src/javafx/scene/control/TabPane.java	Fri Apr 13 15:41:33 2012 -0700
@@ -158,7 +158,7 @@
      * <p>The position to place the tabs in this TabPane. Whenever this changes
      * the TabPane will immediately update the location of the tabs to reflect
      * this.</p>
-     *     
+     *
      */
     public final void setSide(Side value) {
         sideProperty().set(value);
@@ -488,8 +488,8 @@
      **************************************************************************/
 
     private static class StyleableProperties {
-        private static final StyleableProperty<TabPane,Number> TAB_MIN_WIDTH = 
-                new StyleableProperty<TabPane,Number>("-fx-tab-min-width", 
+        private static final StyleableProperty<TabPane,Number> TAB_MIN_WIDTH =
+                new StyleableProperty<TabPane,Number>("-fx-tab-min-width",
                 SizeConverter.getInstance(), DEFAULT_TAB_MIN_WIDTH) {
 
             @Override
@@ -502,9 +502,9 @@
                 return n.tabMinWidthProperty();
             }
         };
-        
-        private static final StyleableProperty<TabPane,Number> TAB_MAX_WIDTH = 
-                new StyleableProperty<TabPane,Number>("-fx-tab-max-width", 
+
+        private static final StyleableProperty<TabPane,Number> TAB_MAX_WIDTH =
+                new StyleableProperty<TabPane,Number>("-fx-tab-max-width",
                 SizeConverter.getInstance(), DEFAULT_TAB_MAX_WIDTH) {
 
             @Override
@@ -517,9 +517,9 @@
                 return n.tabMaxWidthProperty();
             }
         };
-        
-        private static final StyleableProperty<TabPane,Number> TAB_MIN_HEIGHT = 
-                new StyleableProperty<TabPane,Number>("-fx-tab-min-height", 
+
+        private static final StyleableProperty<TabPane,Number> TAB_MIN_HEIGHT =
+                new StyleableProperty<TabPane,Number>("-fx-tab-min-height",
                 SizeConverter.getInstance(), DEFAULT_TAB_MIN_HEIGHT) {
 
             @Override
@@ -532,9 +532,9 @@
                 return n.tabMinHeightProperty();
             }
         };
-        
-        private static final StyleableProperty<TabPane,Number> TAB_MAX_HEIGHT = 
-                new StyleableProperty<TabPane,Number>("-fx-tab-max-height", 
+
+        private static final StyleableProperty<TabPane,Number> TAB_MAX_HEIGHT =
+                new StyleableProperty<TabPane,Number>("-fx-tab-max-height",
                 SizeConverter.getInstance(), DEFAULT_TAB_MAX_HEIGHT) {
 
             @Override
@@ -652,7 +652,7 @@
                             }
                         }
                     }
-                    if (getSelectedIndex() == -1 && tabPane.getTabs().size() > 0) {
+                    if (getSelectedIndex() == -1 && getSelectedItem() == null && tabPane.getTabs().size() > 0) {
                         selectFirst();
                     } else if (tabPane.getTabs().isEmpty()) {
                         clearSelection();
@@ -665,18 +665,42 @@
         }
 
         // API Implementation
-        @Override public void select(int index) {            
-            final int rowCount = getItemCount();
-            if (rowCount == 0 || index < 0 || index >= rowCount) {
+        @Override public void select(int index) {
+            if (index < 0 || (getItemCount() > 0 && index >= getItemCount())) {
                 return;
             }
 
-            if (getSelectedIndex() != -1 && getSelectedIndex() < tabPane.getTabs().size()) {                
+            // Unselect the old tab
+            if (getSelectedIndex() >= 0 && getSelectedIndex() < tabPane.getTabs().size()) {
                 tabPane.getTabs().get(getSelectedIndex()).setSelected(false);
             }
+
             setSelectedIndex(index);
-            setSelectedItem(getModelItem(index));
-            tabPane.getTabs().get(getSelectedIndex()).setSelected(true);
+
+            Tab tab = getModelItem(index);            
+            if (tab != null) {
+                setSelectedItem(tab);
+            }
+            
+            // Select the new tab
+            if (getSelectedIndex() >= 0 && getSelectedIndex() < tabPane.getTabs().size()) {
+                tabPane.getTabs().get(getSelectedIndex()).setSelected(true);
+            }
+        }
+
+        @Override public void select(Tab tab) {
+            final int itemCount = getItemCount();
+
+            for (int i = 0; i < itemCount; i++) {
+                final Tab value = getModelItem(i);
+                if (value != null && value.equals(tab)) {
+                    select(i);
+                    return;
+                }
+            }
+            if (tab != null) {
+                setSelectedItem(tab);
+            }
         }
 
         @Override protected Tab getModelItem(int index) {
diff -r a9aa43c1c740 javafx-ui-controls/test/javafx/scene/control/TabPaneTest.java
--- a/javafx-ui-controls/test/javafx/scene/control/TabPaneTest.java	Tue Apr 10 14:35:07 2012 -0700
+++ b/javafx-ui-controls/test/javafx/scene/control/TabPaneTest.java	Fri Apr 13 15:41:33 2012 -0700
@@ -16,10 +16,14 @@
 import javafx.beans.property.SimpleDoubleProperty;
 import javafx.beans.property.SimpleObjectProperty;
 import javafx.geometry.Side;
+import javafx.scene.Scene;
+import javafx.scene.layout.StackPane;
+import javafx.stage.Stage;
 import static org.junit.Assert.*;
 
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -33,6 +37,9 @@
     private Tab tab1;
     private Tab tab2;
     private Tab tab3;
+    private Scene scene;
+    private Stage stage;
+    private StackPane root;
 
     @Before public void setup() {
         tk = (StubToolkit)Toolkit.getToolkit();//This step is not needed (Just to make sure StubToolkit is loaded into VM)
@@ -41,27 +48,36 @@
         tab2 = new Tab("two");
         tab3 = new Tab("three");
         sm = new TabPane.TabPaneSelectionModel(tabPane);
+        root = new StackPane();
+        scene = new Scene(root);
+        stage = new Stage();
+        stage.setScene(scene);
     }
-    
-    
-    
+
+    /*********************************************************************
+     * Helper methods                                                    *
+     ********************************************************************/
+    private void show() {
+        stage.show();
+    }
+
     /*********************************************************************
      * Tests for default values                                         *
      ********************************************************************/
-    
+
     @Test public void defaultConstructorShouldSetStyleClassTo_tabpane() {
         assertStyleClassContains(tabPane, "tab-pane");
     }
-    
+
     @Test public void defaultConstructorSelectionModelNotNull() {
         assertNotNull(tabPane.getSelectionModel());
     }
-    
+
     @Test public void defaultConstructorInitialTabsEmpty() {
         assertNotNull(tabPane.getTabs());
         assertEquals(tabPane.getTabs().size(), 0.0, 0.0);
     }
-    
+
     @Test public void defaultSideIsTop() {
         assertSame(tabPane.getSide(), Side.TOP);
     }
@@ -74,7 +90,7 @@
     @Test public void defaultConstructorRotateGraphic() {
         assertFalse(tabPane.isRotateGraphic());
     }
-    
+
     @Test public void defaultTabMinWidth() {
         assertEquals(tabPane.getTabMinWidth(), 0.0, 0.0);
     }
@@ -94,12 +110,12 @@
     @Test public void defaultSelectionModelEmpty() {
         assertTrue(tabPane.getSelectionModel().isEmpty());
     }
-    
-    
+
+
     /*********************************************************************
      * Tests for property binding                                        *
      ********************************************************************/
-    
+
     @Test public void checkSelectionModelPropertyBind() {
         ObjectProperty objPr = new SimpleObjectProperty<SingleSelectionModel<Tab>>(null);
         tabPane.selectionModelProperty().bind(objPr);
@@ -107,7 +123,7 @@
         objPr.setValue(sm);
         assertSame("selectionModel cannot be bound", tabPane.selectionModelProperty().getValue(), sm);
     }
-    
+
     @Test public void checkSidePropertyBind() {
         ObjectProperty objPr = new SimpleObjectProperty<Side>(Side.BOTTOM);
         tabPane.sideProperty().bind(objPr);
@@ -115,7 +131,7 @@
         objPr.setValue(Side.RIGHT);
         assertSame("side cannot be bound", tabPane.sideProperty().getValue(), Side.RIGHT);
     }
-    
+
     @Test public void checkTabClosingPropertyBind() {
         ObjectProperty objPr = new SimpleObjectProperty<TabPane.TabClosingPolicy>(TabPane.TabClosingPolicy.UNAVAILABLE);
         tabPane.tabClosingPolicyProperty().bind(objPr);
@@ -123,7 +139,7 @@
         objPr.setValue(TabPane.TabClosingPolicy.ALL_TABS);
         assertSame("side cannot be bound", tabPane.tabClosingPolicyProperty().getValue(), TabPane.TabClosingPolicy.ALL_TABS);
     }
-    
+
     @Test public void checkRotateGraphicsPropertyBind() {
         BooleanProperty objPr = new SimpleBooleanProperty(false);
         tabPane.rotateGraphicProperty().bind(objPr);
@@ -131,7 +147,7 @@
         objPr.setValue(true);
         assertTrue("rotateGraphic cannot be bound", tabPane.rotateGraphicProperty().getValue());
     }
-    
+
     @Test public void checkTabMinWidthPropertyBind() {
         DoubleProperty objPr = new SimpleDoubleProperty(2.0);
         tabPane.tabMinWidthProperty().bind(objPr);
@@ -139,7 +155,7 @@
         objPr.setValue(5.0);
         assertEquals("tabMinWidthProperty cannot be bound", tabPane.tabMinWidthProperty().getValue(), 5.0, 0.0);
     }
-    
+
     @Test public void checkTabMaxWidthPropertyBind() {
         DoubleProperty objPr = new SimpleDoubleProperty(2.0);
         tabPane.tabMaxWidthProperty().bind(objPr);
@@ -147,8 +163,8 @@
         objPr.setValue(5.0);
         assertEquals("tabMaxWidthProperty cannot be bound", tabPane.tabMaxWidthProperty().getValue(), 5.0, 0.0);
     }
-    
-    
+
+
     @Test public void checkTabMinHeightPropertyBind() {
         DoubleProperty objPr = new SimpleDoubleProperty(2.0);
         tabPane.tabMinHeightProperty().bind(objPr);
@@ -156,7 +172,7 @@
         objPr.setValue(5.0);
         assertEquals("tabMinHeightProperty cannot be bound", tabPane.tabMinHeightProperty().getValue(), 5.0, 0.0);
     }
-    
+
     @Test public void checkTabMaxHeightPropertyBind() {
         DoubleProperty objPr = new SimpleDoubleProperty(2.0);
         tabPane.tabMaxHeightProperty().bind(objPr);
@@ -164,7 +180,7 @@
         objPr.setValue(5.0);
         assertEquals("tabMaxHeightProperty cannot be bound", tabPane.tabMaxHeightProperty().getValue(), 5.0, 0.0);
     }
-    
+
     @Test public void selectionModelPropertyHasBeanReference() {
         assertSame(tabPane, tabPane.selectionModelProperty().getBean());
     }
@@ -230,8 +246,8 @@
     }
 
 
-    
-    
+
+
     /*********************************************************************
      * Check for Pseudo classes                                          *
      ********************************************************************/
@@ -253,22 +269,22 @@
     }
 
 
-    
+
     /*********************************************************************
      * CSS related Tests                                                 *
      ********************************************************************/
     @Test public void whenTabMinWidthIsBound_impl_cssSettable_ReturnsFalse() {
         StyleableProperty styleable = StyleableProperty.getStyleableProperty(tabPane.tabMinWidthProperty());
-        assertTrue(styleable.isSettable(tabPane));        
+        assertTrue(styleable.isSettable(tabPane));
         DoubleProperty other = new SimpleDoubleProperty(30.0);
         tabPane.tabMinWidthProperty().bind(other);
-        assertFalse(styleable.isSettable(tabPane));        
+        assertFalse(styleable.isSettable(tabPane));
     }
 
     @Test public void whenTabMinWidthIsSpecifiedViaCSSAndIsNotBound_impl_cssSettable_ReturnsTrue() {
         StyleableProperty styleable = StyleableProperty.getStyleableProperty(tabPane.tabMinWidthProperty());
         styleable.set(tabPane, 43.0);
-        assertTrue(styleable.isSettable(tabPane));        
+        assertTrue(styleable.isSettable(tabPane));
     }
 
     @Test public void canSpecifyTabMinWidthViaCSS() {
@@ -279,16 +295,16 @@
 
     @Test public void whenTabMaxWidthIsBound_impl_cssSettable_ReturnsFalse() {
         StyleableProperty styleable = StyleableProperty.getStyleableProperty(tabPane.tabMaxWidthProperty());
-        assertTrue(styleable.isSettable(tabPane));        
+        assertTrue(styleable.isSettable(tabPane));
         DoubleProperty other = new SimpleDoubleProperty(30.0);
         tabPane.tabMaxWidthProperty().bind(other);
-        assertFalse(styleable.isSettable(tabPane));        
+        assertFalse(styleable.isSettable(tabPane));
     }
 
     @Test public void whenTabMaxWidthIsSpecifiedViaCSSAndIsNotBound_impl_cssSettable_ReturnsTrue() {
         StyleableProperty styleable = StyleableProperty.getStyleableProperty(tabPane.tabMaxWidthProperty());
         styleable.set(tabPane, 43.0);
-        assertTrue(styleable.isSettable(tabPane));        
+        assertTrue(styleable.isSettable(tabPane));
     }
 
     @Test public void canSpecifyTabMaxWidthViaCSS() {
@@ -308,7 +324,7 @@
     @Test public void whenTabMinHeightIsSpecifiedViaCSSAndIsNotBound_impl_cssSettable_ReturnsTrue() {
         StyleableProperty styleable = StyleableProperty.getStyleableProperty(tabPane.tabMinHeightProperty());
         styleable.set(tabPane, 43.0);
-        assertTrue(styleable.isSettable(tabPane));        
+        assertTrue(styleable.isSettable(tabPane));
     }
 
     @Test public void canSpecifyTabMinHeightViaCSS() {
@@ -328,7 +344,7 @@
     @Test public void whenTabMaxHeightIsSpecifiedViaCSSAndIsNotBound_impl_cssSettable_ReturnsTrue() {
         StyleableProperty styleable = StyleableProperty.getStyleableProperty(tabPane.tabMaxHeightProperty());
         styleable.set(tabPane, 43.0);
-        assertTrue(styleable.isSettable(tabPane));        
+        assertTrue(styleable.isSettable(tabPane));
     }
 
     @Test public void canSpecifyTabMaxHeightViaCSS() {
@@ -346,116 +362,116 @@
         tabPane.setSelectionModel(sm);
         assertSame(tabPane.selectionModelProperty().getValue(), sm);
     }
-    
+
     @Test public void setselectionModelAndSeeValue() {
         tabPane.setSelectionModel(sm);
         assertSame(tabPane.getSelectionModel(), sm);
     }
-    
+
     @Test public void setSideAndSeeValueIsReflectedInModel() {
         tabPane.setSide(Side.BOTTOM);
         assertSame(tabPane.sideProperty().getValue(), Side.BOTTOM);
     }
-    
+
     @Test public void setSideAndSeeValue() {
         tabPane.setSide(Side.LEFT);
         assertSame(tabPane.getSide(), Side.LEFT);
     }
-    
+
     @Test public void setTabClosingPolicyAndSeeValueIsReflectedInModel() {
         tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.ALL_TABS);
         assertSame(tabPane.tabClosingPolicyProperty().getValue(), TabPane.TabClosingPolicy.ALL_TABS);
     }
-    
+
     @Test public void setTabClosingPolicyAndSeeValue() {
         tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
         assertSame(tabPane.getTabClosingPolicy(), TabPane.TabClosingPolicy.UNAVAILABLE);
     }
-    
+
     @Test public void setRotateGraphicAndSeeValueIsReflectedInModel() {
         tabPane.setRotateGraphic(true);
         assertTrue(tabPane.rotateGraphicProperty().getValue());
     }
-    
+
     @Test public void setRotateGraphicAndSeeValue() {
         tabPane.setRotateGraphic(true);
         assertTrue(tabPane.isRotateGraphic());
     }
-    
+
     @Test public void setTabMinWidthAndSeeValueIsReflectedInModel() {
         tabPane.setTabMinWidth(30.0);
         assertEquals(tabPane.tabMinWidthProperty().getValue(), 30.0, 0.0);
     }
-    
+
     @Test public void setTabMinWidthAndSeeValue() {
         tabPane.setTabMinWidth(30.0);
         assertEquals(tabPane.getTabMinWidth(), 30.0, 0.0);
     }
-    
+
     @Test public void setTabMaxWidthAndSeeValueIsReflectedInModel() {
         tabPane.setTabMaxWidth(30.0);
         assertEquals(tabPane.tabMaxWidthProperty().getValue(), 30.0, 0.0);
     }
-    
+
     @Test public void setTabMaxWidthAndSeeValue() {
         tabPane.setTabMaxWidth(30.0);
         assertEquals(tabPane.getTabMaxWidth(), 30.0, 0.0);
     }
-    
+
     @Test public void setTabMinHeightAndSeeValueIsReflectedInModel() {
         tabPane.setTabMinHeight(30.0);
         assertEquals(tabPane.tabMinHeightProperty().getValue(), 30.0, 0.0);
     }
-    
+
     @Test public void setTabMinHeightAndSeeValue() {
         tabPane.setTabMinHeight(30.0);
         assertEquals(tabPane.getTabMinHeight(), 30.0, 0.0);
     }
-    
+
     @Test public void setTabMaxHeightAndSeeValueIsReflectedInModel() {
         tabPane.setTabMaxHeight(30.0);
         assertEquals(tabPane.tabMaxHeightProperty().getValue(), 30.0, 0.0);
     }
-    
+
     @Test public void setTabMaxHeightAndSeeValue() {
         tabPane.setTabMaxHeight(30.0);
         assertEquals(tabPane.getTabMaxHeight(), 30.0, 0.0);
     }
-    
+
     @Test public void addTabsCheckItemCountInSelectionModel() {
         tabPane.getTabs().add(tab1);
         tabPane.getTabs().add(tab2);
         assertEquals(tabPane.getSelectionModel().getItemCount(), 2.0, 0.0);
     }
-    
+
     @Test public void addTabsCheckItemInSelectionModel() {
         tabPane.getTabs().add(tab1);
         tabPane.getTabs().add(tab2);
         assertSame(tabPane.getSelectionModel().getModelItem(0), tab1);
         assertSame(tabPane.getSelectionModel().getModelItem(1), tab2);
     }
-    
+
     @Test public void addTabsCheckSelectUsingObjInSelectionModel() {
         tabPane.getTabs().add(tab1);
         tabPane.getTabs().add(tab2);
         tabPane.getSelectionModel().select(tab1);
         assertTrue(tabPane.getSelectionModel().isSelected(0));
     }
-    
+
     @Test public void addTabsCheckSelectUsingIndexInSelectionModel() {
         tabPane.getTabs().add(tab1);
         tabPane.getTabs().add(tab2);
         tabPane.getSelectionModel().select(1);
         assertTrue(tabPane.getSelectionModel().isSelected(1));
     }
-    
+
     @Test public void addTabsCheckClearAndSelectUsingIndexInSelectionModel() {
         tabPane.getTabs().add(tab1);
         tabPane.getTabs().add(tab2);
         tabPane.getSelectionModel().clearAndSelect(1);
         assertTrue(tabPane.getSelectionModel().isSelected(1));
     }
-    
+
     @Test public void addTabsCheckSelectMultipleItemsAndClearOneItemInSelectionModel() {
         tabPane.getTabs().add(tab1);
         tabPane.getTabs().add(tab2);
@@ -465,7 +481,7 @@
         assertFalse(tabPane.getSelectionModel().isSelected(0));
         assertTrue(tabPane.getSelectionModel().isSelected(1));
     }
-    
+
     @Test public void addTabsCheckSelectMultipleItemsAndClearAllSelectionInSelectionModel() {
         tabPane.getTabs().add(tab1);
         tabPane.getTabs().add(tab2);
@@ -494,25 +510,130 @@
         assertTrue(tabPane.getSelectionModel().isSelected(0));
         assertFalse(tabPane.getSelectionModel().isSelected(1));
     }
-    
+
     @Test public void flipTabOrder_RT20156() {
         tabPane.setSkin(new TabPaneSkin(tabPane));
         tabPane.getTabs().add(tab1);
         tabPane.getTabs().add(tab2);
         tabPane.getTabs().add(tab3);
-        
+
         assertEquals("one", tabPane.getTabs().get(0).getText());
         assertEquals("two", tabPane.getTabs().get(1).getText());
         assertEquals("three", tabPane.getTabs().get(2).getText());
-        
+
         final int lastTabIndex = tabPane.getTabs().size()-1;
-        final Tab lastTab = tabPane.getTabs().get(lastTabIndex);        
+        final Tab lastTab = tabPane.getTabs().get(lastTabIndex);
         tabPane.getTabs().remove(lastTabIndex);
         tabPane.getTabs().add(0, lastTab);
-        
-        assertEquals("three", tabPane.getTabs().get(0).getText());                
+
+        assertEquals("three", tabPane.getTabs().get(0).getText());
         assertEquals("one", tabPane.getTabs().get(1).getText());
         assertEquals("two", tabPane.getTabs().get(2).getText());
-        assertTrue(tabPane.getSelectionModel().isSelected(1));        
-    }    
+        assertTrue(tabPane.getSelectionModel().isSelected(1));
+    }
+
+    @Test public void disableAllTabs() {
+        tabPane.setSkin(new TabPaneSkin(tabPane));
+        tabPane.getTabs().add(tab1);
+        tabPane.getTabs().add(tab2);
+        tabPane.getTabs().add(tab3);
+
+        tab1.setDisable(true);
+        tab2.setDisable(true);
+        tab3.setDisable(true);
+
+        assertEquals(0, tabPane.getSelectionModel().getSelectedIndex());
+        assertEquals(tab1, tabPane.getSelectionModel().getSelectedItem());
+    }
+
+    @Test public void disableFirstTabs() {
+        tabPane.setSkin(new TabPaneSkin(tabPane));
+        tabPane.getTabs().add(tab1);
+        tabPane.getTabs().add(tab2);
+        tabPane.getTabs().add(tab3);
+
+        tab1.setDisable(true);
+        assertEquals(0, tabPane.getSelectionModel().getSelectedIndex());
+        assertEquals(tab1, tabPane.getSelectionModel().getSelectedItem());
+    }
+
+    @Test public void disableATabAndSelectItByIndex() {
+        tabPane.setSkin(new TabPaneSkin(tabPane));
+        tabPane.getTabs().add(tab1);
+        tabPane.getTabs().add(tab2);
+        tabPane.getTabs().add(tab3);
+
+        tab2.setDisable(true);
+        tabPane.getSelectionModel().select(1);
+        assertEquals(1, tabPane.getSelectionModel().getSelectedIndex());
+        assertEquals(tab2, tabPane.getSelectionModel().getSelectedItem());
+    }
+
+    @Test public void selectByIndexADisableTab() {
+        tabPane.setSkin(new TabPaneSkin(tabPane));
+        tabPane.getTabs().add(tab1);
+        tabPane.getTabs().add(tab2);
+        tabPane.getTabs().add(tab3);
+
+        tabPane.getSelectionModel().select(1);
+        tab2.setDisable(true);
+        assertEquals(1, tabPane.getSelectionModel().getSelectedIndex());
+        assertEquals(tab2, tabPane.getSelectionModel().getSelectedItem());
+        assertTrue(tab2.isDisable());
+    }
+
+    @Test public void disableATabAndSelectItByTab() {
+        tabPane.setSkin(new TabPaneSkin(tabPane));
+        tabPane.getTabs().add(tab1);
+        tabPane.getTabs().add(tab2);
+        tabPane.getTabs().add(tab3);
+
+        tab2.setDisable(true);
+        tabPane.getSelectionModel().select(tab2);
+        assertEquals(1, tabPane.getSelectionModel().getSelectedIndex());
+        assertEquals(tab2, tabPane.getSelectionModel().getSelectedItem());
+    }
+
+    @Test public void selectByTabADisableTab() {
+        tabPane.setSkin(new TabPaneSkin(tabPane));
+        tabPane.getTabs().add(tab1);
+        tabPane.getTabs().add(tab2);
+        tabPane.getTabs().add(tab3);
+
+        tabPane.getSelectionModel().select(tab2);
+        tab2.setDisable(true);
+        assertEquals(1, tabPane.getSelectionModel().getSelectedIndex());
+        assertEquals(tab2, tabPane.getSelectionModel().getSelectedItem());
+        assertTrue(tab2.isDisable());
+    }
+
+    @Test public void navigateOverDisableTab() {
+        tabPane.getTabs().add(tab1);
+        tabPane.getTabs().add(tab2);
+        tabPane.getTabs().add(tab3);
+
+        root.getChildren().add(tabPane);
+        show();
+
+        tk.firePulse();
+        assertTrue(tabPane.isFocused());
+        
+        tab2.setDisable(true);
+        assertEquals(0, tabPane.getSelectionModel().getSelectedIndex());
+        assertEquals(tab1, tabPane.getSelectionModel().getSelectedItem());
+        assertTrue(tab2.isDisable());
+
+        KeyEventFirer keyboard = new KeyEventFirer(tabPane);
+        keyboard.doRightArrowPress();
+        tk.firePulse();
+
+        assertEquals(2, tabPane.getSelectionModel().getSelectedIndex());
+        assertEquals(tab3, tabPane.getSelectionModel().getSelectedItem());
+
+        keyboard.doLeftArrowPress();
+        tk.firePulse();
+
+        assertEquals(0, tabPane.getSelectionModel().getSelectedIndex());
+        assertEquals(tab1, tabPane.getSelectionModel().getSelectedItem());
+    }
 }
diff -r a9aa43c1c740 javafx-ui-controls/test/javafx/scene/control/TabTest.java
--- a/javafx-ui-controls/test/javafx/scene/control/TabTest.java	Tue Apr 10 14:35:07 2012 -0700
+++ b/javafx-ui-controls/test/javafx/scene/control/TabTest.java	Fri Apr 13 15:41:33 2012 -0700
@@ -424,6 +424,10 @@
         tab.buildEventDispatchChain(chain);
     }
     
+    @Test public void setDisableAndSeeValue() {
+        tab.setDisable(true);
+        assertTrue(tab.isDisable());
+    }
     
 
 }
