diff --git a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/forms/DetailsForm.java b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/forms/DetailsForm.java
index df976dd..b4b0a4f 100644
--- a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/forms/DetailsForm.java
+++ b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/forms/DetailsForm.java
@@ -533,15 +533,19 @@
 
 		if (currentAdapter == null)
 			return false;
+			
+		boolean localContext = currentAdapter instanceof IConfiguredSiteContext;
 
-		if (currentAdapter.isIncluded() && !currentAdapter.isOptional())
-			return false;
+		if (currentAdapter.isIncluded()) {
+			if (!localContext) return false;
+			if (!currentAdapter.isOptional()) return false;
+		}
 
 		UpdateModel model = UpdateUIPlugin.getDefault().getUpdateModel();
 		if (model.findRelatedPendingChange(currentFeature) != null)
 			return false;
-		if (currentAdapter instanceof IConfiguredSiteContext) {
-			// part of the local configuration
+
+		if (localContext) {
 			IConfiguredSiteContext context =
 				(IConfiguredSiteContext) currentAdapter;
 			if (!context.getInstallConfiguration().isCurrent())
diff --git a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/model/SimpleFeatureAdapter.java b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/model/SimpleFeatureAdapter.java
index eaf054b..e6575d3 100644
--- a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/model/SimpleFeatureAdapter.java
+++ b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/model/SimpleFeatureAdapter.java
@@ -22,6 +22,7 @@
 		this(feature, false);
 	}
 	public SimpleFeatureAdapter(IFeature feature, boolean optional) {
+		this.feature = feature;
 		this.optional = optional;
 	}
 	
diff --git a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/OptionalFeaturesPage.java b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/OptionalFeaturesPage.java
index 57c0505..181ecd9 100644
--- a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/OptionalFeaturesPage.java
+++ b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/OptionalFeaturesPage.java
@@ -42,14 +42,16 @@
 	private IInstallConfiguration config;
 	private PendingChange pendingChange;
 	private Image featureImage;
+	private Object[] elements;
 
 	class TreeContentProvider
 		extends DefaultContentProvider
 		implements ITreeContentProvider {
+
 		public Object[] getChildren(Object parent) {
-			if (parent instanceof IFeatureReference) {
-				IFeatureReference ref = (IFeatureReference) parent;
-				return getIncludedFeatures(ref);
+			if (parent instanceof FeatureElement) {
+				FeatureElement fe = (FeatureElement) parent;
+				return fe.getChildren();
 			}
 			return new Object[0];
 		}
@@ -63,43 +65,92 @@
 		}
 
 		public Object[] getElements(Object input) {
-			return getIncludedFeatures(pendingChange.getFeature());
+			if (elements == null)
+				computeElements();
+			return elements;
 		}
 	}
 
 	class TreeLabelProvider extends LabelProvider {
 		public String getText(Object obj) {
-			if (obj instanceof IFeatureReference) {
-				IFeatureReference ref = (IFeatureReference) obj;
-				try {
-					IFeature feature = ref.getFeature();
-					return getFeatureLabel(feature);
-				} catch (CoreException e) {
-					if (ref.getName() != null)
-						return ref.getName();
-					try {
-						VersionedIdentifier vid = ref.getVersionedIdentifier();
-						return vid.toString();
-					} catch (CoreException e2) {
-					}
-				}
+			if (obj instanceof FeatureElement) {
+				FeatureElement fe = (FeatureElement) obj;
+				String name = fe.getLabel();
+				if (name!=null) return name;
 			}
 			return super.getText(obj);
 		}
-		private String getFeatureLabel(IFeature feature) {
-			return feature.getLabel()
-					+ " "
-					+ feature
-						.getVersionedIdentifier()
-						.getVersion()
-						.toString();
-		}
-
 		public Image getImage(Object obj) {
 			return featureImage;
 		}
 	}
 
+	class FeatureElement {
+		private ArrayList children;
+		private IFeatureReference oldFeatureRef;
+		private IFeatureReference newFeatureRef;
+		boolean checked;
+
+		public FeatureElement(
+			IFeatureReference oldRef,
+			IFeatureReference newRef) {
+			oldFeatureRef = oldRef;
+			newFeatureRef = newRef;
+		}
+		public boolean isEditable() {
+			// cannot uncheck non-optional features
+			if (newFeatureRef.isOptional() == false)
+				return false;
+			// cannot uncheck optional feature that
+			return true;
+		}
+		public boolean isOptional() {
+			return newFeatureRef.isOptional();
+		}
+		public boolean isChecked() {
+			return checked;
+		}
+		public void setChecked(boolean checked) {
+			this.checked = checked;
+		}
+		public String getLabel() {
+			try {
+				IFeature feature = newFeatureRef.getFeature();
+				return getFeatureLabel(feature);
+			} catch (CoreException e) {
+				if (newFeatureRef.getName() != null)
+					return newFeatureRef.getName();
+				try {
+					VersionedIdentifier vid =
+						newFeatureRef.getVersionedIdentifier();
+					return vid.toString();
+				} catch (CoreException e2) {
+				}
+			}
+			return null;
+		}
+		private String getFeatureLabel(IFeature feature) {
+			return feature.getLabel()
+				+ " "
+				+ feature.getVersionedIdentifier().getVersion().toString();
+		}
+		Object[] getChildren() {
+			if (children == null) {
+				children = new ArrayList();
+				try {
+					IFeature oldFeature = null;
+					IFeature newFeature = null;
+					newFeature = newFeatureRef.getFeature();
+					if (oldFeature != null)
+						oldFeature = oldFeatureRef.getFeature();
+					computeElements(oldFeature, newFeature, children);
+				} catch (CoreException e) {
+				}
+			}
+			return children.toArray();
+		}
+	}
+
 	/**
 	 * Constructor for ReviewPage
 	 */
@@ -138,19 +189,27 @@
 				selectAll(true);
 			}
 		});
-		selectAllButton.setText(UpdateUIPlugin.getResourceString(KEY_SELECT_ALL));
-		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
+		selectAllButton.setText(
+			UpdateUIPlugin.getResourceString(KEY_SELECT_ALL));
+		GridData gd =
+			new GridData(
+				GridData.HORIZONTAL_ALIGN_FILL
+					| GridData.VERTICAL_ALIGN_BEGINNING);
 		selectAllButton.setLayoutData(gd);
 		SWTUtil.setButtonDimensionHint(selectAllButton);
-		
+
 		Button deselectAllButton = new Button(client, SWT.PUSH);
 		deselectAllButton.addSelectionListener(new SelectionAdapter() {
 			public void widgetSelected(SelectionEvent e) {
 				selectAll(false);
 			}
 		});
-		deselectAllButton.setText(UpdateUIPlugin.getResourceString(KEY_DESELECT_ALL));
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
+		deselectAllButton.setText(
+			UpdateUIPlugin.getResourceString(KEY_DESELECT_ALL));
+		gd =
+			new GridData(
+				GridData.HORIZONTAL_ALIGN_FILL
+					| GridData.VERTICAL_ALIGN_BEGINNING);
 		deselectAllButton.setLayoutData(gd);
 		SWTUtil.setButtonDimensionHint(deselectAllButton);
 		return client;
@@ -197,6 +256,58 @@
 		}
 	}
 
+	private void computeElements() {
+		IFeature oldFeature = pendingChange.getOldFeature();
+		IFeature newFeature = pendingChange.getFeature();
+		ArrayList list = new ArrayList();
+		computeElements(oldFeature, newFeature, list);
+		elements = list.toArray();
+	}
+
+	private void computeElements(
+		IFeature oldFeature,
+		IFeature newFeature,
+		ArrayList list) {
+		Object[] oldChildren = null;
+		Object[] newChildren = getIncludedFeatures(newFeature);
+
+		try {
+
+			if (oldFeature != null) {
+				oldChildren = getIncludedFeatures(oldFeature);
+			}
+			for (int i = 0; i < newChildren.length; i++) {
+				IFeatureReference oldRef = null;
+				IFeatureReference newRef = (IFeatureReference) newChildren[i];
+				if (oldChildren != null) {
+					String newId =
+						newRef.getVersionedIdentifier().getIdentifier();
+					for (int j = 0; j < oldChildren.length; j++) {
+						IFeatureReference cref =
+							(IFeatureReference) oldChildren[j];
+						if (cref
+							.getVersionedIdentifier()
+							.getIdentifier()
+							.equals(newId)) {
+							oldRef = cref;
+							break;
+						}
+					}
+				}
+				FeatureElement element = new FeatureElement(oldRef, newRef);
+				// If this is an update (old feature exists), 
+				// only check the new optional feature if the old exists.
+				// Otherwise, always check.
+				if (newRef.isOptional() && pendingChange.getOldFeature()!=null)
+					element.setChecked(oldRef!=null);
+				else
+					element.setChecked(true);
+				list.add(element);
+			}
+		} catch (CoreException e) {
+		}
+	}
+
 	private Object[] getIncludedFeatures(IFeatureReference ref) {
 		try {
 			IFeature feature = ref.getFeature();
@@ -215,62 +326,59 @@
 	}
 
 	private void initializeStates() {
-		IFeature oldFeature = pendingChange.getOldFeature();
-		IFeature newFeature = pendingChange.getFeature();
-
-		if (oldFeature==null) {
-			// preselect all included children
-			selectAll(true);
-		}
-		else {
-			// preselect only installed children
-		}
-	}
-	
-	private void selectAll(boolean value) {
-		ArrayList selected = new ArrayList();
+		if (elements==null) computeElements();
+		ArrayList checked = new ArrayList();
 		ArrayList grayed = new ArrayList();
-		Object [] included = getIncludedFeatures(pendingChange.getFeature());
-		for (int i=0; i<included.length; i++) {
-			IFeatureReference ref = (IFeatureReference)included[i];
-			if (ref.isOptional()==false) {
-				selected.add(ref);
-				grayed.add(ref);
-			}
-			else if (value)
-				selected.add(ref);
-			selectAll(ref, selected, grayed, value);
-		}
-		treeViewer.setCheckedElements(selected.toArray());
+		initializeStates(elements, checked, grayed);
+		treeViewer.setCheckedElements(checked.toArray());
 		treeViewer.setGrayedElements(grayed.toArray());
 	}
 	
-	private void selectAll(IFeatureReference ref, ArrayList selected, ArrayList grayed, boolean value) {
-		Object [] included = getIncludedFeatures(ref);
-		for (int i=0; i<included.length; i++) {
-			IFeatureReference iref = (IFeatureReference)included[i];
-			if (iref.isOptional()==false) {
-				selected.add(iref);
-				grayed.add(iref);
-			}
-			else if (value)
-				selected.add(iref);
-			selectAll(iref, selected, grayed, value);
+	private void initializeStates(Object [] elements, ArrayList checked, ArrayList grayed) {
+		for (int i=0; i<elements.length; i++) {
+			FeatureElement element = (FeatureElement)elements[i];
+			if (element.isChecked()) checked.add(element);
+			if (!element.isEditable()) grayed.add(element);
+			Object [] children = element.getChildren();
+			initializeStates(children, checked, grayed);
 		}
 	}
-	
-	private void handleChecked(Object element, boolean checked) {
-		//see if the object is editable
-		boolean editable = true;
 
-		if (element instanceof IFeatureReference) {
-			IFeatureReference fref = (IFeatureReference)element;
-			editable = fref.isOptional();
+	private void selectAll(boolean value) {
+		ArrayList selected = new ArrayList();
+
+		for (int i = 0; i < elements.length; i++) {
+			FeatureElement element = (FeatureElement)elements[i];
+			selectAll(element, selected, value);
 		}
-		if (!editable)
+		treeViewer.setCheckedElements(selected.toArray());
+	}
+
+	private void selectAll(
+		FeatureElement ref,
+		ArrayList selected,
+		boolean value) {
+		
+		if (ref.isOptional()==false) selected.add(ref);
+		else {
+			ref.setChecked(value);
+			if (value) selected.add(ref);
+		}
+		Object[] included = ref.getChildren();
+		for (int i = 0; i < included.length; i++) {
+			FeatureElement fe = (FeatureElement) included[i];
+			selectAll(fe, selected, value);
+		}
+	}
+
+	private void handleChecked(Object element, boolean checked) {
+		FeatureElement fe = (FeatureElement)element;
+
+		if (!fe.isEditable())
 			treeViewer.setChecked(element, !checked);
 		else {
 			// update the result
+			fe.setChecked(checked);
 		}
 	}
 }
\ No newline at end of file
