diff --git a/org.eclipse.help.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.help.ui/.settings/org.eclipse.jdt.ui.prefs
index 0fb87bc..eb4d0b3 100644
--- a/org.eclipse.help.ui/.settings/org.eclipse.jdt.ui.prefs
+++ b/org.eclipse.help.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -28,7 +28,7 @@
 sp_cleanup.make_variable_declarations_final=false
 sp_cleanup.never_use_blocks=false
 sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
+sp_cleanup.on_save_use_additional_actions=true
 sp_cleanup.organize_imports=true
 sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
 sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
@@ -37,12 +37,12 @@
 sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
 sp_cleanup.remove_private_constructors=true
 sp_cleanup.remove_redundant_type_arguments=true
-sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_trailing_whitespaces=true
 sp_cleanup.remove_trailing_whitespaces_all=true
 sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
 sp_cleanup.remove_unnecessary_casts=true
 sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_imports=true
 sp_cleanup.remove_unused_local_variables=false
 sp_cleanup.remove_unused_private_fields=true
 sp_cleanup.remove_unused_private_members=false
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/IEngineDescriptor.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/IEngineDescriptor.java
index 86ecf00..d17d32b 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/IEngineDescriptor.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/IEngineDescriptor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,17 +20,17 @@
  * description changed.
  * <p>
  * This interface is not intended to be extended or implemented by clients.
- * 
+ *
  * @since 3.1
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
- * 
+ *
  */
 
 public interface IEngineDescriptor {
 	/**
 	 * Returns the unique identifier of this engine instance.
-	 * 
+	 *
 	 * @return the unique engine identifier
 	 */
 	String getId();
@@ -38,14 +38,14 @@
 	/**
 	 * Returns the unique identifier of the engine type of which this is an
 	 * instance.
-	 * 
+	 *
 	 * @return the engine type identifier
 	 */
 	String getEngineTypeId();
 
 	/**
 	 * Returns the label of this engine for rendering in the UI.
-	 * 
+	 *
 	 * @return the engine label
 	 */
 	String getLabel();
@@ -53,7 +53,7 @@
 	/**
 	 * Changes the label of this engine. This method does nothing for engine
 	 * descriptors that are not user-defined.
-	 * 
+	 *
 	 * @param label
 	 *            the new engine label
 	 */
@@ -69,7 +69,7 @@
 	/**
 	 * Changes the description of this engine. This method does nothing for
 	 * engine descriptors that are not user-defined.
-	 * 
+	 *
 	 * @param desc
 	 *            the new engine description
 	 */
@@ -78,7 +78,7 @@
 	/**
 	 * Returns the parameters used to configure this engine according to the
 	 * valid parameters for the associated engine type.
-	 * 
+	 *
 	 * @return the parameter dictionary
 	 */
 	Dictionary<String, Object> getParameters();
@@ -87,7 +87,7 @@
 	 * Tests whether this engine is provided as an extension point contribution
 	 * or is created by the user in the scope settings dialog. Only user-defined
 	 * engine instances can have their label and/or description changed.
-	 * 
+	 *
 	 * @return <code>true</code> if the engine is user defined, or
 	 *         <code>false</code> otherwise.
 	 */
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/ISearchScopeFactory.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/ISearchScopeFactory.java
index 23ed7f7..3a1fd4c 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/ISearchScopeFactory.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/ISearchScopeFactory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
  * engines. Search engine and scope factory are defined together in the same
  * extension point, hence the actual implementation of ISearchScope is up to the
  * contributor.
- * 
+ *
  * @since 3.1
  */
 public interface ISearchScopeFactory {
@@ -35,7 +35,7 @@
 	 * In cases where conflicting values can be found in the preference store
 	 * and parameters, preference store should win i.e. parameters should be
 	 * treated as default values only.
-	 * 
+	 *
 	 * @param store
 	 *            the preference store that holds the scope data
 	 * @param engineId
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/ISearchScopePage.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/ISearchScopePage.java
index b357e4b..a8e965d 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/ISearchScopePage.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/ISearchScopePage.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,13 +15,13 @@
 /**
  * Preference pages that are used for editing help search scope settings should
  * implement this interface.
- * 
+ *
  * @since 3.1
  */
 public interface ISearchScopePage extends IPreferencePage {
 	/**
 	 * Initializes the search scope page.
-	 * 
+	 *
 	 * @param ed
 	 *            the descriptor of the engine associated with this page
 	 * @param scopeSetName
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/RootScopePage.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/RootScopePage.java
index a057b8e..f5ce051 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/RootScopePage.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/RootScopePage.java
@@ -4,10 +4,10 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Alex Blewitt - Bug 474070 
+ *     Alex Blewitt - Bug 474070
  *******************************************************************************/
 package org.eclipse.help.ui;
 
@@ -37,7 +37,7 @@
  * engine name, image and description, as well as the master switch that turns
  * the engine on or off. When the engine master switch is set to false, all the
  * children in the client composite will be disabled.
- * 
+ *
  * @since 3.1
  */
 public abstract class RootScopePage extends PreferencePage implements
@@ -74,7 +74,7 @@
 	 * Creates the initial contents of the page and allocates the area for the
 	 * clients. Classes that extend this class should implement
 	 * <code>createScopeContents(Composite)</code> instead.
-	 * 
+	 *
 	 * @param parent
 	 *            the page parent
 	 * @return the page client control
@@ -89,7 +89,7 @@
 		GridData gd;
 		//if (ed.isUserDefined())
 		layout.numColumns = 2;
-		contentContainer.setLayout(layout);		
+		contentContainer.setLayout(layout);
 		if (isInPreferenceDialog()) {
 			masterButton = new Button(contentContainer, SWT.CHECK);
 			masterButton.setText(Messages.RootScopePage_masterButton);
@@ -153,7 +153,7 @@
 	 * Called when the value of the master switch has changed. The default
 	 * implementation disables the scope contents control when the master switch
 	 * is off. Subclass can override this behaviour.
-	 * 
+	 *
 	 * @param value
 	 *            <code>true</code> if the master switch is on,
 	 *            <code>false</code> otherwise.
@@ -185,7 +185,7 @@
 
 	/**
 	 * Returns the scope set name passed to the page during initialization.
-	 * 
+	 *
 	 * @return the name of the current scope set
 	 */
 
@@ -195,7 +195,7 @@
 
 	/**
 	 * Returns the descriptor of the engine associated with this page.
-	 * 
+	 *
 	 * @return the engine descriptor
 	 */
 
@@ -206,7 +206,7 @@
 	/**
 	 * Tests whether the search engine has been selected to participate in the
 	 * search.
-	 * 
+	 *
 	 * @return <code>true</code> if the search engine is enabled, </code>false</code>
 	 *         otherwise.
 	 */
@@ -221,7 +221,7 @@
 	/**
 	 * Stores the value of the master switch in the preference store. Subclasses
 	 * may override but must call 'super'.
-	 * 
+	 *
 	 * @return <code>true</code> if the wizard can be closed,
 	 *         <code>false</code> otherwise.
 	 */
@@ -270,7 +270,7 @@
 	/**
 	 * Initializes default values of the store to be used when the user presses
 	 * 'Defaults' button. Subclasses may override but must call 'super'.
-	 * 
+	 *
 	 * @param store
 	 *            the preference store
 	 */
@@ -293,7 +293,7 @@
 	 * need for themselves only. Clients that implement this method should
 	 * return the required number of columns so that the root page widgets can
 	 * be adjusted if more columns are needed than initially set.
-	 * 
+	 *
 	 * @param parent
 	 *            the page parent
 	 * @return number of columns required by the client content
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/browser/LaunchURL.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/browser/LaunchURL.java
index 1824266..9f92faa 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/browser/LaunchURL.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/browser/LaunchURL.java
@@ -81,7 +81,7 @@
 		} catch (Exception e) {
 			HelpUIPlugin.logError("Exception occurred when opening URL: " + url //$NON-NLS-1$
 					+ ".", e); //$NON-NLS-1$
-			ErrorUtil.displayErrorDialog(Messages.LaunchURL_exception); 
+			ErrorUtil.displayErrorDialog(Messages.LaunchURL_exception);
 		}
 	}
 
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/CloseHelpTrayHandler.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/CloseHelpTrayHandler.java
index 9b6621b..71fd477 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/CloseHelpTrayHandler.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/CloseHelpTrayHandler.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ContextHelpDialog.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ContextHelpDialog.java
index 4cbfde9..a38bdaa 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ContextHelpDialog.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ContextHelpDialog.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -86,7 +86,7 @@
 
 	/**
 	 * Constructor:
-	 * 
+	 *
 	 * @param context
 	 *            an array of String or an array of IContext
 	 * @param x
@@ -167,7 +167,7 @@
 		// Correct x and y of the shell if it not contained within the screen
 		int width = shell.getBounds().width;
 		int height = shell.getBounds().height;
-		
+
 		Rectangle screen = display.getClientArea();
 		// check lower boundaries
 		x = x >= screen.x ? x : screen.x;
@@ -212,7 +212,7 @@
 		}
 		return contents;
 	}
-	
+
 	private Control createInfoArea(Composite parent) {
 		// Create the text field.
 		String styledText = null;
@@ -222,7 +222,7 @@
 		if (styledText == null && context.getText() != null) {
 			styledText = context.getText();
 		    styledText= styledText.replaceAll("<b>","<@#\\$b>"); //$NON-NLS-1$ //$NON-NLS-2$
-		    styledText= styledText.replaceAll("</b>", "</@#\\$b>"); //$NON-NLS-1$ //$NON-NLS-2$	
+		    styledText= styledText.replaceAll("</b>", "</@#\\$b>"); //$NON-NLS-1$ //$NON-NLS-2$
 		}
 		if (styledText == null) { // no description found in context objects.
 			styledText = Messages.ContextHelpPart_noDescription;
@@ -256,7 +256,7 @@
 
 	/**
 	 * Measures the longest label of related links
-	 * 
+	 *
 	 * @param text
 	 * @return
 	 */
@@ -343,7 +343,7 @@
 			// create link to the dynamic help
 			createDynamicHelpLink(composite);
 		}
-		
+
 		return composite;
 	}
 
@@ -388,7 +388,7 @@
 				&& !Constants.OS_WIN32.equalsIgnoreCase(Platform
 								.getOS()));
 	}
-	
+
 	private void openDynamicHelp() {
 		BusyIndicator.showWhile(shell.getDisplay(), () -> {
 			close();
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/DefaultHelpUI.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/DefaultHelpUI.java
index d1355cc..67a8abd 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/DefaultHelpUI.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/DefaultHelpUI.java
@@ -4,9 +4,9 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- * 		IBM Corporation - initial API and implementation 
+ *
+ * Contributors:
+ * 		IBM Corporation - initial API and implementation
  * 		Sebastian Davids <sdavids@gmx.de> - bug 93374
  **************************************************************************************************/
 package org.eclipse.help.ui.internal;
@@ -228,14 +228,14 @@
 			}
 		}
 	}
-	
+
 	public static void showIndex() {
 		HelpView helpView = getHelpView();
         if (helpView != null) {
 		    helpView.showIndex();
         }
 	}
-	
+
 	private static HelpView getHelpView() {
 		HelpView view = null;
 		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
@@ -251,7 +251,7 @@
 					}
 				} catch (PartInitException e) {
 				}
-			} 
+			}
 		}
 		return view;
 	}
@@ -285,7 +285,7 @@
 
 	/**
 	 * Displays context-sensitive help for specified context
-	 * 
+	 *
 	 * @param context
 	 *            the context to display
 	 * @param x
@@ -341,7 +341,7 @@
 							if (isSingleChoiceWithoutDescription) {
 								view.showHelp(topics[0].getHref());
 							} else {
-								view.displayContext(context, activePart, c);				
+								view.displayContext(context, activePart, c);
 							}
 						}
 					}
@@ -373,7 +373,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.ui.help.AbstractHelpUI#resolve(java.lang.String, boolean)
 	 */
 	private static Shell getActiveShell() {
@@ -415,7 +415,7 @@
 	private void displayContextAsHelpTray(Shell activeShell, IContext context) {
 		Control controlInFocus = activeShell.getDisplay().getFocusControl();
 		TrayDialog dialog = (TrayDialog)activeShell.getData();
-		
+
 		DialogTray tray = dialog.getTray();
 		if (tray == null) {
 			tray = new HelpTray();
@@ -488,7 +488,7 @@
 		}
 		return false;
 	}
-	
+
 	public static boolean showInWorkbenchBrowser(String url, boolean onlyInternal) {
 		IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
 		if (!onlyInternal || support.isInternalWebBrowserAvailable()) {
@@ -512,7 +512,7 @@
 	/*
 	 * Used to indicate to the HelpView that we are about to pass in a context
 	 */
-	
+
 	public static boolean isOpeningHelpView() {
 		return openingHelpView;
 	}
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/DynamicHelpAction.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/DynamicHelpAction.java
index 0f6e22d..16dcad9 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/DynamicHelpAction.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/DynamicHelpAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ExecuteCommandAction.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ExecuteCommandAction.java
index b5b76af..8a03d14 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ExecuteCommandAction.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ExecuteCommandAction.java
@@ -28,7 +28,7 @@
  * service. This class is intended to be called by the
  * <code>executeCommand</code> function in <code>livehelp.js</code> (defined
  * in <code>org.eclipse.help</code> plugin).
- * 
+ *
  * @since 3.2
  */
 public class ExecuteCommandAction implements ILiveHelpAction {
@@ -51,7 +51,7 @@
 			// No command to execute!
 			return;
 		}
-		
+
 		// workaround problem described in https://bugs.eclipse.org/bugs/show_bug.cgi?id=133694
 		// by making sure we can get the workbench before running the command.  In standalone
 		// help mode the attempt to get the workbench will fail and we will show an error dialog.
@@ -74,7 +74,7 @@
 		});
 
 	}
-	
+
 	/**
 	 * This was introduced to work around the behavior described in
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=130206
@@ -125,7 +125,7 @@
 	}
 
 	private IHandlerService getHandlerService() {
-		IWorkbench wb =	PlatformUI.getWorkbench(); 
+		IWorkbench wb =	PlatformUI.getWorkbench();
 		if (wb != null) {
 			Object serviceObject = wb.getAdapter(IHandlerService.class);
 		    if (serviceObject != null) {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpActivitySupport.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpActivitySupport.java
index b93bc63..aefe7d6 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpActivitySupport.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpActivitySupport.java
@@ -43,16 +43,16 @@
 	private boolean userCanToggleFiltering;
 	private boolean filteringEnabled;
 	private ActivityDescriptor activityDescriptor;
-	
+
 	class ActivityDescriptor {
 		private IConfigurationElement config;
 		private String documentMessage;
 		private boolean needsLiveHelp;
-		
+
 		public ActivityDescriptor() {
 			load();
 		}
-		
+
 		private void load() {
 			IConfigurationElement [] elements = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.help.base.activitySupport");//$NON-NLS-1$
 			if (elements.length==1 && elements[0].getName().equals("support")) //$NON-NLS-1$
@@ -60,7 +60,7 @@
 			else if (elements.length>0) {
 				IProduct product = Platform.getProduct();
 				if (product==null) return;
-				String productId = product.getId(); 
+				String productId = product.getId();
 				for (int i=0; i<elements.length; i++) {
 					IConfigurationElement element = elements[i];
 					if (element.getAttribute("productId").equals(productId)) { //$NON-NLS-1$
@@ -113,13 +113,13 @@
 			return "javascript:liveAction(\""+pluginId+"\", \""+className+"\",\""+evalue+"\")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 		}
 	}
-	
+
 
 	public HelpActivitySupport(IWorkbench workbench) {
 		activitySupport = workbench.getActivitySupport();
 		activityDescriptor = new ActivityDescriptor();
 
-		String showDisabledActivities = 
+		String showDisabledActivities =
 			Platform.getPreferencesService().getString(HelpBasePlugin.PLUGIN_ID, PREF_KEY_SHOW_DISABLED_ACTIVITIES, "", null); //$NON-NLS-1$
 		userCanToggleFiltering = SHOW_DISABLED_ACTIVITIES_OFF
 				.equalsIgnoreCase(showDisabledActivities)
@@ -185,7 +185,7 @@
 	 * Checks whether topic belongs to a TOC that mathes enabled activity.
 	 * Enabled children TOCs are searched if linked by also enabled TOCs.
 	 * Additionally topic may match description topic of a root TOC.
-	 * 
+	 *
 	 * @return true if topic belongs to an enabled TOC
 	 * @param href
 	 * @param locale
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpUIEvaluationContext.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpUIEvaluationContext.java
index 5f67a79..1efa79a 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpUIEvaluationContext.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpUIEvaluationContext.java
@@ -23,9 +23,9 @@
 
 	private static final String VARIABLE_PLATFORM = "platform"; //$NON-NLS-1$
 	private static final String VARIABLE_WORKBENCH = "workbench"; //$NON-NLS-1$
-	
+
 	private static EvaluationContext context;
-	
+
 	/*
 	 * Returns the evaluation context to use in help documents.
 	 */
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpUIPlugin.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpUIPlugin.java
index 7379ce5..10d2aaf 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpUIPlugin.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpUIPlugin.java
@@ -60,7 +60,7 @@
 
 	/**
 	 * Provides access to singleton
-	 * 
+	 *
 	 * @return HelpUIPlugin
 	 */
 	public static HelpUIPlugin getDefault() {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpUIResources.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpUIResources.java
index 851ea0f..3bba371 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpUIResources.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HelpUIResources.java
@@ -26,18 +26,18 @@
  * class needs to properly use the desired locale.
  */
 public class HelpUIResources {
-	
+
 	private static final String LEAF = "_leaf"; //$NON-NLS-1$
 	private static final String CLOSED = "_closed"; //$NON-NLS-1$
 	private static final String OPEN = "_open"; //$NON-NLS-1$
-	private static final String EXT_PT = "org.eclipse.help.toc"; //$NON-NLS-1$ 
+	private static final String EXT_PT = "org.eclipse.help.toc"; //$NON-NLS-1$
 	private static final String TOC_ICON_ELEMENT = "tocIcon"; //$NON-NLS-1$
 	private static final String TOC_ICON_ID = "id"; //$NON-NLS-1$
 	private static final String OPEN_ICON_PATH = "openIcon"; //$NON-NLS-1$
 	private static final String CLOSED_ICON_PATH = "closedIcon"; //$NON-NLS-1$
 	private static final String LEAF_ICON_PATH= "leafIcon"; //$NON-NLS-1$
 	private static boolean iconsInitialized = false;
-	
+
 	/**
 	 * WorkbenchResources constructor comment.
 	 */
@@ -51,7 +51,7 @@
 		IPath path = new Path("$nl$/icons/").append(name); //$NON-NLS-1$
 		return FileLocator.find(HelpUIPlugin.getDefault().getBundle(), path, null);
 	}
-	
+
 	/**
 	 * Returns an image descriptor from a property file
 	 * @param name simple image file name
@@ -68,29 +68,29 @@
 		}
 		return desc;
 	}
-	
+
 	public static ImageDescriptor getImageDescriptor(String bundleId, String name) {
-		ImageRegistry registry = HelpUIPlugin.getDefault().getImageRegistry();		
+		ImageRegistry registry = HelpUIPlugin.getDefault().getImageRegistry();
 		ImageDescriptor desc = registry.getDescriptor(name);
 		if (desc==null) {
 			Bundle bundle = Platform.getBundle(bundleId);
 			if (bundle==null) return null;
-			URL url = FileLocator.find(bundle, new Path(name), null);			
+			URL url = FileLocator.find(bundle, new Path(name), null);
 			desc = ImageDescriptor.createFromURL(url);
 			registry.put(name, desc);
 		}
 		return desc;
 	}
-	
+
 	public static ImageDescriptor getIconImageDescriptor(String bundleId, String path, String key) {
-		ImageRegistry registry = HelpUIPlugin.getDefault().getImageRegistry();		
-		ImageDescriptor desc = registry.getDescriptor(key);		
+		ImageRegistry registry = HelpUIPlugin.getDefault().getImageRegistry();
+		ImageDescriptor desc = registry.getDescriptor(key);
 		if (desc==null) {
 			Bundle bundle = Platform.getBundle(bundleId);
 			if (bundle == null) return null;
-			URL url = FileLocator.find(bundle, new Path(path), null);			
+			URL url = FileLocator.find(bundle, new Path(path), null);
 			desc = ImageDescriptor.createFromURL(url);
-			registry.put(key, desc); 
+			registry.put(key, desc);
 		}
 		return desc;
 	}
@@ -105,7 +105,7 @@
 		ImageRegistry registry = HelpUIPlugin.getDefault().getImageRegistry();
 		return registry.get(key);
 	}
-	
+
 	/**
 	 * Get the image for an icon based upon the id
 	 * @param iconId The id of the icon, may be null, if so a null image is returned
@@ -120,7 +120,7 @@
 		initializeTocIcons();
 		String suffix;
 		if (isOpen) {
-			suffix = OPEN; 
+			suffix = OPEN;
 		} else if (isLeaf) {
 			suffix = LEAF;
 		} else {
@@ -132,13 +132,13 @@
 		}
 		return lookupImage(iconId + OPEN);
 	}
-	
+
 	private static Image lookupImage(String name) {
 		ImageRegistry registry = HelpUIPlugin.getDefault().getImageRegistry();
 		return registry.get(name);
 	}
-	
-	private static void initializeTocIcons(){	
+
+	private static void initializeTocIcons(){
 		if (iconsInitialized) {
 			return;
 		}
@@ -147,29 +147,29 @@
 		IExtension[] extensionsFound = Platform.getExtensionRegistry().getExtensionPoint(EXT_PT).getExtensions();
 
 		for(int i=0; i < extensionsFound.length; i++){
-			
-			IConfigurationElement[] configElements = extensionsFound[i].getConfigurationElements();		
+
+			IConfigurationElement[] configElements = extensionsFound[i].getConfigurationElements();
 			for(int j=0; j < configElements.length; j++){
-           	  if (configElements[j].getName().equals(TOC_ICON_ELEMENT)){         		   
+           	  if (configElements[j].getName().equals(TOC_ICON_ELEMENT)){
            		   IConfigurationElement iconElem = configElements[j];
            		   String attrs[] = iconElem.getAttributeNames();
            		   String contributorID = iconElem.getContributor().getName();
-           		   
-					for (int k=0; k < attrs.length; k++){						
-						if(attrs[k].equals(OPEN_ICON_PATH))							
-							HelpUIResources.getIconImageDescriptor(contributorID, iconElem.getAttribute(OPEN_ICON_PATH), iconElem.getAttribute(TOC_ICON_ID) + OPEN); 												
+
+					for (int k=0; k < attrs.length; k++){
+						if(attrs[k].equals(OPEN_ICON_PATH))
+							HelpUIResources.getIconImageDescriptor(contributorID, iconElem.getAttribute(OPEN_ICON_PATH), iconElem.getAttribute(TOC_ICON_ID) + OPEN);
 						if(attrs[k].equals(CLOSED_ICON_PATH))
-							HelpUIResources.getIconImageDescriptor(contributorID, iconElem.getAttribute(CLOSED_ICON_PATH), iconElem.getAttribute(TOC_ICON_ID) + CLOSED); 
+							HelpUIResources.getIconImageDescriptor(contributorID, iconElem.getAttribute(CLOSED_ICON_PATH), iconElem.getAttribute(TOC_ICON_ID) + CLOSED);
 						if(attrs[k].equals(LEAF_ICON_PATH))
-							HelpUIResources.getIconImageDescriptor(contributorID, iconElem.getAttribute(LEAF_ICON_PATH), iconElem.getAttribute(TOC_ICON_ID) + LEAF); 
+							HelpUIResources.getIconImageDescriptor(contributorID, iconElem.getAttribute(LEAF_ICON_PATH), iconElem.getAttribute(TOC_ICON_ID) + LEAF);
 					}
-							
+
 				}
-				
-			}	
+
+			}
 		}
 	}
-	
+
 	/**
 	 * Returns an image from a property file
 	 * @param name simple image file name
@@ -183,9 +183,9 @@
 		getImageDescriptor(name);
 		return registry.get(name);
 	}
-	
+
 	public static Image getImage(URL url) {
-		ImageRegistry registry = HelpUIPlugin.getDefault().getImageRegistry();	
+		ImageRegistry registry = HelpUIPlugin.getDefault().getImageRegistry();
 		String name = url.toString();
 		ImageDescriptor desc = registry.getDescriptor(name);
 		if (desc==null) {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HyperlinkHandler.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HyperlinkHandler.java
index fdac101..f23f232 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HyperlinkHandler.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HyperlinkHandler.java
@@ -293,7 +293,7 @@
 
 	/**
 	 * Sent when an event that the receiver has registered for occurs.
-	 * 
+	 *
 	 * @param event
 	 *            the event which occurred
 	 */
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HyperlinkLabel.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HyperlinkLabel.java
index 40ba840..69048f6 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HyperlinkLabel.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/HyperlinkLabel.java
@@ -41,7 +41,7 @@
 import org.eclipse.swt.widgets.TypedListener;
 
 /**
- * 
+ *
  * A canvas holding a hyperlink label. Need this to deal with focus selection.
  */
 public class HyperlinkLabel extends Canvas {
@@ -50,7 +50,7 @@
 
 	/**
 	 * Constructor for Hyperlink.
-	 * 
+	 *
 	 * @param parent
 	 * @param style
 	 */
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/IHelpUIConstants.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/IHelpUIConstants.java
index dbeae85..774f69e 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/IHelpUIConstants.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/IHelpUIConstants.java
@@ -23,10 +23,10 @@
 			+ "prefPageHelpContent"; //$NON-NLS-1$
 	public static final String PREF_PAGE_CUSTOM_BROWSER_PATH = HELP_UI_PLUGIN_ID
 			+ "prefPageCustomBrowserPath"; //$NON-NLS-1$
-	
+
 	public static final String IMAGE_FILE_F1TOPIC = "obj16/topic_small.gif"; //$NON-NLS-1$
 	public static final String IMAGE_COMMAND_F1TOPIC = "obj16/command_small.gif"; //$NON-NLS-1$
-	
+
 	// Help view images
 	public static final String IMAGE_CONTAINER = "obj16/container_obj.gif"; //$NON-NLS-1$
 	public static final String IMAGE_TOC_CLOSED= "obj16/toc_closed.gif"; //$NON-NLS-1$
@@ -36,7 +36,7 @@
 	public static final String IMAGE_HELP_SEARCH = "etool16/helpsearch_co.gif"; //$NON-NLS-1$
 	public static final String IMAGE_HELP_PRINT = "etool16/print_topic.gif"; //$NON-NLS-1$
 	public static final String IMAGE_RELATED_TOPICS = "etool16/reltopics_co.gif"; //$NON-NLS-1$
-	public static final String IMAGE_ALL_TOPICS = "etool16/alltopics_co.gif"; //$NON-NLS-1$	
+	public static final String IMAGE_ALL_TOPICS = "etool16/alltopics_co.gif"; //$NON-NLS-1$
 	public static final String IMAGE_INDEX = "etool16/index_co.gif"; //$NON-NLS-1$
 	public static final String IMAGE_HELP = "etool16/help.gif"; //$NON-NLS-1$
 	public static final String IMAGE_DHELP = "view16/help_view.gif"; //$NON-NLS-1$
@@ -51,7 +51,7 @@
 	public static final String IMAGE_D_REDUCE = "dlcl16/reduce_font.gif"; //$NON-NLS-1$
 	public static final String IMAGE_COLLAPSE_ALL = "elcl16/collapseall.gif"; //$NON-NLS-1$
 	public static final String IMAGE_SYNC_TOC = "elcl16/synch_toc_nav.gif"; //$NON-NLS-1$
-	public static final String IMAGE_SHOW_ALL = "elcl16/show_all.gif"; //$NON-NLS-1$	
+	public static final String IMAGE_SHOW_ALL = "elcl16/show_all.gif"; //$NON-NLS-1$
 	public static final String IMAGE_DOC_OVR = "ovr16/doc_co.gif"; //$NON-NLS-1$
 	public static final String IMAGE_SCOPE_SET = "obj16/scopeset_obj.gif"; //$NON-NLS-1$
 	public static final String IMAGE_SEARCH_WIZ = "wizban/newsearch_wiz.gif"; //$NON-NLS-1$
@@ -60,7 +60,7 @@
 	public static final String HV_FSEARCH = "fsearch"; //$NON-NLS-1$
 	public static final String HV_SEARCH_RESULT = "search-result"; //$NON-NLS-1$
 	public static final String HV_FSEARCH_RESULT = "fsearch-result"; //$NON-NLS-1$
-	
+
 	public static final String HV_TOPIC_TREE = "topic-tree"; //$NON-NLS-1$
 	public static final String HV_BOOKMARKS_TREE = "bookmarks-tree"; //$NON-NLS-1$
 	public static final String HV_BOOKMARKS_HEADER = "bookmarks-header"; //$NON-NLS-1$
@@ -74,7 +74,7 @@
 	public static final String HV_RELATED_TOPICS = "related-topics"; //$NON-NLS-1$
 	public static final String HV_CONTEXT_HELP_PAGE = "context-help-page"; //$NON-NLS-1$
 	public static final String HV_MISSING_CONTENT = "missing-content"; //$NON-NLS-1$
-	
+
 	public static final String HV_INDEX = "index"; //$NON-NLS-1$
 	public static final String HV_INDEX_TYPEIN = "index-typein"; //$NON-NLS-1$
 	public static final String HV_INDEX_PAGE = "index-page"; //$NON-NLS-1$
@@ -83,7 +83,7 @@
 	static final String ENGINE_EXP_ID = "org.eclipse.help.ui.searchEngine"; //$NON-NLS-1$
 	static final String TAG_ENGINE = "engine"; //$NON-NLS-1$
 	static final String ATT_ID = "id"; //$NON-NLS-1$
-	
+
 	static final String ATT_LABEL ="label"; //$NON-NLS-1$
 	static final String ATT_ICON = "icon";//$NON-NLS-1$
 	static final String ATT_CLASS = "class";//$NON-NLS-1$
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/IHyperlinkListener.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/IHyperlinkListener.java
index d7f0472..ec023a2 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/IHyperlinkListener.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/IHyperlinkListener.java
@@ -13,7 +13,7 @@
 import org.eclipse.swt.widgets.*;
 
 /**
- *  
+ *
  */
 public interface IHyperlinkListener {
 	/**
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/Messages.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/Messages.java
index 3895dee..caa1992 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/Messages.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/Messages.java
@@ -124,11 +124,11 @@
 	public static String BrowserPart_reduceTooltip;
 	public static String BrowserPart_highlightTooltip;
 	public static String BrowserPart_printTooltip;
-	public static String BrowserPart_syncTocTooltip;	
+	public static String BrowserPart_syncTocTooltip;
 	public static String HelpPreferencePage_wlabel;
 	public static String HelpPreferencePage_view;
 	public static String HelpPreferencePage_helpBrowser;
-	public static String HelpPreferencePage_externalBrowser;	
+	public static String HelpPreferencePage_externalBrowser;
 	public static String HelpPreferencePage_dlabel;
 	public static String HelpPreferencePage_tray;
 	public static String HelpPreferencePage_search;
@@ -150,7 +150,7 @@
 	public static String AskShowAll_dialogTitle;
 	public static String AskShowAll_message;
 	public static String AskShowAll_toggleMessage;
-	
+
 	public static String DefaultHelpUI_wtitle;
 	public static String DefaultHelpUI_noPerspMessage;
 	public static String ContextHelpDialog_showInDynamicHelp;
@@ -165,7 +165,7 @@
 	public static String HelpPreferencePage_openInPlace;
 	public static String HelpPreferencePage_openInEditor;
 	public static String HelpPreferencePage_openInBrowser;
-	
+
 	public static String ReusableHelpPart_internalBrowserTitle;
 	public static String ReusableHelpPart_internalWebBrowserError;
 	public static String ScopeSet_errorLoading;
@@ -174,13 +174,13 @@
 	public static String ScopeSet_selectWorkingSet;
 	public static String IndexInstructions;
 	public static String IndexButton;
-	
+
 	public static String NoWorkbenchForExecuteCommand_msg;
-	
+
 	public static String SearchEmbeddedHelpOnly;
 	public static String SearchEmbeddedHelpFirst;
 	public static String SearchEmbeddedHelpLast;
-	
+
 	// Remote Help Preferences
 	public static String AddICDialog_10;
 
@@ -197,7 +197,7 @@
 	public static String AddICDialog_7;
 
 	public static String AddICDialog_8;
-	
+
 	public static String AddICDialog_9;
 
 	public static String EditICDialog_10;
@@ -209,7 +209,7 @@
 	public static String EditICDialog_13;
 
 	public static String EditICDialog_14;
-	
+
 	public static String EditICDialog_15;
 
 	public static String EditICDialog_7;
@@ -255,7 +255,7 @@
 	public static String ViewICPropsDialog_13;
 
 	public static String ViewICPropsDialog_14;
-	
+
 	public static String ViewICPropsDialog_19;
 
 	public static String ViewICPropsDialog_20;
@@ -277,6 +277,6 @@
 	public static String See;
 	public static String SeeAlso;
 	public static String SeeList;
-	
+
 	public static String AlternateQueries;
 }
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/SearchAction.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/SearchAction.java
index 1998ecd..cb829aa 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/SearchAction.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/SearchAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ShowCapabilitiesPreferenceAction.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ShowCapabilitiesPreferenceAction.java
index cc35bbf..cd959ca 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ShowCapabilitiesPreferenceAction.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ShowCapabilitiesPreferenceAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ShowInTocAction.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ShowInTocAction.java
index 2164875..060fad9 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ShowInTocAction.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/ShowInTocAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 public class ShowInTocAction implements ILiveHelpAction {
 
 	private String path;
-	
+
 	@Override
 	public void setInitializationString(String data) {
 		path = data;
@@ -43,7 +43,7 @@
 			});
 		}
 	}
-	
+
 	private IHelpResource getHelpResource() {
 		StringTokenizer tok = new StringTokenizer(path, "_"); //$NON-NLS-1$
 		int index = Integer.parseInt(tok.nextToken());
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/EmbeddedBrowser.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/EmbeddedBrowser.java
index e430008..32939cb 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/EmbeddedBrowser.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/EmbeddedBrowser.java
@@ -112,14 +112,14 @@
 				HelpApplication.stopHelp();
 			}
 		});
-							
+
 		browser = new Browser(shell, SWT.NONE);
 		browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
 		initialize(browser);
-		
+
 		createStatusBar(shell);
 		initializeStatusBar(browser);
-		
+
 		// use saved location and size
 		x = Platform.getPreferencesService().getInt(HelpUIPlugin.PLUGIN_ID, BROWSER_X, 0, null);
 		y = Platform.getPreferencesService().getInt(HelpUIPlugin.PLUGIN_ID, BROWSER_Y, 0, null);
@@ -184,7 +184,7 @@
 	/**
 	 * Constructor for derived help window It is either secondary browser or a
 	 * help dialog
-	 * 
+	 *
 	 * @param event
 	 * @param parent
 	 *            Shell or null
@@ -237,7 +237,7 @@
 				}
 			}
 		});
-		
+
 	}
 	private void initialize(Browser browser) {
 		browser.addOpenWindowListener(event -> {
@@ -298,7 +298,7 @@
 			}
 		});
 	}
-	
+
 	private void initializeStatusBar(Browser browser) {
 		browser.addStatusTextListener(event -> {
 			event.text = event.text.replaceAll("&", "&&"); //$NON-NLS-1$ //$NON-NLS-2$
@@ -326,7 +326,7 @@
 			}
 		});
 	}
-	
+
 	private void createStatusBar(Composite parent) {
 		statusBar = new Composite(parent, SWT.NONE);
 		statusBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
@@ -357,7 +357,7 @@
 		data.heightHint = Math.max(statusBarText.computeSize(SWT.DEFAULT, SWT.DEFAULT).y, statusBarProgress.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
 		statusBarSeparator.setLayoutData(data);
 	}
-	
+
 	public void displayUrl(String url) {
 		browser.setUrl(url);
 		shell.setMinimized(false);
@@ -433,7 +433,7 @@
 	}
 	/**
 	 * Obtains URLs to product image
-	 * 
+	 *
 	 * @return String[] with URLs as Strings or null
 	 */
 	private static String[] getProductImageURLs() {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/EmbeddedBrowserAdapter.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/EmbeddedBrowserAdapter.java
index f8617b1..9321662 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/EmbeddedBrowserAdapter.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/EmbeddedBrowserAdapter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,9 +25,9 @@
 	private UIThread2 secondThread;
 	private String browserType;
 	class UIThread2 extends Thread {
-		
+
 		Display d;
-		
+
 		boolean runEventLoop = true;
 
 		public UIThread2() {
@@ -103,7 +103,7 @@
 	}
 	/**
 	 * Must be run on UI thread
-	 * 
+	 *
 	 * @param url
 	 */
 	private void uiDisplayURL(final String url) {
@@ -131,7 +131,7 @@
 		}
 	}
 	/**
-	 *  
+	 *
 	 */
 	private EmbeddedBrowser getBrowser() {
 		if (browser == null || browser.isDisposed()) {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/EmbeddedBrowserFactory.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/EmbeddedBrowserFactory.java
index 9bdd1f9..6ab7971 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/EmbeddedBrowserFactory.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/EmbeddedBrowserFactory.java
@@ -59,7 +59,7 @@
 
 	/**
 	 * Must run on UI thread
-	 * 
+	 *
 	 * @return
 	 */
 	private boolean test() {
@@ -79,7 +79,7 @@
 					// Browser not implemented
 					available = false;
 				} else {
-					Status errorStatus = new Status(IStatus.WARNING, HelpUIPlugin.PLUGIN_ID, IStatus.OK, 
+					Status errorStatus = new Status(IStatus.WARNING, HelpUIPlugin.PLUGIN_ID, IStatus.OK,
 							"An error occurred during creation of embedded help browser.", new Exception(se)); //$NON-NLS-1$
 					HelpPlugin.getDefault().getLog().log(errorStatus);
 				}
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/IBrowserCloseListener.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/IBrowserCloseListener.java
index 64eb9ee..8693758 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/IBrowserCloseListener.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/browser/embedded/IBrowserCloseListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/dynamic/FilterResolverExtension.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/dynamic/FilterResolverExtension.java
index 7553892..5929569 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/dynamic/FilterResolverExtension.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/dynamic/FilterResolverExtension.java
@@ -29,7 +29,7 @@
 	public boolean isHandled(String name) {
 		return (name.equals(NAME_ACTIVITY) || name.equals(NAME_CATEGORY));
 	}
-	
+
 	@Override
 	public boolean isFiltered(String name, String value) {
 		if (name.equals(NAME_ACTIVITY)) {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/handlers/OpenBundleResourceHandler.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/handlers/OpenBundleResourceHandler.java
index 847349c..e037777 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/handlers/OpenBundleResourceHandler.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/handlers/OpenBundleResourceHandler.java
@@ -44,15 +44,15 @@
 				if(pluginPath.startsWith("/")) //$NON-NLS-1$
 					pluginPath = pluginPath.substring(1);
 				url = new URL(Platform.getInstanceLocation().getURL().toString()+pluginId+"/"+pluginPath); //$NON-NLS-1$
-				workspaceFile = new File(url.getFile());	
+				workspaceFile = new File(url.getFile());
 				if(!workspaceFile.exists())
-				{	
+				{
 					url = BaseHelpSystem.resolve("/" + pluginId + '/' + pluginPath , true); //$NON-NLS-1$
 					if (url == null)
 					{
 						errorMessage="file not found:" + pluginId+"/"+pluginPath; //$NON-NLS-1$ //$NON-NLS-2$
 						throw new ExecutionException(errorMessage);
-					}		
+					}
 				}
 			}
 			catch (Exception ex) {
@@ -64,8 +64,8 @@
 		try {
 			IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench()
 					.getBrowserSupport();
-			
-			IWebBrowser browser = browserSupport.createBrowser(browserId); 
+
+			IWebBrowser browser = browserSupport.createBrowser(browserId);
 			browser.openURL(url);
 		} catch (PartInitException ex) {
 			throw new ExecutionException("error opening browser", ex); //$NON-NLS-1$
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/handlers/ShowIndexHandler.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/handlers/ShowIndexHandler.java
index 1c9ac4b..4dca72f 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/handlers/ShowIndexHandler.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/handlers/ShowIndexHandler.java
@@ -26,34 +26,34 @@
  */
 
 public class ShowIndexHandler extends AbstractHandler {
-	
+
 	/*
 	 * Currently returns true, could be controlled by a preference
 	 * in the future
 	 */
     private boolean isOpenInHelpView() {
-    	boolean searchFromBrowser = 
+    	boolean searchFromBrowser =
     		Platform.getPreferencesService().getBoolean(HelpBasePlugin.PLUGIN_ID,IHelpBaseConstants.P_KEY_SEARCH_FROM_BROWSER, false, null);
 	    return !searchFromBrowser;
 	}
-	
+
 	@Override
 	public Object execute(ExecutionEvent event) throws ExecutionException {
-		if (isOpenInHelpView()) { 
+		if (isOpenInHelpView()) {
 			openInHelpView();
 		} else {
 			openInBrowser();
 		}
 		return null;
 	}
-	
+
 	private void openInBrowser() {
 		PlatformUI.getWorkbench().getHelpSystem();
 		BaseHelpSystem.getHelpDisplay().displayHelpResource("tab=index", false); //$NON-NLS-1$
 	}
-	
+
 	private void openInHelpView() {
-		DefaultHelpUI.showIndex();		
+		DefaultHelpUI.showIndex();
 	}
 
 }
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/HelpContentPreferencePage.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/HelpContentPreferencePage.java
index 322cd7e..002e04f 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/HelpContentPreferencePage.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/HelpContentPreferencePage.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -40,7 +40,7 @@
  */
 public class HelpContentPreferencePage extends PreferencePage implements
 		IWorkbenchPreferencePage {
-	
+
 	private ICTable table;
 	private ICButtons buttons;
 
@@ -63,27 +63,27 @@
 	{
 		return table;
 	}
-	
+
 	@Override
 	protected Control createContents(Composite parent) {
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
 				IHelpUIConstants.PREF_PAGE_HELP_CONTENT);
 
 		initializeDialogUnits(parent);
-		
+
 		descLabel = new Label(parent, SWT.NONE);
 		descLabel.setText(Messages.HelpContentPage_title);
 		Dialog.applyDialogFont(descLabel);
-		
+
 		createSearchLocalHelpOnly(parent);
 		createSearchLocalHelpFirst(parent);
 		createSearchLocalHelpLast(parent);
-		
+
 /*		remoteICPage = new InfocenterDisplay(this);
 		remoteICPage.createContents(parent);
 */
 		initializeTableEnablement(parent,searchLocalHelpOnly.getSelection());
-		
+
 		return parent;
 	}
 
@@ -93,8 +93,8 @@
 
 		List<IC> ics = ICPreferences.getDefaultICs();
 		table.setICs(ics);
-		
-		// Restore Defaults functionality here		
+
+		// Restore Defaults functionality here
 /*		HelpContentBlock currentBlock=remoteICPage.getHelpContentBlock();
 		currentBlock.getRemoteICviewer().getRemoteICList().removeAllRemoteICs(currentBlock.getRemoteICList());
 		currentBlock.getRemoteICviewer().getRemoteICList().loadDefaultPreferences();
@@ -114,12 +114,12 @@
 		IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(HelpBasePlugin.PLUGIN_ID);
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see org.eclipse.jface.preference.PreferencePage#performOk()
 		 */
 		prefs.putBoolean(IHelpBaseConstants.P_KEY_REMOTE_HELP_ON, !(searchLocalHelpOnly.getSelection()));
 		prefs.putBoolean(IHelpBaseConstants.P_KEY_REMOTE_HELP_PREFERRED, searchLocalHelpLast.getSelection());
-	
+
 
 		List<IC> ics = table.getICs();
 		ICPreferences.setICs(ics);
@@ -140,45 +140,45 @@
 
 		boolean isRemoteOn = Platform.getPreferencesService().getBoolean
 		    (HelpBasePlugin.PLUGIN_ID, IHelpBaseConstants.P_KEY_REMOTE_HELP_ON, false, null);
-		
+
 		searchLocalHelpOnly.setSelection(!isRemoteOn);
-		Dialog.applyDialogFont(searchLocalHelpOnly);	
+		Dialog.applyDialogFont(searchLocalHelpOnly);
 	}
-	
+
 	private void createSearchLocalHelpFirst(Composite parent) {
 		searchLocalHelpFirst = new Button(parent, SWT.RADIO);
 		searchLocalHelpFirst.setText(Messages.SearchEmbeddedHelpFirst);
 		searchLocalHelpFirst.addListener(SWT.Selection, changeListener);
-		
+
 		boolean isRemoteOn = Platform.getPreferencesService().getBoolean
 	    	(HelpBasePlugin.PLUGIN_ID, IHelpBaseConstants.P_KEY_REMOTE_HELP_ON, false, null);
 		boolean isRemotePreferred = Platform.getPreferencesService().getBoolean
 	    	(HelpBasePlugin.PLUGIN_ID, IHelpBaseConstants.P_KEY_REMOTE_HELP_PREFERRED, false, null);
-		
+
 		searchLocalHelpFirst.setSelection(isRemoteOn && !isRemotePreferred);
 		Dialog.applyDialogFont(searchLocalHelpFirst);
 	}
-	
+
 	private void createSearchLocalHelpLast(Composite parent) {
 		searchLocalHelpLast = new Button(parent, SWT.RADIO);
 		searchLocalHelpLast.setText(Messages.SearchEmbeddedHelpLast);
 		searchLocalHelpLast.addListener(SWT.Selection, changeListener);
-		
+
 		boolean isRemoteOn = Platform.getPreferencesService().getBoolean
 			(HelpBasePlugin.PLUGIN_ID, IHelpBaseConstants.P_KEY_REMOTE_HELP_ON, false, null);
 		boolean isRemotePreferred = Platform.getPreferencesService().getBoolean
 			(HelpBasePlugin.PLUGIN_ID, IHelpBaseConstants.P_KEY_REMOTE_HELP_PREFERRED, false, null);
-		
+
 		searchLocalHelpLast.setSelection(isRemoteOn && isRemotePreferred);
 		Dialog.applyDialogFont(searchLocalHelpLast);
 	}
-	
+
 	/*
-	 * Initialize the table enablement with the current checkbox selection 
+	 * Initialize the table enablement with the current checkbox selection
 	 */
-	
+
 	private void initializeTableEnablement(Composite parent, boolean isRemoteHelpDisabled)
-	{		
+	{
 		Composite top = new Composite(parent, SWT.NONE);
 
 		GridLayout layout = new GridLayout();
@@ -191,7 +191,7 @@
 
 		table = new ICTable(top);
 		buttons = new ICButtons(top,this);
-		
+
 		changeListener.handleEvent(null);
 	}
 
@@ -202,10 +202,10 @@
 	private Listener changeListener = event -> {
 
 		boolean isRemoteHelpEnabled = !(searchLocalHelpOnly.getSelection());
-		
+
 		// Disable/Enable table
 		table.getTable().setEnabled(isRemoteHelpEnabled);
 		buttons.setEnabled(isRemoteHelpEnabled);
 	};
-	
+
 }
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/HelpPreferencePage.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/HelpPreferencePage.java
index 4248efc..2df11b4 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/HelpPreferencePage.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/HelpPreferencePage.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -50,18 +50,18 @@
 	private static final String WBROWSER_PAGE_ID = "org.eclipse.ui.browser.preferencePage";//$NON-NLS-1$
 
 	private Combo useExternalCombo;
-	
+
 	private Combo searchLocationCombo;
-	
+
 	private Combo openModeCombo;
-	
+
 	private Combo dialogHelpCombo;
-	
+
 	private Combo windowHelpCombo;
 
 	/**
 	 * Creates preference page controls on demand.
-	 * 
+	 *
 	 * @param parent
 	 *            the parent for the preference page
 	 */
@@ -80,8 +80,8 @@
 		mainComposite.setLayout(layout);
 		Label description = new Label(mainComposite, SWT.NONE);
 		description.setText(Messages.select_browser);
-		
-		createOpenModesPrefs(mainComposite);	
+
+		createOpenModesPrefs(mainComposite);
 		createDynamicHelpArea(mainComposite);
 		createSpacer(mainComposite);
 		Dialog.applyDialogFont(mainComposite);
@@ -96,7 +96,7 @@
 		createSearchLocation(group);
 		createHelpViewOpenPrefs(group);
 		createOpenContents(group);
-		createLinkArea(group);	
+		createLinkArea(group);
 	}
 
 	private void createDynamicHelpArea(Composite parent) {
@@ -104,7 +104,7 @@
 		GridLayout layout = new GridLayout();		group.setLayout(layout);
 		group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
 		group.setText(Messages.HelpPreferencePage_contextHelpGroup);
-		
+
 		createWindowContextPrefs(group);
 		createDialogContextPrefs(group);
 	}
@@ -126,7 +126,7 @@
 		if (BrowserManager.getInstance().isEmbeddedBrowserPresent()) {
 		    Label isExternalLabel = new Label(mainComposite, SWT.NONE);
 		    isExternalLabel.setText(Messages.HelpPreferencePage_openContents);
-		    isExternalLabel.setLayoutData(createLabelData());		
+		    isExternalLabel.setLayoutData(createLabelData());
 			useExternalCombo = new Combo(mainComposite, SWT.READ_ONLY);
 			useExternalCombo.add(Messages.HelpPreferencePage_helpBrowser);
 			useExternalCombo.add(Messages.HelpPreferencePage_externalBrowser);
@@ -165,7 +165,7 @@
 			String openMode = Platform.getPreferencesService().getString
 			     (HelpBasePlugin.PLUGIN_ID, IHelpBaseConstants.P_KEY_HELP_VIEW_OPEN_MODE,
 			      IHelpBaseConstants.P_IN_PLACE, null);
-			openModeCombo.setText(openModeToString(openMode));		
+			openModeCombo.setText(openModeToString(openMode));
 		}
 	}
 
@@ -186,7 +186,7 @@
 		Label whelpDescription = new Label(group, SWT.NONE);
 		whelpDescription.setText(Messages.HelpPreferencePage_wlabel);
 		whelpDescription.setLayoutData(createLabelData());
-		
+
 		windowHelpCombo = new Combo(group, SWT.READ_ONLY);
 		windowHelpCombo.add(Messages.HelpPreferencePage_view);
 		windowHelpCombo.add(Messages.HelpPreferencePage_infopop);
@@ -195,13 +195,13 @@
 		    (HelpBasePlugin.PLUGIN_ID, IHelpBaseConstants.P_KEY_WINDOW_INFOPOP, false, null);
 		windowHelpCombo.setText(winfopop ? Messages.HelpPreferencePage_infopop : Messages.HelpPreferencePage_view);
 	}
-	
+
 	private GridData createLabelData () {
 		GridData data = new GridData(SWT.FILL, SWT.CENTER, true, false);
 		data.verticalIndent = 5;
 		return data;
 	}
-	
+
 	private IPreferenceNode getPreferenceNode(String pageId) {
 		Iterator<IPreferenceNode> iterator = PlatformUI.getWorkbench().getPreferenceManager()
 				.getElements(PreferenceManager.PRE_ORDER).iterator();
@@ -235,18 +235,18 @@
 		if (useExternalCombo != null) {
 			boolean useExternal = defaults.getBoolean(
 							IHelpBaseConstants.P_KEY_ALWAYS_EXTERNAL_BROWSER, false);
-			useExternalCombo.setText(useExternal ? Messages.HelpPreferencePage_externalBrowser : Messages.HelpPreferencePage_helpBrowser);		
-		}	
-		
+			useExternalCombo.setText(useExternal ? Messages.HelpPreferencePage_externalBrowser : Messages.HelpPreferencePage_helpBrowser);
+		}
+
 		boolean searchFromBrowser = defaults.getBoolean(IHelpBaseConstants.P_KEY_SEARCH_FROM_BROWSER, false);
 		searchLocationCombo.setText(searchFromBrowser ? Messages.HelpPreferencePage_openInBrowser : Messages.HelpPreferencePage_view);
-		
+
 		boolean winfopop = defaults.getBoolean(IHelpBaseConstants.P_KEY_WINDOW_INFOPOP, false);
 		windowHelpCombo.setText(winfopop ? Messages.HelpPreferencePage_infopop : Messages.HelpPreferencePage_view);
 
 		boolean dinfopop = defaults.getBoolean(IHelpBaseConstants.P_KEY_DIALOG_INFOPOP, false);
 		dialogHelpCombo.setText(dinfopop ? Messages.HelpPreferencePage_infopop : Messages.HelpPreferencePage_tray);
-	
+
 		if (openModeCombo !=null) {
 		   String openMode = defaults.get(
 						IHelpBaseConstants.P_KEY_HELP_VIEW_OPEN_MODE, IHelpBaseConstants.P_IN_PLACE);
@@ -263,15 +263,15 @@
 	public boolean performOk() {
 		IEclipsePreferences pref = InstanceScope.INSTANCE.getNode(HelpBasePlugin.PLUGIN_ID);
 		if (useExternalCombo != null) {
-			boolean isExternalBrowser = useExternalCombo.getText().equals(Messages.HelpPreferencePage_externalBrowser);		
+			boolean isExternalBrowser = useExternalCombo.getText().equals(Messages.HelpPreferencePage_externalBrowser);
 			pref.putBoolean(IHelpBaseConstants.P_KEY_ALWAYS_EXTERNAL_BROWSER,
 					isExternalBrowser);
 			BrowserManager.getInstance().setAlwaysUseExternal(
 					isExternalBrowser);
 		}
-		pref.putBoolean(IHelpBaseConstants.P_KEY_SEARCH_FROM_BROWSER, 
+		pref.putBoolean(IHelpBaseConstants.P_KEY_SEARCH_FROM_BROWSER,
 				searchLocationCombo.getText().equals(Messages.HelpPreferencePage_openInBrowser));
-		
+
 		pref.putBoolean(IHelpBaseConstants.P_KEY_WINDOW_INFOPOP,
 				windowHelpCombo.getText().equals(Messages.HelpPreferencePage_infopop));
 
@@ -280,7 +280,7 @@
 		if (openModeCombo!=null) {
 			pref.put(IHelpBaseConstants.P_KEY_HELP_VIEW_OPEN_MODE, openModeFromString(openModeCombo.getText()));
 		}
-		
+
 		try {
 			pref.flush();
 		} catch (BackingStoreException e) {
@@ -299,7 +299,7 @@
 			return Messages.HelpPreferencePage_openInPlace;
 		}
 	}
-	
+
 	private String openModeFromString(String openMode) {
 	    if (Messages.HelpPreferencePage_openInBrowser.equals(openMode)) {
 		    return IHelpBaseConstants.P_IN_BROWSER;
@@ -312,7 +312,7 @@
 
 	/**
 	 * Creates a horizontal spacer line that fills the width of its container.
-	 * 
+	 *
 	 * @param parent
 	 *            the parent control
 	 */
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/IC.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/IC.java
index 80acb1f..ab3612e 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/IC.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/IC.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 
 /**
  * Information Center (IC) - stores URL info.
- * 
+ *
  * @author chaustin
  *
  */
@@ -31,7 +31,7 @@
 	private String path;
 	private int port = -1;
 
-	
+
 	public IC(String name,String href,boolean enabled) throws MalformedURLException
 	{
 		this.name = name;
@@ -43,10 +43,10 @@
 	{
 		if (href.startsWith(":")) //$NON-NLS-1$
 			href = "http"+href; //$NON-NLS-1$
-		
+
 		setHref(new URL(href));
 	}
-	
+
 	public void setHref(URL url)
 	{
 		this.protocol = url.getProtocol();
@@ -61,7 +61,7 @@
 				port = 443;
 		}
 	}
-	
+
 	public String getHref()
 	{
 		String portString = ":"+port; //$NON-NLS-1$
@@ -69,17 +69,17 @@
 			portString = ""; //$NON-NLS-1$
 		else if (port==443 && protocol.equals("https")) //$NON-NLS-1$
 			portString = ""; //$NON-NLS-1$
-		
+
 		return protocol+"://"+host+portString+path; //$NON-NLS-1$
 	}
-	
-	
+
+
 	public String getName()
 	{
 		return name;
 	}
-	
-	
+
+
 	public boolean isEnabled()
 	{
 		return enabled;
@@ -133,16 +133,16 @@
 	/**
 	 * Tests to see if 2 ICs are equal.  The state (enabled or disabled) is ignored
 	 * during this operation.
-	 * 
+	 *
 	 */
 	@Override
 	public boolean equals(Object o)
 	{
 		if (!(o instanceof IC))
 			return false;
-		
+
 		IC candidate = (IC)o;
-		
+
 		if (getName().equals(candidate.getName())
 				&& getPath().equals(candidate.getPath())
 				&& getPort()==candidate.getPort()
@@ -151,7 +151,7 @@
 			try {
 				InetAddress host1 = InetAddress.getByName(getHost());
 				InetAddress host2 = InetAddress.getByName(candidate.getHost());
-				
+
 				if (host1.getHostAddress().equals(host2.getHostAddress()))
 					return true;
 			} catch (UnknownHostException e) {
@@ -159,7 +159,7 @@
 					return true;
 			}
 		}
-		
+
 		return false;
 	}
 }
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICButtons.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICButtons.java
index 93389a1..23b8857 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICButtons.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICButtons.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -31,7 +31,7 @@
 public class ICButtons implements SelectionListener{
 
 	private HelpContentPreferencePage page;
-	
+
 	private Button addIC;
 	private Button editIC;
 	private Button removeIC;
@@ -45,7 +45,7 @@
 	public ICButtons(Composite parent,HelpContentPreferencePage page)
 	{
 		this.page = page;
-		
+
 		Composite container = new Composite(parent, SWT.NONE);
 		GridLayout layout = new GridLayout();
 		layout.marginHeight = 0;
@@ -58,7 +58,7 @@
 		editIC = createPushButton(container, Messages.HelpContentBlock_editICTitle);
 		removeIC = createPushButton(container, Messages.HelpContentBlock_removeICTitle);
 		testIC = createPushButton(container, Messages.HelpContentBlock_testConnectionTitle);
-		
+
 		String enableTitle = Messages.HelpContentBlock_3.length() > Messages.HelpContentBlock_4.length() ?
 				Messages.HelpContentBlock_3 : Messages.HelpContentBlock_4;
 		enableIC = createPushButton(container, enableTitle);
@@ -66,17 +66,17 @@
 		moveDown = createPushButton(container, Messages.HelpContentBlock_downTitle);
 
 		page.getTable().getTable().addSelectionListener(this);
-		
-		
+
+
 		updateButtonStates();
 	}
-	
+
 	public void setEnabled(boolean enabled)
 	{
 		this.enabled  = enabled;
 		updateButtonStates();
 	}
-	
+
 	public Button createPushButton(Composite parent, String buttonText) {
 		Button button = new Button(parent, SWT.PUSH);
 		button.setFont(parent.getFont());
@@ -123,30 +123,30 @@
 			updateButtonStates();
 		}
 	}
-	
+
 	public void editIC()
 	{
 		IStructuredSelection selection = (IStructuredSelection)page.getTable().getSelection();
 		IC ic = (IC)selection.getFirstElement();
 		if (ic==null)
 			return;
-		
+
 		ICDialog dialog = new ICDialog(page.getShell(),ic);
-		
+
 		if (dialog.open() == Window.OK) {
 			page.getTable().editIC(dialog.getIC());
 			updateButtonStates();
 		}
 	}
-	
+
 	public void removeIC()
 	{
 		IStructuredSelection selection = (IStructuredSelection)page.getTable().getSelection();
 		List<IC> ics = selection.toList();
 		String remove = ""; //$NON-NLS-1$
-		
+
 		for (int i=0;i<ics.size();i++)
-		{			
+		{
 			remove+="\n"+ics.get(i); //$NON-NLS-1$
 		}
 
@@ -154,7 +154,7 @@
 	          MessageDialog.openQuestion(
 	        	page.getShell(),
 	            NLS.bind(Messages.HelpContentBlock_rmvTitle ,""), //$NON-NLS-1$
-	            NLS.bind(Messages.HelpContentBlock_rmvLabel ,remove));	
+	            NLS.bind(Messages.HelpContentBlock_rmvLabel ,remove));
 
 		if (shouldRemove)
 		{
@@ -163,22 +163,22 @@
 			updateButtonStates();
 		}
 	}
-	
+
 	public void testIC()
-	{		
+	{
 		IStructuredSelection selection = (IStructuredSelection)page.getTable().getSelection();
 		IC ic = (IC)selection.getFirstElement();
 		if (ic==null)
 			return;
-	
+
 		ICDialog dialog = new ICDialog(page.getShell(),ic,true);
-		
+
 		if (dialog.open() == Window.OK) {
 			page.getTable().editIC(dialog.getIC());
 			updateButtonStates();
-		}		
-		
-		
+		}
+
+
 /*		boolean connected = TestConnectionUtility.testConnection(ic.getHost(),
 					ic.getPort()+"", ic.getPath(),ic.getProtocol());
 		TestICDialog dialog = new TestICDialog(page.getShell(),ic);
@@ -186,50 +186,50 @@
 		dialog.open();
 */
 	}
-	
+
 	public void enableIC()
 	{
 		int indexes[] = page.getTable().getTable().getSelectionIndices();
 		IStructuredSelection selection = (IStructuredSelection)page.getTable().getSelection();
 		List<IC> ics = selection.toList();
-		
+
 		boolean enable = enableIC.getText().equals(Messages.HelpContentBlock_4);
-		
+
 		for (int i=0;i<ics.size();i++)
 		{
 			ics.get(i).setEnabled(enable);
 			page.getTable().getTableViewer().replace(ics.get(i), indexes[i]);
 		}
 		page.getTable().refresh();
-		
+
 		updateButtonStates();
 	}
-	
+
 	public void move(int offset)
 	{
 		int index = page.getTable().getTable().getSelectionIndices()[0];
-		
+
 		List<IC> ics = page.getTable().getICs();
 		IC x = ics.get(index);
 		IC y = ics.get(index + offset);
 
 		ics.set(index+offset,x);
 		ics.set(index,y);
-		
+
 
 		page.getTable().getTableViewer().getContentProvider().inputChanged(
 				page.getTable().getTableViewer(), null, ics);
-		
+
 		page.getTable().getTableViewer().replace(x,index+offset);
 		page.getTable().getTableViewer().replace(y,index);
 		page.getTable().refresh();
-		
+
 		page.getTable().getTable().deselectAll();
 		page.getTable().getTable().select(index+offset);
 		updateButtonStates();
-		
+
 	}
-	
+
 	public void updateButtonStates()
 	{
 		if (!enabled)
@@ -243,9 +243,9 @@
 			removeIC.setEnabled(false);
 			return;
 		}
-		
+
 		addIC.setEnabled(true);
-		
+
 		IC firstIC = (IC)(((IStructuredSelection)page.getTable().getSelection()).getFirstElement());
 		if (firstIC!=null)
 		{
@@ -260,7 +260,7 @@
 				moveDown.setEnabled(index!=page.getTable().getICs().size()-1);
 			}
 			else
-			{	
+			{
 				editIC.setEnabled(false);
 				testIC.setEnabled(false);
 				moveUp.setEnabled(false);
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICDialog.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICDialog.java
index a873e6f..fe526d6 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICDialog.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICDialog.java
@@ -43,7 +43,7 @@
 public class ICDialog extends StatusDialog implements Listener, SelectionListener {
 
 	private IC ic = null;
-	
+
 	private Text nameText;
 	private Text hrefText;
 
@@ -80,25 +80,25 @@
 		topGroup.setLayout(layout);
 		topGroup.setFont(top.getFont());
 		topGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
-		
+
 		Label label = new Label(topGroup, SWT.NONE);
 		label.setText(Messages.AddICDialog_4);
-		
+
 		nameText = new Text(topGroup, SWT.BORDER);
 		nameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
 		if (nameText.getOrientation() == SWT.RIGHT_TO_LEFT)
 			nameText.setOrientation(SWT.LEFT_TO_RIGHT);
 		nameText.addListener(SWT.Modify, this);
-		
+
 		label = new Label(topGroup, SWT.NONE);
 		label.setText(Messages.InfoCenterPage_url);
-		
+
 		hrefText = new Text(topGroup, SWT.BORDER);
 		hrefText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
 		if (hrefText.getOrientation() == SWT.RIGHT_TO_LEFT)
 			hrefText.setOrientation(SWT.LEFT_TO_RIGHT);
 		hrefText.addListener(SWT.Modify, this);
-		
+
 
 		if (ic!=null)
 		{
@@ -108,9 +108,9 @@
 		}
 		else
 			this.getShell().setText(Messages.AddICDialog_2);
-		
 
-		Dialog.applyDialogFont(top);	
+
+		Dialog.applyDialogFont(top);
 		return top;
 
 	}
@@ -119,22 +119,22 @@
 	protected void createButtonsForButtonBar(Composite parent) {
 
 		testButton = this.createButton(
-				parent, 
-				IDialogConstants.CLIENT_ID, 
-				Messages.HelpContentBlock_testConnectionTitle, 
+				parent,
+				IDialogConstants.CLIENT_ID,
+				Messages.HelpContentBlock_testConnectionTitle,
 				true);
 		testButton.addSelectionListener(this);
 		super.createButtonsForButtonBar(parent);
-		
+
 
 		//Initialize validity
 		updateValidity();
-		
+
 		if (testConnect)
 			testConnection();
 	}
-	
-	
+
+
 	@Override
 	public void initializeBounds() {
 		Point size = getInitialSize();
@@ -142,28 +142,28 @@
 		this.getShell().setBounds(location.x, location.y,
 				size.x + 180, size.y);
 	}
-	
+
 	@Override
 	public void okPressed() {
 		try {
 			String href = formalizeHref(hrefText.getText());
-			
+
 			ic = new IC(nameText.getText(),href,true);
 		} catch (MalformedURLException e) {}  // This should never happen since we test in updateValidity
 		this.setReturnCode(OK);
 		this.close();
 	}
-	
+
 	public String formalizeHref(String href)
 	{
 		if (href.endsWith("/index.jsp")) //$NON-NLS-1$
 			href = href.substring(0,href.lastIndexOf("/index.jsp")); //$NON-NLS-1$
 		else if (href.endsWith("/site/site.xml")) //$NON-NLS-1$
 			href = href.substring(0,href.lastIndexOf("/site/site.xml")); //$NON-NLS-1$
-		
+
 		return href;
 	}
-	
+
 	/*
 	 * Checks for errors in the user input and shows/clears the error message
 	 * as appropriate.
@@ -182,18 +182,18 @@
 
 				if (!href.matches(".*\\://.+/.+")) //$NON-NLS-1$
 					status = new Status(IStatus.ERROR,"org.eclipse.help.ui",Messages.InfoCenterPage_invalidURL); //$NON-NLS-1$
-									
+
 			} catch (MalformedURLException e) {
 				status = new Status(IStatus.ERROR,"org.eclipse.help.ui",Messages.InfoCenterPage_invalidURL); //$NON-NLS-1$
 			}
 		}
-		
+
 //		if (testButton!=null)
 //			testButton.setEnabled(status.isOK());
-		
+
 		this.updateStatus(status);
 	}
-	
+
 	private boolean areFieldsValid()
 	{
 		if (nameText!=null && nameText.getText().equals(""))  //$NON-NLS-1$
@@ -206,14 +206,14 @@
 
 				if (!href.matches(".*\\://.+/.+")) //$NON-NLS-1$
 					return false;
-									
+
 			} catch (MalformedURLException e) {
 				return false;
 			}
-		}	
+		}
 		return true;
 	}
-	
+
 	private void testConnection()
 	{
 		IC testIC;
@@ -222,13 +222,13 @@
 			testIC = new IC(nameText.getText(),formalizeHref(hrefText.getText()),true);
 			boolean connected = TestConnectionUtility.testConnection(testIC.getHost(),
 						testIC.getPort()+"", testIC.getPath(),testIC.getProtocol()); //$NON-NLS-1$
-			
+
 
 			if(connected)
 				status = new Status(IStatus.INFO,"org.eclipse.help.ui",Messages.TestConnectionDialog_12); //$NON-NLS-1$
 			else
 				status = new Status(IStatus.WARNING,"org.eclipse.help.ui",Messages.TestConnectionDialog_13); //$NON-NLS-1$
-			
+
 		} catch (MalformedURLException e) {
 
 			status = new Status(IStatus.WARNING,"org.eclipse.help.ui",Messages.TestConnectionDialog_13); //$NON-NLS-1$
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICPreferences.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICPreferences.java
index cb427b9..68878e6 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICPreferences.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICPreferences.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,11 +27,11 @@
 
 	public final static String DELIMITER = ","; //$NON-NLS-1$
 
-	
+
 	public static void setICs(List<IC> ics)
 	{
-		String name = "", host = "", path = "", protocol="", port = "", enabled = ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ 
-		
+		String name = "", host = "", path = "", protocol="", port = "", enabled = ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+
 		for (int i=0;i<ics.size();i++)
 		{
 			name += ics.get(i).getName() + DELIMITER;
@@ -41,7 +41,7 @@
 			path += ics.get(i).getPath() + DELIMITER;
 			enabled += ics.get(i).isEnabled() + DELIMITER;
 		}
-		
+
 		// Remove trailing commas
 		if(ics.size()!=0)
 		{
@@ -52,7 +52,7 @@
 			path = path.substring(0,path.length()-1);
 			enabled = enabled.substring(0,enabled.length()-1);
 		}
-		
+
 		set("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_NAME, name); //$NON-NLS-1$
 		set("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_HOST, host); //$NON-NLS-1$
 		set("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PATH, path); //$NON-NLS-1$
@@ -62,7 +62,7 @@
 
 		HelpPlugin.getTocManager().clearCache();
 	}
-	
+
 	public static List<IC> getICs()
 	{
 		return prefsToICs(
@@ -73,15 +73,15 @@
 				ICPreferences.get("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PATH).split(DELIMITER), //$NON-NLS-1$
 				ICPreferences.get("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_ICEnabled).split(DELIMITER)); //$NON-NLS-1$
 	}
-	
+
 	public static List<IC> prefsToICs(String names[],String protocols[],String hosts[],String ports[],String paths[],String states[])
 	{
 		List<IC> ics = new ArrayList<>();
-		
+
 		for (int i=0;i<names.length;i++)
 		{
 			if (!names[i].equals("")) //$NON-NLS-1$
-			{				
+			{
 				try {
 					IC ic = new IC(
 						names[i],
@@ -99,11 +99,11 @@
 		}
 		return ics;
 	}
-	
 
-	
+
+
 	public static List<IC> getDefaultICs()
-	{		
+	{
 		return prefsToICs(
 				getDefault("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_NAME).split(DELIMITER), //$NON-NLS-1$
 				getDefault("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PROTOCOL).split(DELIMITER), //$NON-NLS-1$
@@ -112,11 +112,11 @@
 				getDefault("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PATH).split(DELIMITER), //$NON-NLS-1$
 				getDefault("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_ICEnabled).split(DELIMITER)); //$NON-NLS-1$
 	}
-	
+
 
 	/**
 	 * Returns a default preference for the given name
-	 * 
+	 *
 	 * @param plugin - Name of the plugin containing this preference
 	 * @param name - Name of the preference to retrieve
 	 * @return value, or empty string if no preference found
@@ -125,22 +125,22 @@
 	{
 		return getDefaultNode(plugin).get(name, ""); //$NON-NLS-1$
 	}
-	
+
 	public static void setRemoteHelp(boolean enabled)
 	{
 		set("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_ON,enabled+""); //$NON-NLS-1$ //$NON-NLS-2$
 		HelpPlugin.getTocManager().clearCache();
 	}
-	
+
 	public static void setRemoteHelpPreferred(boolean remotePreferred)
 	{
 		set("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PREFERRED,remotePreferred+""); //$NON-NLS-1$ //$NON-NLS-2$
 		HelpPlugin.getTocManager().clearCache();
 	}
-	
+
 	/**
 	 * Sets a preference
-	 * 
+	 *
 	 * @param plugin - Name of the plugin containing this preference
 	 * @param name - Name of the preference
 	 * @param value - Value to set
@@ -148,11 +148,11 @@
 	public static void set(String plugin,String name,String value)
 	{
 		set(getNode(plugin),name,value);
-	}	
-	
+	}
+
 	/**
 	 * Set a preference in the given node.
-	 * 
+	 *
 	 * @param node
 	 * @param name
 	 * @param value
@@ -163,11 +163,11 @@
 		try {
 			node.flush();
 		} catch (BackingStoreException e) {} //Nothing we can do, move on
-	}	
-	
+	}
+
 	/**
 	 * Returns the preference found for the given name
-	 * 
+	 *
 	 * @param plugin - Name of the plugin containing this preference
 	 * @param name - Name of the preference to retrieve
 	 * @return value, or empty string if no preference found
@@ -176,10 +176,10 @@
 	{
 		return getNode(plugin).get(name, ""); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Get the IEclipsePreferences node for the given plugin
-	 * 
+	 *
 	 * @param plugin
 	 * @return
 	 */
@@ -188,17 +188,17 @@
 		IEclipsePreferences p = InstanceScope.INSTANCE.getNode(plugin);
 		return p;
 	}
-	
+
 
 	/**
 	 * Get the default IEclipsePreferences node for the given plugin
-	 * 
+	 *
 	 * @param plugin
 	 * @return
 	 */
 	public static IEclipsePreferences getDefaultNode(String plugin)
-	{		
+	{
 		IEclipsePreferences p = DefaultScope.INSTANCE.getNode(plugin);
 		return p;
-	}	
+	}
 }
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICTable.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICTable.java
index f43b437..866c22c 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICTable.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/ICTable.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -39,22 +39,22 @@
 	private Table table;
 	private TableViewer viewer;
 
-	private final String NAME_COLUMN = Messages.RemoteICViewer_Name; 
-	private final String LOCATION_COLUMN = Messages.RemoteICViewer_URL; 
+	private final String NAME_COLUMN = Messages.RemoteICViewer_Name;
+	private final String LOCATION_COLUMN = Messages.RemoteICViewer_URL;
 	private final String STATUS_COLUMN = Messages.RemoteICViewer_Enabled;
 
 	// Set column names
 	private String[] columnNames = new String[] {NAME_COLUMN,
 			LOCATION_COLUMN, STATUS_COLUMN};
-	
-	
+
+
 	public ICTable(Composite parent) {
 
 		// Create the table
 		table = createTable(parent);
 		// Create and setup the TableViewer
 		viewer = createTableViewer();
-		
+
 		loadPreferences();
 	}
 
@@ -88,32 +88,32 @@
 		gridData.heightHint =  table.getItemHeight();
 		gridData.horizontalSpan = 1;
 		table.setLayoutData(gridData);
-		
-		
+
+
 
 		ColumnLayoutData[] fTableColumnLayouts= {
 		        new ColumnWeightData(85),
 		        new ColumnWeightData(165),
 		        new ColumnWeightData(60)
-		};  
-		
+		};
+
 		TableColumn column;
-		
+
 		tableLayout.addColumnData(fTableColumnLayouts[0]);
 	    column = new TableColumn(table, SWT.NONE, 0);
 	    column.setResizable(fTableColumnLayouts[0].resizable);
 	    column.setText(NAME_COLUMN);
-	    
+
 	    tableLayout.addColumnData(fTableColumnLayouts[1]);
 	    column = new TableColumn(table, SWT.NONE, 1);
 	    column.setResizable(fTableColumnLayouts[1].resizable);
-	    column.setText(LOCATION_COLUMN); 
-	    
+	    column.setText(LOCATION_COLUMN);
+
 	    tableLayout.addColumnData(fTableColumnLayouts[2]);
 	    column = new TableColumn(table, SWT.NONE, 2);
 	    column.setResizable(fTableColumnLayouts[2].resizable);
-	    column.setText(STATUS_COLUMN); 
-	    
+	    column.setText(STATUS_COLUMN);
+
 	    return table;
 	}
 
@@ -132,13 +132,13 @@
 
 	/**
 	 * Proxy for the the RemoteICList which provides content
-	 * for the Table. This class implements IRemoteHelpListViewer interface an 
+	 * for the Table. This class implements IRemoteHelpListViewer interface an
 	 * registers itself with RemoteICList
 	 */
 	class ICContentProvider implements IStructuredContentProvider
 	{
 		private List<IC> content = new ArrayList<>();
-		
+
 		@Override
 		public void dispose() {
 			content = null;
@@ -154,9 +154,9 @@
 		public IC[] getElements(Object inputElement) {
 			return content.toArray(new IC[content.size()]);
 		}
-		
+
 	}
-	
+
 	public class ICLabelProvider extends LabelProvider implements ITableLabelProvider {
 
 		@Override
@@ -179,10 +179,10 @@
 		}
 
 	}
-	
-	
-	
-	
+
+
+
+
 	/**
 	 * @param rics the ordered remote InfoCenters
 	 */
@@ -190,17 +190,17 @@
 		viewer.getContentProvider().inputChanged(viewer, null, ics);
 		refresh();
 	}
-	
+
 	/**
-	 * Make sure the table viewer shows the latest copy of the ordered InfoCenters 
+	 * Make sure the table viewer shows the latest copy of the ordered InfoCenters
 	 */
 	public void refresh() {
 		viewer.refresh(getICs());
 	}
-	
+
 	/**
 	 * Return the column names in a collection
-	 * 
+	 *
 	 * @return List containing column names
 	 */
 	public List<String> getColumnNames() {
@@ -213,7 +213,7 @@
 	public ISelection getSelection() {
 		return viewer.getSelection();
 	}
-	
+
 	/**
 	 * Return the RemoteICList
 	 */
@@ -231,11 +231,11 @@
 		List<IC> oldICs = getICs();
 		for (int o=0;o<oldICs.size();o++)
 			removeIC(oldICs.get(o));
-			
+
 		for (int i=0;i<ics.size();i++)
 			addIC(ics.get(i));
 	}
-	
+
 	public TableViewer getTableViewer()
 	{
 		return viewer;
@@ -250,7 +250,7 @@
 	public Table getTable() {
 		return table;
 	}
-	
+
 	public void addIC(IC ic)
 	{
 		List<IC> content = getICs();
@@ -260,9 +260,9 @@
 		getTableViewer().add(ic);
 		refresh();
 	}
-	
+
 	public void editIC(IC ic)
-	{	
+	{
 		List<IC> content = getICs();
 		content.set(getTable().getSelectionIndex(), ic);
 		getTableViewer().replace(ic,getTable().getSelectionIndex());
@@ -270,7 +270,7 @@
 				getTableViewer(), null, content);
 		refresh();
 	}
-	
+
 	public void removeIC(IC ic)
 	{
 		List<IC> content = getICs();
@@ -279,7 +279,7 @@
 		getTableViewer().remove(ic);
 		refresh();
 	}
-	
+
 	private void loadPreferences()
 	{
 		List<IC> ics = ICPreferences.getICs();
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/TabFolderLayout.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/TabFolderLayout.java
index 2be3ca3..ec50107 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/TabFolderLayout.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/preferences/TabFolderLayout.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
 	protected Point computeSize (Composite composite, int wHint, int hHint, boolean flushCache) {
 		if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT)
 			return new Point(wHint, hHint);
-			
+
 		Control [] children = composite.getChildren ();
 		int count = children.length;
 		int maxWidth = 0, maxHeight = 0;
@@ -34,20 +34,20 @@
 			maxWidth = Math.max (maxWidth, pt.x);
 			maxHeight = Math.max (maxHeight, pt.y);
 		}
-		
+
 		if (wHint != SWT.DEFAULT)
 			maxWidth= wHint;
 		if (hHint != SWT.DEFAULT)
 			maxHeight= hHint;
-		
-		return new Point(maxWidth, maxHeight);	
-		
+
+		return new Point(maxWidth, maxHeight);
+
 	}
-	
+
 	@Override
 	protected void layout (Composite composite, boolean flushCache) {
 		Rectangle rect= composite.getClientArea();
-	
+
 		Control[] children = composite.getChildren();
 		for (int i = 0; i < children.length; i++) {
 			children[i].setBounds(rect);
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpCriteriaContentProvider.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpCriteriaContentProvider.java
index a51572e..d0d9c56 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpCriteriaContentProvider.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpCriteriaContentProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 import org.eclipse.jface.viewers.Viewer;
 
 public class HelpCriteriaContentProvider implements ITreeContentProvider {
-	
+
 	public static final String UNCATEGORIZED = "Uncategorized"; //$NON-NLS-1$
 
 	public static class CriterionName{
@@ -26,14 +26,14 @@
 			this.id = id;
 			this.parent = parent;
 		}
-		
+
 		private String id;
 		private Object parent;
-		
+
 		public String getId() {
 			return id;
 		}
-		
+
 		public String getName() {
 			return HelpPlugin.getCriteriaManager().getCriterionDisplayName(id, Platform.getNL());
 		}
@@ -41,7 +41,7 @@
 		public Object getParent() {
 			return parent;
 		}
-		
+
 		@Override
 		public boolean equals(Object arg0) {
 			if (arg0 instanceof CriterionName) {
@@ -50,26 +50,26 @@
 			}
 			return false;
 		}
-		
+
 		@Override
 		public int hashCode() {
 			return id.hashCode();
 		}
 	}
-	
+
 	public static class CriterionValue{
 		public CriterionValue(String id, Object parent) {
 			this.id = id;
 			this.parent = parent;
 		}
-		
+
 		private String id;
 		private Object parent;
-		
+
 		public String getId() {
 			return id;
 		}
-		
+
 		public String getName() {
 			if (id.equals(UNCATEGORIZED)) {
 				return Messages.UncategorizedCriteria;
@@ -81,7 +81,7 @@
 		public Object getParent() {
 			return parent;
 		}
-		
+
 		@Override
 		public boolean equals(Object arg0) {
 			if (arg0 instanceof CriterionValue) {
@@ -90,7 +90,7 @@
 			}
 			return false;
 		}
-		
+
 		@Override
 		public int hashCode() {
 			return id.hashCode() + parent.hashCode();
@@ -118,7 +118,7 @@
 			return criterionNames;
 		} else if (parentElement instanceof CriterionName) {
 			CriterionName parentCriterion = (CriterionName) parentElement;
-			
+
 			String[] values = BaseHelpSystem.getWorkingSetManager().getCriterionValueIds(parentCriterion.getId());
 		    CriterionValue[] criterionValues = new CriterionValue[values.length];
 			for (int i = 0; i < values.length; i++) {
@@ -139,7 +139,7 @@
 			return ((CriterionName) element).getParent();
 		} else if (element instanceof CriterionValue) {
 			return ((CriterionValue) element).getParent();
-		} else 
+		} else
 		return null;
 	}
 
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpCriteriaLabelProvider.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpCriteriaLabelProvider.java
index 82c3e54..19e204c 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpCriteriaLabelProvider.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpCriteriaLabelProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -43,7 +43,7 @@
 		} else if (element instanceof HelpCriteriaContentProvider.CriterionValue) {
 			CriterionValue criterionValue = (HelpCriteriaContentProvider.CriterionValue)element;
 			return criterionValue.getName();
-		} 
+		}
 		return null;
 	}
 
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpWorkingSetElementLabelProvider.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpWorkingSetElementLabelProvider.java
index 91a746e..98f49a1 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpWorkingSetElementLabelProvider.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpWorkingSetElementLabelProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpWorkingSetTreeContentProvider.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpWorkingSetTreeContentProvider.java
index 4cc3f60..3ded9a4 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpWorkingSetTreeContentProvider.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/HelpWorkingSetTreeContentProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/InfoCenterPage.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/InfoCenterPage.java
index 125d214..cef4026 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/InfoCenterPage.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/InfoCenterPage.java
@@ -59,7 +59,7 @@
 	//private boolean firstCheck;
 
 	private RemoteWorkingSet workingSet;
-	
+
 	private boolean tocStale;
 
 	class RemoteWorkingSet extends WorkingSet {
@@ -121,14 +121,14 @@
 		initializeDialogUnits(parent);
 
 		Label label = new Label(parent, SWT.NULL);
-		label.setText(Messages.InfoCenterPage_url); 
+		label.setText(Messages.InfoCenterPage_url);
 
 		urlText = new Text(parent, SWT.BORDER);
 		urlText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 		urlText.setEditable(getEngineDescriptor().isUserDefined());
 
 		searchAll = new Button(parent, SWT.RADIO);
-		searchAll.setText(Messages.selectAll); 
+		searchAll.setText(Messages.selectAll);
 		GridData gd = new GridData();
 		gd.horizontalSpan = 2;
 		searchAll.setLayoutData(gd);
@@ -142,7 +142,7 @@
 		});
 
 		searchSelected = new Button(parent, SWT.RADIO);
-		searchSelected.setText(Messages.selectWorkingSet); 
+		searchSelected.setText(Messages.selectWorkingSet);
 		gd = new GridData();
 		gd.horizontalSpan = 2;
 		searchSelected.setLayoutData(gd);
@@ -160,7 +160,7 @@
 
 		label = new Label(parent, SWT.WRAP);
 		label.setFont(font);
-		label.setText(Messages.WorkingSetContent); 
+		label.setText(Messages.WorkingSetContent);
 		gd = new GridData(GridData.GRAB_HORIZONTAL
 				| GridData.HORIZONTAL_ALIGN_FILL
 				| GridData.VERTICAL_ALIGN_CENTER);
@@ -201,7 +201,7 @@
 							() -> setSubtreeChecked(element, tree.getChecked(element), false));
 			}
 		});
-		
+
 		applyDialogFont(parent);
 
 		// Set help for the page
@@ -240,7 +240,7 @@
 			}
 		}
 	}
-	
+
 	private void resetRemoteTocs() {
 		remoteTocs = new AdaptableTocsArray(new IToc[0]);
 	}
@@ -338,7 +338,7 @@
 			}
 		});
 	}
-	
+
 	private void updateTocs() {
 		//String url = urlText.getText();
 		//busyLoadTocs(url);
@@ -355,14 +355,14 @@
 			}
 		});
 	}
-	
+
 	/*
 	private void busyLoadTocs(final String url) {
 		BusyIndicator.showWhile(urlText.getDisplay(), new Runnable() {
 			public void run() {
 				loadTocs(url);
 			}
-		});		
+		});
 	}
 	*/
 
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/InfoCenterSearchScopeFactory.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/InfoCenterSearchScopeFactory.java
index c0a5151..04317b0 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/InfoCenterSearchScopeFactory.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/InfoCenterSearchScopeFactory.java
@@ -27,7 +27,7 @@
 	public static final String P_SEARCH_SELECTED = "searchSelected"; //$NON-NLS-1$
 	public static final String P_TOCS = "tocs"; //$NON-NLS-1$
 	public static final String TOC_SEPARATOR = ";"; //$NON-NLS-1$
-    
+
 	@Override
 	public ISearchScope createSearchScope(IPreferenceStore store, String engineId,
 			Dictionary<String, Object> parameters) {
@@ -50,7 +50,7 @@
         }
         return new InfoCenter.Scope(url, searchSelected, tocs);
     }
-    
+
 	private String getProperty(String key, IPreferenceStore store, String engineId,
 			Dictionary<String, Object> parameters) {
     	// try the store first
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/LocalHelpPage.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/LocalHelpPage.java
index 0fd09e3..5505cea 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/LocalHelpPage.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/LocalHelpPage.java
@@ -54,7 +54,7 @@
 	private ITreeContentProvider contentTreeContentProvider;
 
 	private ILabelProvider contentTreeLabelProvider;
-	
+
 	private CheckboxTreeViewer criteriaTree;
 
 	private ITreeContentProvider criteriaTreeContentProvider;
@@ -86,7 +86,7 @@
 		initializeDialogUnits(parent);
 
 		searchAll = new Button(parent, SWT.RADIO);
-		searchAll.setText(Messages.selectAll); 
+		searchAll.setText(Messages.selectAll);
 		GridData gd = new GridData();
 		gd.horizontalSpan = 2;
 		searchAll.setLayoutData(gd);
@@ -102,7 +102,7 @@
 		});
 
 		searchSelected = new Button(parent, SWT.RADIO);
-		searchSelected.setText(Messages.selectWorkingSet); 
+		searchSelected.setText(Messages.selectWorkingSet);
 		gd = new GridData();
 		gd.horizontalSpan = 2;
 		searchSelected.setLayoutData(gd);
@@ -125,7 +125,7 @@
 
 		Label contentLabel = new Label(parent, SWT.WRAP);
 		contentLabel.setFont(font);
-		contentLabel.setText(Messages.WorkingSetContent); 
+		contentLabel.setText(Messages.WorkingSetContent);
 		gd = new GridData(GridData.GRAB_HORIZONTAL
 				| GridData.HORIZONTAL_ALIGN_FILL
 				| GridData.VERTICAL_ALIGN_CENTER);
@@ -133,11 +133,11 @@
 		contentLabel.setLayoutData(gd);
 
 		createContentTree(parent, font);
-		
+
 		if (HelpPlugin.getCriteriaManager().isCriteriaEnabled()) {
 			Label criteriaLabel = new Label(parent, SWT.WRAP);
 			criteriaLabel.setFont(font);
-			criteriaLabel.setText(Messages.WorkingSetCriteria); 
+			criteriaLabel.setText(Messages.WorkingSetCriteria);
 			gd = new GridData(GridData.GRAB_HORIZONTAL
 					| GridData.HORIZONTAL_ALIGN_FILL
 					| GridData.VERTICAL_ALIGN_CENTER);
@@ -145,7 +145,7 @@
 			criteriaLabel.setLayoutData(gd);
 		    createCriteriaTree(parent, font);
 		}
-		
+
 		initializeCheckedState();
 		applyDialogFont(parent);
 
@@ -201,7 +201,7 @@
 		}
 		return convertHeightInCharsToPixels(15);
 	}
-	
+
 
 	protected void createCriteriaTree(Composite parent, Font font) {
 		GridData gd;
@@ -261,7 +261,7 @@
 		return contentProvider.hasChildren(element);
 	}
 
-	void updateParentState(Object child, boolean baseChildState, 
+	void updateParentState(Object child, boolean baseChildState,
 			               CheckboxTreeViewer tree, ITreeContentProvider contentProvider) {
 		if (child == null)
 			return;
@@ -289,7 +289,7 @@
 	}
 
 	void setSubtreeChecked(Object parent, boolean state,
-			boolean checkExpandedState,  
+			boolean checkExpandedState,
             CheckboxTreeViewer tree, ITreeContentProvider contentProvider) {
 
 		Object[] children = contentProvider.getChildren(parent);
@@ -306,7 +306,7 @@
 	}
 
 	@SuppressWarnings({ "unchecked", "rawtypes" })
-	private void findCheckedElements(java.util.List checkedResources, Object parent,  
+	private void findCheckedElements(java.util.List checkedResources, Object parent,
             CheckboxTreeViewer tree, ITreeContentProvider contentProvider) {
 		Object[] children = contentProvider.getChildren(parent);
 		for (int i = 0; i < children.length; i++) {
@@ -316,8 +316,8 @@
 				checkedResources.add(children[i]);
 		}
 	}
-	
-	private CriterionResource[] findCheckedCriteria(Object parent,  
+
+	private CriterionResource[] findCheckedCriteria(Object parent,
             CheckboxTreeViewer tree, ITreeContentProvider contentProvider) {
 		Object[] children = contentProvider.getChildren(parent);
 		List<CriterionResource> resources = new ArrayList<>();
@@ -339,7 +339,7 @@
 		return resources.toArray(new CriterionResource[resources.size()]);
 	}
 
-	void handleCheckStateChange(final CheckStateChangedEvent event,  
+	void handleCheckStateChange(final CheckStateChangedEvent event,
             final CheckboxTreeViewer tree, final ITreeContentProvider contentProvider) {
 		BusyIndicator.showWhile(getShell().getDisplay(), () -> {
 			Object element = event.getElement();
@@ -361,8 +361,8 @@
 			criteria = new CriterionResource[0];
 		} else {
 			criteria = findCheckedCriteria(
-				criteriaTree.getInput(), 
-				criteriaTree, 
+				criteriaTree.getInput(),
+				criteriaTree,
 				criteriaTreeContentProvider);
 		}
 		findCheckedElements(elements, contentTree.getInput(), contentTree, contentTreeContentProvider);
@@ -426,7 +426,7 @@
 			}
 		}
 	}
-	
+
 	@Override
 	protected void performDefaults() {
 		searchAll.setSelection(true);
@@ -437,7 +437,7 @@
 		}
 		super.performDefaults();
 	}
-	
+
 	@Override
 	protected Label createDescriptionLabel(Composite parent) {
 		if ( getContainer() == null ) {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/LocalSearchScopeFactory.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/LocalSearchScopeFactory.java
index da7acdf..f15c8ee 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/LocalSearchScopeFactory.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/LocalSearchScopeFactory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,7 +25,7 @@
 public class LocalSearchScopeFactory implements ISearchScopeFactory {
     public final static String P_WORKING_SET = "workingSet"; //$NON-NLS-1$
     public final static String P_CAPABILITY_FILTERING = "capabilityFiltering";  //$NON-NLS-1$
-    
+
 	@Override
 	public ISearchScope createSearchScope(IPreferenceStore store, String engineId,
 			Dictionary<String, Object> parameters) {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/WebSearchPage.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/WebSearchPage.java
index 0cfda26..5c0195f 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/WebSearchPage.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/WebSearchPage.java
@@ -38,7 +38,7 @@
 		initializeDialogUnits(parent);
 
 		Label label = new Label(parent, SWT.NULL);
-		label.setText(Messages.WebSearchPage_label); 
+		label.setText(Messages.WebSearchPage_label);
 		GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
 		label.setLayoutData(gd);
 		urlText = new Text(parent, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL
@@ -51,7 +51,7 @@
 		urlText.setEditable(getEngineDescriptor().isUserDefined());
 		new Label(parent, SWT.NULL);
 		label = new Label(parent, SWT.WRAP);
-		label.setText(Messages.WebSearchPage_info); 
+		label.setText(Messages.WebSearchPage_info);
 		gd = new GridData(GridData.FILL_HORIZONTAL);
 		gd.widthHint = 100;
 		label.setLayoutData(gd);
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/WebSearchScopeFactory.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/WebSearchScopeFactory.java
index b2929c8..1cebaf1 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/WebSearchScopeFactory.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/WebSearchScopeFactory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,14 +22,14 @@
  */
 public class WebSearchScopeFactory implements ISearchScopeFactory {
 	public final static String P_URL = "url"; //$NON-NLS-1$
-    
+
 	@Override
 	public ISearchScope createSearchScope(IPreferenceStore store, String engineId,
 			Dictionary<String, Object> parameters) {
         String urlTemplate = getProperty(store, engineId, parameters);
         return new WebSearch.Scope(urlTemplate);
     }
-    
+
 	private String getProperty(IPreferenceStore store, String engineId,
 			Dictionary<String, Object> parameters) {
     	// try the store first
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/AbstractOverlayIcon.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/AbstractOverlayIcon.java
index 3edae8b..ccd5259 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/AbstractOverlayIcon.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/AbstractOverlayIcon.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/ErrorUtil.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/ErrorUtil.java
index e2a279c..7b53d9a 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/ErrorUtil.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/ErrorUtil.java
@@ -38,7 +38,7 @@
 
 	/**
 	 * Immediately displays error dialog with a given string
-	 * 
+	 *
 	 * @param msg
 	 *            error message to display and log.
 	 */
@@ -56,7 +56,7 @@
 
 	/**
 	 * Immediately displays an Information dialog with a given string
-	 * 
+	 *
 	 * @param msg
 	 *            error message to display.
 	 */
@@ -74,7 +74,7 @@
 
 	/**
 	 * Immediately displays a Question dialog with a given string (question).
-	 * 
+	 *
 	 * @return which button(Yes/No) was pressed by user
 	 */
 	public static boolean displayQuestionDialog(String msg) {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/EscapeUtils.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/EscapeUtils.java
index 1114c6a..66e18a7 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/EscapeUtils.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/EscapeUtils.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,7 +27,7 @@
 	public static String escapeSpecialChars(String value) {
 		return escapeSpecialChars(value, false);
 	}
-	
+
 	/**
 	 * Replace every occurrence of &, <, >, ', " by an escape character
 	 * but allow <b> and </b> through
@@ -38,11 +38,11 @@
 	public static String escapeSpecialCharsLeavinggBold(String value) {
 		return escapeSpecialChars(value, true);
 	}
-	
+
 	public static String escapeAmpersand(String value) {
 		return value.replaceAll("&", "&amp;"); //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	
+
 	/**
 	* Escape any ampersands used in a label
 	**/
@@ -52,7 +52,7 @@
 		if (message.indexOf('&') < 0) {
 			return message;
 		}
-		
+
 		int next = 0;
 		StringBuffer result = new StringBuffer();
 		int index = message.indexOf('&');
@@ -108,7 +108,7 @@
 							buf.append("<br/>"); //$NON-NLS-1$
 							i+= 3;
 							continue;
-						}					
+						}
 					}
 					if (i + 2 < length) {
 						String tag = value.substring(i, i + 3);
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/FontUtils.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/FontUtils.java
index 644f655..5362bd4 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/FontUtils.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/FontUtils.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 import org.eclipse.swt.widgets.Display;
 
 public class FontUtils {
-	
+
 	private static final int TRAY_FONT_HEIGHT_LIMIT = 17;
 
 	/*
@@ -31,7 +31,7 @@
 			return true;
 		}
 	}
-	
+
 	/*
 	 * Get a sequence of JavaScript which will scale the embedded browser contents
 	 * @param percent The percentage scaling relative to the default size
@@ -46,7 +46,7 @@
 		}
 		return null;  // No rescale in Mozilla browsers
 	}
-	
+
 	/*
 	 * Function to determine whether the browser in the help view supports a zoom command
 	 */
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/OverlayIcon.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/OverlayIcon.java
index 9ba4cc6..52b1202 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/OverlayIcon.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/util/OverlayIcon.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/AllTopicsPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/AllTopicsPart.java
index d0679e4..761e266 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/AllTopicsPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/AllTopicsPart.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -98,15 +98,15 @@
 			boolean expandable = treeViewer.isExpandable(obj);
 			if (obj instanceof Toc){
 				Toc toc = (Toc) obj;
-				Image icon   = HelpUIResources.getImageFromId(toc.getIcon(), expanded, !expandable); 
+				Image icon   = HelpUIResources.getImageFromId(toc.getIcon(), expanded, !expandable);
 				if (icon != null) {
 					return icon;
-				}						
+				}
 			}
-			
+
 			if (obj instanceof Topic) {
-				Topic topic = (Topic) obj;			
-				Image icon   = HelpUIResources.getImageFromId(topic.getIcon(), expanded, !expandable); 
+				Topic topic = (Topic) obj;
+				Image icon   = HelpUIResources.getImageFromId(topic.getIcon(), expanded, !expandable);
 				if (icon != null) {
 					return icon;
 				}
@@ -250,7 +250,7 @@
 			}
 		}
 	}
-	
+
 	public void selectReveal(IHelpResource res) {
 		treeViewer.setSelection(new StructuredSelection(res), true);
 		treeViewer.expandToLevel(res, 1);
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/BookmarkHeaderPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/BookmarkHeaderPart.java
index 0ad25df..0402f39 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/BookmarkHeaderPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/BookmarkHeaderPart.java
@@ -30,7 +30,7 @@
 	private Composite container;
 	private String id;
 
-	public BookmarkHeaderPart(Composite parent, FormToolkit toolkit) {	
+	public BookmarkHeaderPart(Composite parent, FormToolkit toolkit) {
 		container = toolkit.createComposite(parent);
 		Composite inner = toolkit.createComposite(container);
 		GridLayout layout = new GridLayout();
@@ -40,7 +40,7 @@
 		data.heightHint = 2;
 		inner.setLayoutData(data);
 	}
-	
+
 	@Override
 	public void init(ReusableHelpPart parent, String id, IMemento memento) {
 		this.id = id;
@@ -82,17 +82,17 @@
 
 	@Override
 	public void stop() {
-		
+
 	}
 
 	@Override
 	public void toggleRoleFilter() {
-		
+
 	}
 
 	@Override
 	public void refilter() {
-			
+
 	}
-		
+
 }
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/BookmarksPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/BookmarksPart.java
index f465af0..b85bcb4 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/BookmarksPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/BookmarksPart.java
@@ -80,7 +80,7 @@
 		@Override
 		public String getText(Object obj) {
 			if (obj instanceof BookmarkManager)
-				return Messages.BookmarksPart_savedTopics; 
+				return Messages.BookmarksPart_savedTopics;
 			if (obj instanceof IHelpResource)
 				return ((IHelpResource) obj).getLabel();
 			return super.getText(obj);
@@ -131,10 +131,10 @@
 				}
 			}
 		};
-		deleteAction.setText(Messages.BookmarksPart_delete); 
+		deleteAction.setText(Messages.BookmarksPart_delete);
 		deleteAction.setEnabled(false);
 	}
-	
+
 	@Override
 	protected void handleSelectionChanged(IStructuredSelection sel) {
 		Object obj = sel.getFirstElement();
@@ -165,7 +165,7 @@
 							() -> BaseHelpSystem.getBookmarkManager().removeAllBookmarks());
 				}
 			};
-			action.setText(Messages.BookmarksPart_deleteAll); 
+			action.setText(Messages.BookmarksPart_deleteAll);
 			manager.add(action);
 			value=true;
 		}
@@ -189,7 +189,7 @@
 				parent.showURL(res.getHref());
 		}
 	}
-	
+
 	@Override
 	public void update(final Observable o, final Object arg) {
 		treeViewer.getControl().getDisplay().asyncExec(() -> asyncUpdate(o, arg));
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/BrowserPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/BrowserPart.java
index f4a81fd..98d4182 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/BrowserPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/BrowserPart.java
@@ -54,7 +54,7 @@
 	private final static String HIGHLIGHT_ON = "highlight-on"; //$NON-NLS-1$
 	private final static String HELP_VIEW_SCALE = "help_view_scale"; //$NON-NLS-1$
     private final static String EMPTY_PAGE = "<html><head></head><body></body></html>"; //$NON-NLS-1$
-    
+
 	private ReusableHelpPart parent;
 
 	private Browser browser;
@@ -64,11 +64,11 @@
 	private int lastProgress = -1;
 
 	private static final int SCALE_MAX = 250;
-	
+
 	private static final int SCALE_MIN = 50;
-	
+
 	private static final int SCALE_INCREMENT = 10;
-	
+
 	private int fontScalePercentage = 100;
 
 	private String url;
@@ -76,15 +76,15 @@
 	private Action showExternalAction;
 
 	private Action syncTocAction;
-	
+
 	private Action highlightAction;
 
 	private Action bookmarkAction;
 
 	private Action printAction;
-	
+
 	private Action magnifyAction;
-	
+
 	private Action reduceAction;
 
 	private String statusURL;
@@ -242,12 +242,12 @@
 		bookmarkAction.setToolTipText(Messages.BrowserPart_bookmarkTooltip);
 		bookmarkAction.setImageDescriptor(HelpUIResources
 				.getImageDescriptor(IHelpUIConstants.IMAGE_ADD_BOOKMARK));
-		
+
 		highlightAction = new Action() {
 
 			@Override
 			public void run() {
-				IScopeContext instanceScope = InstanceScope.INSTANCE; 
+				IScopeContext instanceScope = InstanceScope.INSTANCE;
 				IEclipsePreferences prefs = instanceScope.getNode(HelpBasePlugin.PLUGIN_ID);
 				prefs.putBoolean(HIGHLIGHT_ON, highlightAction.isChecked());
 				if (browser.getUrl().indexOf("resultof")!=-1) browser.execute("setHighlight(" +highlightAction.isChecked()+");"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
@@ -257,7 +257,7 @@
 		highlightAction.setToolTipText(Messages.BrowserPart_highlightTooltip);
 		highlightAction.setImageDescriptor(HelpUIResources
 				.getImageDescriptor(IHelpUIConstants.IMAGE_HIGHLIGHT));
-		
+
 		printAction = new Action(ActionFactory.PRINT.getId()) {
 
 			@Override
@@ -268,7 +268,7 @@
 		printAction.setImageDescriptor(HelpUIResources
 				.getImageDescriptor(IHelpUIConstants.IMAGE_HELP_PRINT));
 		printAction.setToolTipText(Messages.BrowserPart_printTooltip);
-			
+
 		tbm.insertBefore("back", showExternalAction); //$NON-NLS-1$
 		tbm.insertBefore("back", syncTocAction); //$NON-NLS-1$
 		tbm.insertBefore("back", printAction); //$NON-NLS-1$
@@ -277,13 +277,13 @@
 		tbm.insertBefore("back", new Separator()); //$NON-NLS-1$
 		enableButtons();
 	}
-	
+
 	private void contributeToMenu(IMenuManager menuManager) {
 		if (FontUtils.canRescaleHelpView()) {
 			fontScalePercentage = Platform.getPreferencesService().getInt(HelpBasePlugin.PLUGIN_ID,
 					HELP_VIEW_SCALE, 100, null);
 			if (menuManager != null) {
-			    addMenuActions(menuManager); 
+			    addMenuActions(menuManager);
 			}
 		}
 	}
@@ -360,7 +360,7 @@
 			browser.setUrl(url);
 		}
 	}
-	
+
 	public void clearBrowser() {
 		if (browser != null) {
 			browser.setText(EMPTY_PAGE);
@@ -456,17 +456,17 @@
 			return printAction;
 		return null;
 	}
-	
+
 	private void enableButtons() {
 		if (magnifyAction != null) {
 		    magnifyAction.setEnabled(fontScalePercentage < SCALE_MAX);
-	        reduceAction.setEnabled(fontScalePercentage > SCALE_MIN);	
+	        reduceAction.setEnabled(fontScalePercentage > SCALE_MIN);
 		}
 	}
 
 	private void doMagnify(int percent) {
 		fontScalePercentage += percent;
-		IScopeContext instanceScope = InstanceScope.INSTANCE; 
+		IScopeContext instanceScope = InstanceScope.INSTANCE;
 		IEclipsePreferences prefs = instanceScope.getNode(HelpBasePlugin.PLUGIN_ID);
 		prefs.putInt(HELP_VIEW_SCALE, fontScalePercentage);
 		try {
@@ -477,7 +477,7 @@
 	}
 
 	public void rescale() {
-		browser.execute(FontUtils.getRescaleScript(fontScalePercentage)); 
+		browser.execute(FontUtils.getRescaleScript(fontScalePercentage));
 		enableButtons();
 	}
 
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/Chevron.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/Chevron.java
index d99f945..a382abf 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/Chevron.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/Chevron.java
@@ -24,7 +24,7 @@
 
 	/**
 	 * Creates a control in a provided composite.
-	 * 
+	 *
 	 * @param parent
 	 *            the parent
 	 * @param style
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ComboPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ComboPart.java
index 17cd277..4c97c7e 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ComboPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ComboPart.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 
 	public ComboPart() {
 	}
-	
+
 	public ComboPart(Composite parent, FormToolkit toolkit, int style) {
 		createControl(parent, toolkit, style);
 	}
@@ -34,20 +34,20 @@
 		else
 			((CCombo) combo).addSelectionListener(listener);
 	}
-	
+
 	public void addModifyListener(ModifyListener listener) {
 		if (combo instanceof Combo)
 			((Combo) combo).addModifyListener(listener);
 		else
 			((CCombo) combo).addModifyListener(listener);
-	}	
-	
+	}
+
 	public void addKeyListener(KeyListener listener) {
 		if (combo instanceof Combo)
 			((Combo) combo).addKeyListener(listener);
 		else
 			((CCombo) combo).addKeyListener(listener);
-	}	
+	}
 
 	public void createControl(Composite parent, FormToolkit toolkit, int style) {
 		if (toolkit.getBorderStyle() == SWT.BORDER)
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ContextHelpPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ContextHelpPart.java
index e37a245..df697e9 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ContextHelpPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ContextHelpPart.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -80,7 +80,7 @@
 	private ReusableHelpPart parent;
 
 	private static final String HELP_KEY = "org.eclipse.ui.help"; //$NON-NLS-1$
-	
+
 	private static final String MORE_HREF = "__more__"; //$NON-NLS-1$
 
 	private FormText text;
@@ -96,7 +96,7 @@
 	private String defaultText = ""; //$NON-NLS-1$
 
 	private String id;
-	
+
 	private Font codeFont;
 
 	private String savedDescription;
@@ -171,8 +171,8 @@
 			public void getName(AccessibleEvent e) {
 		        if (e.childID == ACC.CHILDID_SELF) {
 		            String currentName = e.result;
-		            e.result = Messages.ReusableHelpPart_contextHelpPage_name 
-		              + ' ' + getSection().getText()+ ' ' +currentName;    
+		            e.result = Messages.ReusableHelpPart_contextHelpPage_name
+		              + ' ' + getSection().getText()+ ' ' +currentName;
 		        }
 		    }
 		});
@@ -186,12 +186,12 @@
 		}
 		return style;
 	}
-	
+
 	private static Font createCodeFont(Display display, Font regularFont, Font textFont) {
 		FontData[] rfontData = regularFont.getFontData();
 		FontData[] tfontData = textFont.getFontData();
 		int height = 0;
-		
+
 		for (int i=0; i<rfontData.length; i++) {
 			FontData data = rfontData[i];
 			height = Math.max(height, data.getHeight());
@@ -201,7 +201,7 @@
 		}
 		return new Font(display, tfontData);
 	}
-	
+
 	@Override
 	public void dispose() {
 		if (codeFont!=null)
@@ -258,7 +258,7 @@
 			parent.showURL(sHref);
 		}
 	}
-	
+
 	private void doRunCommand(String serialization) {
 		ExecuteCommandAction action = new ExecuteCommandAction();
 		action.setInitializationString(serialization);
@@ -333,11 +333,11 @@
 		    updateDynamicHelp();
 		}
 	}
-	
+
 	private long lastUpdate = 0;
 
 	private String[] searchTerms;
-	
+
 	/*
 	 * If F1 was pressed within the last half second and this is a context change do not
 	 * update dynamic help solely due to a focus change, Bug 159450
@@ -394,7 +394,7 @@
 		    searchTerms = new String[] { expression };
 		}
 	}
-	
+
 	private void updateDynamicHelp() {
 		RelatedTopicsPart part = (RelatedTopicsPart) parent
 				.findPart(IHelpUIConstants.HV_RELATED_TOPICS);
@@ -419,9 +419,9 @@
 		}
 		return buff.length() > 0 ? buff.toString().trim() : null;
 	}
-	
+
 	private class SearchTerms {
-		
+
 		private List<String> terms = new ArrayList<>();
 		private Set<String> termSet = new HashSet<>();
 		public void add(String term) {
@@ -433,7 +433,7 @@
 				terms.add(term);
 			}
 		}
-		
+
 		public String[] toArray() {
 			return terms.toArray(new String[terms.size()]);
 		}
@@ -518,7 +518,7 @@
 		}
 		return null;
 	}
-	
+
 	private String stripMnemonic(String name) {
 		int loc = name.indexOf('&');
 		if (loc!= -1)
@@ -563,12 +563,12 @@
 		sbuf.append("<p>"); //$NON-NLS-1$
 		sbuf.append(decodeContextBoldTags(context));
 		sbuf.append("</p>"); //$NON-NLS-1$
-		
+
 		ICommandLink[] commands = null;
 		if (context instanceof IContext3) {
 			commands = ((IContext3)context).getRelatedCommands();
 		}
-				
+
 		String category = new String();
 		if (commands != null && commands.length > 0) {
 			for (int i=0;i<commands.length;++i) {
@@ -589,7 +589,7 @@
 				}
 			}
 		}
-		
+
 		IHelpResource[] links = context.getRelatedTopics();
 		if (links != null && context instanceof IContext2) {
 			ContextHelpSorter sorter = new ContextHelpSorter((IContext2)context);
@@ -676,7 +676,7 @@
 	/**
 	 * Make sure to support the Help system bold tag. The help system returns a
 	 * regular string for getText(). Use internal apis for now to get bold.
-	 * 
+	 *
 	 * @param context
 	 * @return
 	 */
@@ -749,7 +749,7 @@
 	@Override
 	public void saveState(IMemento memento) {
 	}
-	
+
 	private void doMore(String moreText) {
 		int index = Integer.parseInt(moreText);
 		parent.startSearch(searchTerms[index]);
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ContextHelpProviderInput.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ContextHelpProviderInput.java
index c3f1a4f..d1af30b 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ContextHelpProviderInput.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ContextHelpProviderInput.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,7 +28,7 @@
 		this.part = part;
 		this.explicitRequest = explicitRequest;
 	}
-	
+
 	public IContextProvider getProvider() {
 		return provider;
 	}
@@ -41,7 +41,7 @@
 	public IWorkbenchPart getPart() {
 		return part;
 	}
-	
+
 	public boolean isExplicitRequest() {
 		return explicitRequest;
 	}
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ContextHelpSorter.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ContextHelpSorter.java
index daea692..3cc7835 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ContextHelpSorter.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ContextHelpSorter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,13 +20,13 @@
 public class ContextHelpSorter extends ViewerComparator {
 	private IContext2 context;
 	private LinkedList<String> list;
-	
+
 	public ContextHelpSorter(IContext2 context) {
 		super(ReusableHelpPart.SHARED_COLLATOR);
 		list = new LinkedList<>();
 		this.context = context;
 	}
-	
+
 	@Override
 	public void sort(Viewer viewer, Object[] elements) {
 		for (int i = 0; i < elements.length; i++) {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/DynamicHelpPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/DynamicHelpPart.java
index 742ee94..eec77dd 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/DynamicHelpPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/DynamicHelpPart.java
@@ -91,7 +91,7 @@
 				| Section.TITLE_BAR);
 		// configure section
 		Section section = getSection();
-		section.setText(Messages.SearchPart_title); 
+		section.setText(Messages.SearchPart_title);
 		section.marginWidth = 5;
 		section.addExpansionListener(new ExpansionAdapter() {
 
@@ -117,7 +117,7 @@
 			}
 		});
 		section.setTextClient(clearLink);
-		*/		
+		*/
 		resultSorter = new SorterByScore();
 		searchResults = toolkit.createFormText(section, false);
 		section.setClient(searchResults);
@@ -134,7 +134,7 @@
 			@Override
 			public void linkActivated(HyperlinkEvent e) {
 				Object href = e.getHref();
-				if (href.equals(CANCEL_HREF)) { 
+				if (href.equals(CANCEL_HREF)) {
 					if (runningJob != null) {
 						runningJob.cancel();
 						runningJob = null;
@@ -167,19 +167,19 @@
 		stop();
 		super.dispose();
 	}
-	
+
 	@Override
 	public void setFocus() {
 		if (searchResults!=null)
 			searchResults.setFocus();
 	}
-	
+
 	@Override
 	public void stop () {
 		if (runningJob!=null) {
 			runningJob.cancel();
 			runningJob=null;
-		}		
+		}
 	}
 
 	@Override
@@ -212,7 +212,7 @@
 		searchResults.setText("", false, false); //$NON-NLS-1$
 		getManagedForm().reflow(true);
 	}
-	
+
 	public void startSearch(String newPhrase, IContext excludeContext) {
 		if (phrase!=null && phrase.equals(newPhrase))
 			return;
@@ -221,10 +221,10 @@
 		if (getSection().isExpanded())
 			startInPlaceSearch(phrase, excludeContext);
 	}
-	
+
 	private void startInPlaceSearch(final String phrase,
 			final IContext excludeContext) {
-		Job job = new Job(Messages.SearchPart_dynamicJob) { 
+		Job job = new Job(Messages.SearchPart_dynamicJob) {
 
 			@Override
 			protected IStatus run(IProgressMonitor monitor) {
@@ -246,7 +246,7 @@
 		job.setSystem(true);
 		scheduleSearch(job);
 	}
-	
+
 	private void performSearch(String phrase, IContext excludeContext,
 			IProgressMonitor monitor) {
 		SearchQuery searchQuery = new SearchQuery();
@@ -275,12 +275,12 @@
 		buff.append("<p><span color=\""); //$NON-NLS-1$
 		buff.append(IFormColors.TITLE);
 		buff.append("\">"); //$NON-NLS-1$
-		buff.append(Messages.SearchResultsPart_progress); 
+		buff.append(Messages.SearchResultsPart_progress);
 		buff.append("</span>"); //$NON-NLS-1$
 		buff.append("<a href=\""); //$NON-NLS-1$
 		buff.append(CANCEL_HREF);
 		buff.append("\">"); //$NON-NLS-1$
-		buff.append(Messages.SearchResultsPart_cancel); 
+		buff.append(Messages.SearchResultsPart_cancel);
 		buff.append("</a></p>"); //$NON-NLS-1$
 		buff.append("</form>"); //$NON-NLS-1$
 		searchResults.setText(buff.toString(), true, false);
@@ -288,14 +288,14 @@
 		runningJob = job;
 		job.schedule();
 	}
-	
+
 	private void updateResults(final String phrase,
 			final IContext excludeContext, final StringBuffer buffer,
 			final SearchHit[] hits) {
 		if (getSection().isDisposed())
 			return;
 		getSection().getDisplay().asyncExec(() -> doUpdateResults(phrase, excludeContext, buffer, hits));
-	}	
+	}
 
 	private void doUpdateResults(String phrase, IContext excludeContext, StringBuffer buff, SearchHit[] hits) {
 		if (runningJob != null) {
@@ -308,7 +308,7 @@
 			buff.append("<p><span color=\""); //$NON-NLS-1$
 			buff.append(IFormColors.TITLE);
 			buff.append("\">"); //$NON-NLS-1$
-			buff.append(NLS.bind(Messages.SearchResultsPart_label, phrase)); 
+			buff.append(NLS.bind(Messages.SearchResultsPart_label, phrase));
 			buff.append("</span></p>"); //$NON-NLS-1$
 			resultSorter.sort(null, hits);
 			IHelpResource [] excludedTopics = excludeContext!=null?excludeContext.getRelatedTopics():null;
@@ -345,7 +345,7 @@
 				buff.append(" <a href=\""); //$NON-NLS-1$
 				buff.append(MORE_HREF);
 				buff.append("\">"); //$NON-NLS-1$
-				buff.append(Messages.SearchResultsPart_moreResults); 
+				buff.append(Messages.SearchResultsPart_moreResults);
 				buff.append("</a></p>"); //$NON-NLS-1$
 			}
 			buff.append("</form>"); //$NON-NLS-1$
@@ -353,11 +353,11 @@
 				searchResults.setText(buff.toString(), true, false);
 		} else
 			if (!searchResults.isDisposed())
-				searchResults.setText(NLS.bind(Messages.SearchResultsPart_noHits, phrase) , false, false); 
+				searchResults.setText(NLS.bind(Messages.SearchResultsPart_noHits, phrase) , false, false);
 		if (!searchResults.isDisposed())
 			getManagedForm().reflow(true);
 	}
-	
+
 	private boolean isExcluded(String href, IHelpResource [] excludedTopics) {
 		if (excludedTopics==null) return false;
 		for (int i=0; i<excludedTopics.length; i++) {
@@ -409,7 +409,7 @@
 	@Override
 	public void refilter() {
 		if (phrase!=null && phrase.length() > 0)
-			startInPlaceSearch(phrase, context);		
+			startInPlaceSearch(phrase, context);
 	}
 
 	@Override
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineDescriptor.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineDescriptor.java
index f81f309..79c0283 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineDescriptor.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineDescriptor.java
@@ -32,7 +32,7 @@
 	private ISearchEngine engine;
 
 	private IConfigurationElement config;
-	
+
 	private EngineDescriptorManager manager;
 
 	private EngineTypeDescriptor etdesc;
@@ -52,12 +52,12 @@
 	private boolean userDefined;
 
 	/**
-	 * 
+	 *
 	 */
 	public EngineDescriptor(IConfigurationElement config) {
 		this.config = config;
 	}
-	
+
 	public EngineDescriptor(EngineDescriptorManager manager) {
 		this.manager = manager;
 	}
@@ -65,7 +65,7 @@
 	public void setEngineType(EngineTypeDescriptor etdesc) {
 		this.etdesc = etdesc;
 	}
-	
+
 	public void setEngineDescriptorManager(EngineDescriptorManager manager) {
 		this.manager = manager;
 	}
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineDescriptorManager.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineDescriptorManager.java
index 45e195c..a90956b 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineDescriptorManager.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineDescriptorManager.java
@@ -48,7 +48,7 @@
 
 	private static final String USER_FILE = "userSearches.xml"; //$NON-NLS-1$
 	private static final String ATT_ENGINE_TYPE_ID = "engineTypeId"; //$NON-NLS-1$
-	
+
 	public static class DescriptorEvent {
 		private EngineDescriptor desc;
 		private int kind;
@@ -68,7 +68,7 @@
 		descriptors = new ArrayList<>();
 		load();
 	}
-	
+
 	public void add(EngineDescriptor desc) {
 		descriptors.add(desc);
 		this.setChanged();
@@ -85,11 +85,11 @@
 		this.setChanged();
 		this.notifyObservers(new DescriptorEvent(desc, CHANGE));
 	}
-	
+
 	public EngineDescriptor[] getDescriptors() {
 		return descriptors.toArray(new EngineDescriptor[descriptors.size()]);
 	}
-	
+
 	public EngineDescriptor findEngine(String engineId) {
 		for (int i=0; i<descriptors.size(); i++) {
 			EngineDescriptor desc = descriptors.get(i);
@@ -124,7 +124,7 @@
 			writer.flush();
 		}
 		catch (IOException e) {
-			HelpUIPlugin.logError(Messages.EngineDescriptorManager_errorSaving, e); 
+			HelpUIPlugin.logError(Messages.EngineDescriptorManager_errorSaving, e);
 		}
 		finally {
 			if (osw!=null) {
@@ -152,7 +152,7 @@
 			load(fileName);
 		}
 		catch (IOException e) {
-			HelpUIPlugin.logError(Messages.EngineDescriptorManager_errorLoading, e); 
+			HelpUIPlugin.logError(Messages.EngineDescriptorManager_errorLoading, e);
 		}
 	}
 
@@ -162,7 +162,7 @@
 		Hashtable<String, EngineTypeDescriptor> engineTypes = loadEngineTypes(elements);
 		for (int i = 0; i < elements.length; i++) {
 			IConfigurationElement element = elements[i];
-			if (element.getName().equals(TAG_ENGINE)) { 
+			if (element.getName().equals(TAG_ENGINE)) {
 				EngineDescriptor desc = new EngineDescriptor(element);
 				String engineId = desc.getEngineTypeId();
 				if (engineId != null) {
@@ -279,7 +279,7 @@
 		}
 		return typeId;
 	}
-	
+
 	private boolean isUsed(int value, ArrayList<Integer> used) {
 		for (int i=0; i<used.size(); i++) {
 			Integer iv = used.get(i);
@@ -304,7 +304,7 @@
 		}
 		return null;
 	}
-	
+
 	private void save(PrintWriter writer, EngineDescriptor desc) {
 		String indent = "   "; //$NON-NLS-1$
 		String attIndent = indent + indent;
@@ -318,14 +318,14 @@
 		writer.print(indent);
 		writer.println("</engine>"); //$NON-NLS-1$
 	}
-	
+
 	private String getAttribute(Node node, String name) {
 		Node att = node.getAttributes().getNamedItem(name);
 		if (att!=null)
 			return att.getNodeValue();
 		return null;
 	}
-	
+
 	private void saveAttribute(PrintWriter writer, String indent, String name, String value) {
 		if (value==null)
 			return;
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineTypeDescriptor.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineTypeDescriptor.java
index 61d8f7b..c85b21a 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineTypeDescriptor.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineTypeDescriptor.java
@@ -33,7 +33,7 @@
 	private Image image;
 	private ISearchScopeFactory factory;
 	/**
-	 * 
+	 *
 	 */
 	public EngineTypeDescriptor(IConfigurationElement config) {
 		this.config = config;
@@ -44,9 +44,9 @@
 	public IConfigurationElement [] getPages() {
 		return config.getChildren("subpage"); //$NON-NLS-1$
 	}
-	
+
 	public String getLabel() {
-		return config.getAttribute(IHelpUIConstants.ATT_LABEL);		
+		return config.getAttribute(IHelpUIConstants.ATT_LABEL);
 	}
 	public String getId() {
 		return config.getAttribute(IHelpUIConstants.ATT_ID);
@@ -64,15 +64,15 @@
 		image = HelpUIResources.getImage(IHelpUIConstants.IMAGE_HELP_SEARCH);
 		return image;
 	}
-	
+
 	public String getDescription() {
 		String desc = null;
 		IConfigurationElement [] children = config.getChildren(IHelpUIConstants.TAG_DESC);
-		if (children.length==1) 
+		if (children.length==1)
 			desc = children[0].getValue();
 		return desc;
 	}
-	
+
 	public ImageDescriptor getImageDescriptor() {
 		ImageDescriptor desc=null;
 		String icon = config.getAttribute(IHelpUIConstants.ATT_ICON);
@@ -110,7 +110,7 @@
 		}
 		return null;
 	}
-	
+
 	public ISearchScope createSearchScope(IPreferenceStore store, String engineId,
 			Dictionary<String, Object> parameters) {
 		if (factory==null) {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineTypeWizardPage.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineTypeWizardPage.java
index d00d819..e106422 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineTypeWizardPage.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/EngineTypeWizardPage.java
@@ -31,7 +31,7 @@
 	private TableViewer tableViewer;
 	private EngineTypeDescriptor [] engineTypes;
 	private EngineTypeDescriptor selection;
-	
+
 	class EngineContentProvider implements IStructuredContentProvider {
 
 		@Override
@@ -47,7 +47,7 @@
 		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 		}
 	}
-	
+
 	class EngineLabelProvider extends LabelProvider implements ITableLabelProvider {
 
 		@Override
@@ -75,8 +75,8 @@
 
 	public EngineTypeWizardPage(EngineTypeDescriptor[] engineTypes) {
 		super("engineType"); //$NON-NLS-1$
-		setTitle(Messages.EngineTypeWizardPage_title); 
-		setDescription(Messages.EngineTypeWizardPage_desc); 
+		setTitle(Messages.EngineTypeWizardPage_title);
+		setDescription(Messages.EngineTypeWizardPage_desc);
 		this.engineTypes = engineTypes;
 	}
 
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/FederatedSearchSorter.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/FederatedSearchSorter.java
index 4af3f25..c4bf00a 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/FederatedSearchSorter.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/FederatedSearchSorter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,7 +19,7 @@
 	public FederatedSearchSorter() {
 		super(ReusableHelpPart.SHARED_COLLATOR);
 	}
-	
+
 	@Override
 	public int category(Object element) {
 		if (element instanceof ISearchEngineResult) {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HelpTray.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HelpTray.java
index 290f186..93e5130 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HelpTray.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HelpTray.java
@@ -50,20 +50,20 @@
  * help or a cheat sheet follows the user into a dialog.
  */
 public class HelpTray extends DialogTray implements IPageChangedListener {
-	
+
 	public static final int MINIMUM_HEIGHT = 450;
 	private static final int DEFAULT_WIDTH = 210;
-	
+
 	private int originalHeight;
 	private int heightAdded;
-	
+
 	private FormToolkit toolkit;
 	private ReusableHelpPart helpPart;
 	private Shell shell;
 	private IContributionItem closeAction;
 	private Image normal;
 	private Image hover;
-	
+
 	/**
 	 * Creates any actions needed by the tray.
 	 */
@@ -85,17 +85,17 @@
 			}
 		};
 	}
-	
+
 	/**
 	 * Creates the contents of the tray.
-	 * 
+	 *
 	 * @param parent the parent composite that will contain the tray
 	 */
 	@Override
 	protected Control createContents(Composite parent) {
 		// if the dialog is too short, make it taller
 		ensureMinimumHeight(parent.getShell());
-		
+
 		toolkit = new FormToolkit(parent.getDisplay());
 		toolkit.getHyperlinkGroup().setHyperlinkUnderlineMode(HyperlinkGroup.UNDERLINE_HOVER);
 		toolkit.getColors().initializeSectionToolBarColors();
@@ -105,7 +105,7 @@
 		layout.verticalSpacing = 0;
 		container.setLayout(layout);
 		container.addListener(SWT.Dispose, event -> dispose());
-		
+
 		ToolBarManager tbm = new ToolBarManager(SWT.FLAT);
 		tbm.createControl(container);
 		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
@@ -122,14 +122,14 @@
 		gd = new GridData(GridData.FILL_BOTH);
 		gd.widthHint = DEFAULT_WIDTH;
 		helpPart.getControl().setLayoutData(gd);
-		
+
 		createActions();
 		tbm.add(closeAction);
-		
+
 		shell = parent.getShell();
 		hookPageChangeListener(shell);
 		helpPart.getControl().addListener(SWT.Dispose, event -> unhookPageChangeListener(shell));
-		
+
 		return container;
 	}
 
@@ -138,13 +138,13 @@
 	 */
 	private void createImages() {
 		Display display = Display.getCurrent();
-		int[] shape = new int[] { 
-				3,  3, 5,  3, 7,  5, 8,  5, 10, 3, 12, 3, 
+		int[] shape = new int[] {
+				3,  3, 5,  3, 7,  5, 8,  5, 10, 3, 12, 3,
 				12, 5, 10, 7, 10, 8, 12,10, 12,12,
 				10,12, 8, 10, 7, 10, 5, 12, 3, 12,
 				3, 10, 5,  8, 5,  7, 3,  5
 		};
-		
+
 		/*
 		 * Use magenta as transparency color since it is used infrequently.
 		 */
@@ -174,7 +174,7 @@
 		gc.setForeground(border);
 		gc.drawPolygon(shape);
 		gc.dispose();
-		
+
 		backgroundHot.dispose();
 	}
 
@@ -186,7 +186,7 @@
 		hover.dispose();
 		toolkit.dispose();
 		helpPart.dispose();
-		
+
 		/*
 		 * Shell is about to be closed. Add a one-time-only listener
 		 * that will return the dialog height back to original.
@@ -209,7 +209,7 @@
 	 * Ensures that the dialog's height is sufficient to contain the help tray.
 	 * If the dialog is too short, its height is increased. When closing the tray,
 	 * the height is returned to original (see dispose()).
-	 * 
+	 *
 	 * @param shell the dialog's shell
 	 */
 	private void ensureMinimumHeight(Shell shell) {
@@ -224,20 +224,20 @@
 			heightAdded = 0;
 		}
 	}
-	
+
 	/**
 	 * Returns the ReusableHelpPart contained in the tray.
-	 * 
+	 *
 	 * @return the tray's ReusableHelpPart
 	 */
 	public ReusableHelpPart getHelpPart() {
 		return helpPart;
 	}
-	
+
 	/**
 	 * Add the listener that gets notified of page changes (to automatically
 	 * update context help).
-	 * 
+	 *
 	 * @param parent the Composite to hook the listener to
 	 */
 	private void hookPageChangeListener(Composite parent) {
@@ -251,7 +251,7 @@
 	 * Returns whether or not the help tray can handle the given shell. In some
 	 * cases the help tray is not appropriate for shells that are too short and
 	 * not resizable. In these cases infopops are used.
-	 * 
+	 *
 	 * @param shell the shell to check
 	 * @return whether or not the help tray is appropriate for the hsell
 	 */
@@ -266,7 +266,7 @@
 	/**
 	 * Called whenever the dialog we're inside has changed pages. This updates
 	 * the context help page if it is visible.
-	 * 
+	 *
 	 * @param event the page change event
 	 */
 	@Override
@@ -287,11 +287,11 @@
 		}
 		helpPart.update(null, null, null, c, false);
 	}
-	
+
 	/**
 	 * Remove the listener that gets notified of page changes (to automatically
 	 * update context help).
-	 * 
+	 *
 	 * @param parent the Composite that had the listener
 	 */
 	private void unhookPageChangeListener(Composite parent) {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HelpView.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HelpView.java
index 24870ac..b28cd37 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HelpView.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HelpView.java
@@ -44,7 +44,7 @@
 public class HelpView extends ViewPart implements IPartListener2,
 		ISelectionChangedListener, IPageChangedListener {
 	private FormToolkit toolkit;
-	
+
 	private String firstPageId;
 
 	private ReusableHelpPart reusableHelpPart;
@@ -56,7 +56,7 @@
 	private boolean visible;
 
 	/**
-	 * 
+	 *
 	 */
 	public HelpView() {
 	}
@@ -69,7 +69,7 @@
 		// toolkit.setBackground(toolkit.getColors().createNoContentBackground());
 		toolkit.getColors().initializeSectionToolBarColors();
 		reusableHelpPart.createControl(parent, toolkit);
-		reusableHelpPart.setDefaultContextHelpText(Messages.HelpView_defaultText); 
+		reusableHelpPart.setDefaultContextHelpText(Messages.HelpView_defaultText);
 		reusableHelpPart.showPage(getFirstPage());
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
 	         "org.eclipse.help.ui.helpView"); //$NON-NLS-1$
@@ -118,7 +118,7 @@
 		IPartService service = window.getPartService();
 		service.addPartListener(this);
 	}
-	
+
 	@Override
 	public void saveState(IMemento memento) {
     	if (reusableHelpPart!=null && memento!=null) {
@@ -154,7 +154,7 @@
 		} else {
 			if (HelpPlugin.DEBUG_CONTEXT) {
 				if (c == null) {
-				    System.out.println("Context: focus control is null " ); //$NON-NLS-1$			  
+				    System.out.println("Context: focus control is null " ); //$NON-NLS-1$
 				}
 				if (!c.isVisible()) {
 				    System.out.println("Context: focus control not visible " ); //$NON-NLS-1$
@@ -168,7 +168,7 @@
 			((IPageChangeProvider)part).addPageChangedListener(this);
 		monitoredPart = part;
 	}
-	
+
 	private void uninstallPageListener(IWorkbenchPart part) {
 		if (part instanceof IPageChangeProvider)
 			((IPageChangeProvider)part).removePageChangedListener(this);
@@ -313,7 +313,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.help.ui.internal.views.BaseHelpView#getFirstPage()
 	 */
 	protected String getFirstPage() {
@@ -348,7 +348,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.help.ui.internal.views.BaseHelpView#getHelpPartStyle()
 	 */
 	protected int getHelpPartStyle() {
@@ -365,17 +365,17 @@
 		if (reusableHelpPart != null)
 			reusableHelpPart.startSearch(phrase);
 	}
-	
+
 	public void showIndex() {
 		if (reusableHelpPart != null)
 			reusableHelpPart.showPage(IHelpUIConstants.HV_INDEX_PAGE, true);
 	}
-	
+
 	public void showHelp(String href) {
 		if (reusableHelpPart != null)
 			reusableHelpPart.showURL(href);
 	}
-	
+
 	public void showDynamicHelp(IWorkbenchPart part, Control c) {
 		if (reusableHelpPart != null)
 			reusableHelpPart.showDynamicHelp(part, c);
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HelpviewProtocol.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HelpviewProtocol.java
index 6869af1..68bccbd 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HelpviewProtocol.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HelpviewProtocol.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,7 +20,7 @@
 	public static final String HELPVIEW_PROTOCOL = "helpview:"; //$NON-NLS-1$
 	public static final String CHECK_REMOTE_STATUS = "checkremote"; //$NON-NLS-1$
 	public static final String IGNORE_MISSING_BOOKS = "ignoreMissingBooks"; //$NON-NLS-1$
-	
+
 	public static void handleProtocolCall(String url, ReusableHelpPart part) {
 		int index = url.indexOf(HELPVIEW_PROTOCOL);
 		if (index == -1) {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HistoryEntry.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HistoryEntry.java
index 676bb5d..6de6856 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HistoryEntry.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HistoryEntry.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,7 +17,7 @@
 	private String target;
 	private Object data;
 	/**
-	 * 
+	 *
 	 */
 	public HistoryEntry(int type, String target, Object data) {
 		this.type = type;
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HistoryScopeSet.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HistoryScopeSet.java
index ba5fde3..a0f2828 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HistoryScopeSet.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HistoryScopeSet.java
@@ -30,7 +30,7 @@
 		super(set, set.getName());
 		setExpression(set.getExpression());
 	}
-	
+
 	@Override
 	public void copyFrom(ScopeSet set) {
 		String expression = getExpression();
@@ -42,16 +42,16 @@
 		IPreferenceStore store = getPreferenceStore();
 		return store.getString(KEY_EXPRESSION);
 	}
-	
+
 	@Override
 	public boolean isImplicit() {
 		return true;
-	}	
-	
+	}
+
 	@Override
 	protected String getExtension() {
 		return EXT;
-	}	
+	}
 
 	@Override
 	protected String encodeFileName(String name) {
@@ -72,6 +72,6 @@
 
 	public void setExpression(String expression) {
 		IPreferenceStore store = getPreferenceStore();
-		store.setValue(KEY_EXPRESSION, expression);		
+		store.setValue(KEY_EXPRESSION, expression);
 	}
 }
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HyperlinkTreePart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HyperlinkTreePart.java
index a302fd9..94662a7 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HyperlinkTreePart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/HyperlinkTreePart.java
@@ -57,7 +57,7 @@
 
 public abstract class HyperlinkTreePart extends AbstractFormPart implements
 		IHelpPart {
-	
+
 	public class ScopeObserver implements Observer {
 
 		@Override
@@ -67,13 +67,13 @@
 			}
 		}
 	}
-	
+
 	private class ScopeFilter extends ViewerFilter {
-		
+
 		public ScopeFilter(AbstractHelpScope scope) {
 			this.scope = scope;
 		}
-		
+
 		AbstractHelpScope scope;
 
 		@Override
@@ -92,7 +92,7 @@
 			}
 			return true;
 		}
-		
+
 	}
 
 	protected ReusableHelpPart parent;
@@ -235,7 +235,7 @@
 			}
 			treeViewer.getTree().setCursor(null);
 		});
-		contributeToToolBar(tbm);	
+		contributeToToolBar(tbm);
 		scopeObserver = new ScopeObserver();
 		ScopeState.getInstance().getScopeSetManager().addObserver(scopeObserver);
 	}
@@ -266,7 +266,7 @@
 		collapseAllAction.setImageDescriptor(HelpUIResources
 				.getImageDescriptor(IHelpUIConstants.IMAGE_COLLAPSE_ALL));
 		collapseAllAction
-				.setToolTipText(Messages.AllTopicsPart_collapseAll_tooltip); 
+				.setToolTipText(Messages.AllTopicsPart_collapseAll_tooltip);
 		tbm.insertBefore("back", collapseAllAction); //$NON-NLS-1$
 		tbm.insertBefore("back", new Separator()); //$NON-NLS-1$
 	}
@@ -395,7 +395,7 @@
 		if (lastItem != null && lastItem.isDisposed())
 			lastItem = null;
 	}
-	
+
 	@Override
 	public void refilter() {
 		ScopeSetManager manager = ScopeState.getInstance().getScopeSetManager();
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IHelpPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IHelpPart.java
index fed9725..a8c1b44 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IHelpPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IHelpPart.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IHelpPartPage.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IHelpPartPage.java
index 34c36cb..d9ea33e 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IHelpPartPage.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IHelpPartPage.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IndexPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IndexPart.java
index bf6fd05..3d74930 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IndexPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IndexPart.java
@@ -4,12 +4,12 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     Intel Corporation - initial API and implementation
  *     IBM Corporation - 163558 Dynamic content support for all UA
  *     IBM Corporation - Support for see elements
- *     Andreas Meissner - Fix Bug 351272 
+ *     Andreas Meissner - Fix Bug 351272
  *******************************************************************************/
 package org.eclipse.help.ui.internal.views;
 
@@ -87,7 +87,7 @@
 			if (obj instanceof IndexSee) {
 				IndexSee see = (IndexSee) obj;
 				return getSeeString(see);
-			} 
+			}
 			return super.getText(obj);
 		}
 
@@ -96,7 +96,7 @@
 			return super.getImage(obj);
 		}
 	}
-	
+
 	public String getSeeString(IIndexSee see) {
 		String seeText = see.isSeeAlso() ? Messages.SeeAlso : Messages.See;
 		String message = NLS.bind(seeText, see.getKeyword());
@@ -215,16 +215,16 @@
 	private Object[] getChildren(IIndexEntry entry) {
 		/*
 		 * Index entry has two types of children: topics and subentries.
-		 * 
+		 *
 		 * The method returns topics among children only if number of the topics
 		 * more than 1.
-		 * 
+		 *
 		 * In case when the entry owns only one topic, this topic is not returned
 		 * as child because the entry will represent this topic by its keyword.
 		 */
 		IHelpResource[] topics = entry.getTopics();
 		IIndexEntry[] subentries = entry.getSubentries();
-		IIndexSee[] sees = entry instanceof IIndexEntry2 ? ((IIndexEntry2)entry).getSees() : 
+		IIndexSee[] sees = entry instanceof IIndexEntry2 ? ((IIndexEntry2)entry).getSees() :
 			               new IIndexSee[0];
 
 		if (topics.length <= 1 && subentries.length == 0 && sees.length == 0) {
@@ -244,9 +244,9 @@
 			System.arraycopy(sees, 0, children, topics.length + subentries.length, sees.length);
 		}
 
-		return children; 
+		return children;
 	}
-	
+
 
 	protected Tree getTreeWidget() {
 		return treeViewer.getTree();
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IndexTypeinPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IndexTypeinPart.java
index 1ac4d8f..932dff1 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IndexTypeinPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/IndexTypeinPart.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     Intel Corporation - initial API and implementation
  *     IBM Corporation 2008 - Bug 248079 [Help][Index] unicode sort issue in index view
@@ -120,7 +120,7 @@
 				return;
 			}
 		}
-		TreeItem item = indexTree.getItem(index); 
+		TreeItem item = indexTree.getItem(index);
 		indexTree.setSelection(new TreeItem[] { item });
 		String text = item.getText();
 		indexText.setText(text);
@@ -139,7 +139,7 @@
 				return;
 			}
 		}
-		TreeItem item = indexTree.getItem(index); 
+		TreeItem item = indexTree.getItem(index);
 		indexTree.setSelection(new TreeItem[] { item });
 		String text = item.getText();
 		indexText.setText(text);
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/LocalScopeDialog.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/LocalScopeDialog.java
index e72881e..564f7b9 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/LocalScopeDialog.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/LocalScopeDialog.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -36,12 +36,12 @@
 		this.preferenceStore = set.getPreferenceStore();
 		this.scopeSet = set;
 	}
-	
+
 	@Override
 	protected boolean isResizable() {
 		return true;
 	}
-	
+
 	@Override
 	protected Control createDialogArea(Composite parent) {
 		EngineDescriptor localSearchDesc = null;
@@ -62,7 +62,7 @@
 		helpPageControl.setLayoutData(layoutData);
 		return helpPageControl;
 	}
-	
+
 	@Override
 	protected void okPressed() {
 		localHelpPage.performOk();
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/MissingContentPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/MissingContentPart.java
index 74537dc..f8c4af9 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/MissingContentPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/MissingContentPart.java
@@ -39,8 +39,8 @@
 	private ImageHyperlink statusLink;
 	private boolean wasRemoteHelpUnavailable = false;
 	private boolean wasUnresolvedPlaceholders = false;
-	
-	public MissingContentPart(Composite parent, FormToolkit toolkit) {			
+
+	public MissingContentPart(Composite parent, FormToolkit toolkit) {
 		container = toolkit.createComposite(parent, SWT.NULL);
 		container.setBackgroundMode(SWT.INHERIT_DEFAULT);
 		GridLayout layout = new GridLayout();
@@ -66,15 +66,15 @@
 		wasUnresolvedPlaceholders = isUnresolvedPlaceholders;
 		FormToolkit toolkit = new FormToolkit(container.getDisplay());
 		if ( isRemoteHelpUnavailable ) {
-			createHelpMissingLink(container, toolkit, Dialog.DLG_IMG_MESSAGE_WARNING, Messages.remoteHelpUnavailable, 
+			createHelpMissingLink(container, toolkit, Dialog.DLG_IMG_MESSAGE_WARNING, Messages.remoteHelpUnavailable,
 			        MissingContentManager.getInstance().getRemoteHelpUnavailablePage(true), true);
 		} else if ( isUnresolvedPlaceholders) {
-		    createHelpMissingLink(container, toolkit, Dialog.DLG_IMG_MESSAGE_INFO, Messages.ReusableHelpPart_missingContent, 
+		    createHelpMissingLink(container, toolkit, Dialog.DLG_IMG_MESSAGE_INFO, Messages.ReusableHelpPart_missingContent,
 					MissingContentManager.getInstance().getHelpMissingPage(true), false);
 		}
 		toolkit.dispose();
 	}
-	
+
 	private void createHelpMissingLink(Composite container, FormToolkit toolkit, String imageKey, String linkText, String linkTarget, boolean isRemoteUnavailableLink) {
 		final String target = linkTarget;
 		final boolean isRemote = isRemoteUnavailableLink;
@@ -83,7 +83,7 @@
 		paddingData.heightHint = 2;
 		padding.setLayoutData(paddingData);
 		toolkit.adapt(padding);
-        Image warningImage = JFaceResources.getImage(imageKey);	
+        Image warningImage = JFaceResources.getImage(imageKey);
 		statusLink = toolkit.createImageHyperlink(container, SWT.NULL);
 		statusLink.setText(linkText);
 		statusLink.setImage(warningImage);
@@ -91,7 +91,7 @@
 
 			@Override
 			public void linkActivated(HyperlinkEvent e) {
-				helpPart.showURL(target); 
+				helpPart.showURL(target);
 				if ( isRemote ) {
 				    helpPart.checkRemoteStatus();
 				} else {
@@ -102,17 +102,17 @@
 		GridData statusData = new GridData(GridData.BEGINNING, GridData.CENTER, false, false);
 		statusLink.setLayoutData(statusData);
 	}
-	
+
 	private void disposeLink() {
 		if (statusLink != null) {
 		    statusLink.dispose();
 		}
 		statusLink = null;
 	}
-	
+
 	public void setSubsequentPage(String subsequentPage) {
-		
-	}	
+
+	}
 
 	@Override
 	public void init(ReusableHelpPart parent, String id, IMemento memento) {
@@ -158,22 +158,22 @@
 
 	@Override
 	public void stop() {
-		
+
 	}
 
 	@Override
 	public void toggleRoleFilter() {
-		
+
 	}
 
 	@Override
 	public void refilter() {
-			
+
 	}
-	
+
 	@Override
 	public void dispose() {
 		disposeLink();
 	}
-		
+
 }
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/NewEngineWizard.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/NewEngineWizard.java
index c6b5a67..521b3bb 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/NewEngineWizard.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/NewEngineWizard.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/RelatedTopicsPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/RelatedTopicsPart.java
index 3cab7b7..1268c28 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/RelatedTopicsPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/RelatedTopicsPart.java
@@ -44,7 +44,7 @@
 	private String id;
 
 	private int VSPACE = 10;
-	
+
 	private static boolean dynamicHelpPreferenceRead = false;
 	private static boolean useDynamicHelp = false;
 
@@ -55,7 +55,7 @@
 				boolean flushCache) {
 			Point topSize = contextHelpPart.getControl().computeSize(wHint,
 					hHint, flushCache);
-		   
+
 			Point botSize = dynamicHelpPart == null ? new Point(0, 0) :
 			    dynamicHelpPart.getControl().computeSize(wHint,
 					hHint, flushCache);
@@ -87,7 +87,7 @@
 			int bot = dynamicHelpPart == null ? 0 : computeMinimumWidth(dynamicHelpPart, parent, changed);
 			return Math.max(top, bot);
 		}
-		
+
 		private int computeMinimumWidth(IHelpPart part, Composite parent, boolean changed) {
 			ILayoutExtension le = (ILayoutExtension)((Composite)part.getControl()).getLayout();
 			return le.computeMinimumWidth(parent, changed);
@@ -123,22 +123,22 @@
 		contextHelpPart.init(parent, IHelpUIConstants.HV_CONTEXT_HELP, memento);
 		mform.addPart(contextHelpPart);
 		if (isUseDynamicHelp()) {
-		    dynamicHelpPart.init(parent, IHelpUIConstants.HV_SEARCH_RESULT, memento);	
+		    dynamicHelpPart.init(parent, IHelpUIConstants.HV_SEARCH_RESULT, memento);
 		    mform.addPart(dynamicHelpPart);
 		}
 		mform.initialize();
 	}
-	
+
 	@Override
 	public void dispose() {
 		mform.dispose();
 	}
-	
+
 	public void handleActivation(Control c, IWorkbenchPart wpart) {
 		IContextProvider provider = (wpart == null) ? null : (IContextProvider) wpart.getAdapter(IContextProvider.class);
 		contextHelpPart.handleActivation(provider, null, c, wpart, false);
 	}
-	
+
 	public void setDefaultText(String defaultText) {
 		contextHelpPart.setDefaultText(defaultText);
 	}
@@ -227,7 +227,7 @@
 	    	// Preference created in case anyone complains about the removal of
 	    	// the dynamic help section. This is not API, not documented and may
 	    	// be removed in a future release.
-	    	useDynamicHelp = 
+	    	useDynamicHelp =
 	    		Platform.getPreferencesService().getBoolean(HelpBasePlugin.PLUGIN_ID, "show_dynamic_help", false, null); //$NON-NLS-1$
 	    }
 		return useDynamicHelp;
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/RenameDialog.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/RenameDialog.java
index 764f5d7..0781498 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/RenameDialog.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/RenameDialog.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -35,7 +35,7 @@
 	private Text text;
 	private IStatus status;
 	private boolean isCaseSensitive;
-	
+
     /**
      * Create a new rename dialog instance for the given window.
      * @param shell The parent of the dialog
@@ -47,7 +47,7 @@
 		initialize();
 		setOldName(oldName);
 	}
-	
+
     /**
      * Create a new rename dialog instance for the given window.
      * @param shell The parent of the dialog
@@ -65,7 +65,7 @@
 		}
 		setOldName(oldName);
 	}
-	
+
 	public void initialize(){
 		oldNames = new ArrayList<>();
 		setStatusLineAboveButtons(true);
@@ -74,15 +74,15 @@
 	public void addOldName(String oldName){
 		if (!oldNames.contains(oldName))
 			oldNames.add(oldName);
-		
+
 	}
 	public void setOldName(String oldName) {
 		this.oldName = oldName;
-		if (text!=null) 
+		if (text!=null)
 			text.setText(oldName);
 		this.newName = oldName;
 	}
-	
+
 	@Override
 	protected Control createDialogArea(Composite parent) {
 		Composite container = new Composite(parent, SWT.NULL);
@@ -90,13 +90,13 @@
 		layout.numColumns = 2;
         layout.marginHeight = layout.marginWidth = 9;
 		container.setLayout(layout);
-		
+
 		GridData gd = new GridData(GridData.FILL_BOTH);
 		container.setLayoutData(gd);
-		
+
 		Label label = new Label(container, SWT.NULL);
-		label.setText(Messages.RenameDialog_label); 
-		
+		label.setText(Messages.RenameDialog_label);
+
 		text = new Text(container, SWT.SINGLE|SWT.BORDER);
 		text.addModifyListener(e -> textChanged(text.getText(), true));
 		gd = new GridData(GridData.FILL_HORIZONTAL);
@@ -105,7 +105,7 @@
 		applyDialogFont(container);
 		return container;
 	}
-	
+
 	@Override
 	public int open() {
 		text.setText(oldName);
@@ -114,7 +114,7 @@
         textChanged(oldName, false);
 		return super.open();
 	}
-	
+
 	private void textChanged(String text, boolean setStatus) {
 		Button okButton = getButton(IDialogConstants.OK_ID);
 		for (int i=0; i<oldNames.size(); i++){
@@ -145,7 +145,7 @@
 			IStatus.ERROR,
 			HelpUIPlugin.PLUGIN_ID,
 			IStatus.ERROR,
-			errorMessage, 
+			errorMessage,
 			null);
 		updateStatus(status);
 	}
@@ -159,7 +159,7 @@
 			null);
 		updateStatus(status);
 	}
-	
+
 	public String getNewName() {
 		return newName;
 	}
@@ -173,7 +173,7 @@
 	@Override
 	protected void computeResult() {
 	}
-    
+
 	@Override
 	public void setTitle(String title) {
         getShell().setText(title);
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ReusableHelpPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ReusableHelpPart.java
index 4649ffd..856328b 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ReusableHelpPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ReusableHelpPart.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -122,7 +122,7 @@
 	private static final int STATE_LT_B = 3;
 
 	private static final int STATE_LT_BR = 4;
-	
+
 	/*
 	 * Used as a bridge from live help actions back (e.g. breadcrumb links)
 	 * to the originating help part.
@@ -178,7 +178,7 @@
 	private IStatusLineManager statusLineManager;
 
 	private IActionBars actionBars;
-	
+
 	private EngineDescriptorManager engineManager;
 
 	public IMenuManager menuManager;
@@ -304,7 +304,7 @@
 		private SubActionBars bars;
 
 		private IToolBarManager subToolBarManager;
-		
+
 		private IMenuManager subMenuManager;
 
 		protected ArrayList<PartRec> partRecs;
@@ -328,7 +328,7 @@
 					subMenuManager = new SubMenuManager(
 						ReusableHelpPart.this.menuManager);
 				} else {
-			        subMenuManager = null; 
+			        subMenuManager = null;
 			    }
 			}
 		}
@@ -345,7 +345,7 @@
 				bars = null;
 				subToolBarManager = null;
 				subMenuManager = null;
-			} else {			
+			} else {
 				try {
 					((SubToolBarManager) subToolBarManager).disposeManager();
 					if (subMenuManager != null) {
@@ -413,13 +413,13 @@
 		public PartRec[] getParts() {
 			return partRecs.toArray(new PartRec[partRecs.size()]);
 		}
-		
+
 		public void refreshPage()
 		{
 			PartRec parts[] = getParts();
 			if (parts==null)
 				return;
-			
+
 			for (int p=0;p<parts.length;p++)
 				if (parts[p]!=null && parts[p].part!=null && parts[p].part.isStale())
 					parts[p].part.refresh();
@@ -460,7 +460,7 @@
 					rec.part.stop();
 			}
 		}
-		
+
 		@Override
 		public void saveState(IMemento memento) {
 			for (int i = 0; i < partRecs.size(); i++) {
@@ -522,7 +522,7 @@
 				if (pageAction != null)
 					pageAction.setChecked(visible);
 			}
-			
+
 			if (bars != null) {
 				if (visible)
 					bars.activate();
@@ -537,7 +537,7 @@
 				ReusableHelpPart.this.toolBarManager.update(true);
 				getControl().getParent().layout();
 			}
-			
+
 		}
 
 		private void hookGlobalAction(String id, IHelpPart part) {
@@ -570,7 +570,7 @@
 			for (int focusPart = 0; focusPart < partRecs.size(); focusPart++) {
 				PartRec rec = partRecs.get(focusPart);
 				String partId = rec.part.getId();
-				if ( partId != IHelpUIConstants.HV_SEE_ALSO && partId != IHelpUIConstants.HV_MISSING_CONTENT) { 
+				if ( partId != IHelpUIConstants.HV_SEE_ALSO && partId != IHelpUIConstants.HV_MISSING_CONTENT) {
 				    rec.part.setFocus();
 				    return;
 				}
@@ -693,7 +693,7 @@
 			return HelpBasePlugin.getActivitySupport().isEnabled(href);
 		}
 	}
-	
+
 	class UAFilter extends ViewerFilter {
 
 		@Override
@@ -723,7 +723,7 @@
 	public static ReusableHelpPart getLastActiveInstance() {
 		return lastActiveInstance;
 	}
-	
+
 	private void ensureHelpIndexed() {
 		// make sure we have the index but
 		// don't schedule the indexer job if one is
@@ -734,20 +734,20 @@
 			indexerJob.schedule();
 		}
 	}
-	
+
 	/**
 	 * Adds the given page to this part.
-	 * 
+	 *
 	 * @param page the page to add
 	 */
 	public void addPage(IHelpPartPage page) {
-		pages.add(page);		
+		pages.add(page);
 	}
-	
+
 	/**
 	 * Adds the given part to this one. The part can then be used inside
 	 * any page and referred to by id.
-	 * 
+	 *
 	 * @param id the part's unique id
 	 * @param part the part to add
 	 */
@@ -755,10 +755,10 @@
 		part.init(this, id, memento);
 		mform.addPart(part);
 	}
-	
+
 	/**
 	 * Creates a new page for this part.
-	 * 
+	 *
 	 * @param id the page's unique id
 	 * @param text the page's heading, or null for none
 	 * @param iconId the page's icon
@@ -767,7 +767,7 @@
 	public IHelpPartPage createPage(String id, String text, String iconId) {
 		return new HelpPartPage(id, text, iconId);
 	}
-	
+
 	private void definePages() {
 		pages = new ArrayList<>();
 		// federated search page
@@ -784,7 +784,7 @@
 		// all topics page
 		page = new HelpPartPage(HV_ALL_TOPICS_PAGE,
 				Messages.ReusableHelpPart_allTopicsPage_name,
-				IHelpUIConstants.IMAGE_ALL_TOPICS); 
+				IHelpUIConstants.IMAGE_ALL_TOPICS);
 		page.setVerticalSpacing(0);
 		page.setHorizontalMargin(0);
 		page.addPart(HV_SEE_ALSO, false);
@@ -795,8 +795,8 @@
 
 		// bookmarks page
 		page = new HelpPartPage(HV_BOOKMARKS_PAGE,
-				Messages.ReusableHelpPart_bookmarksPage_name, 
-				IHelpUIConstants.IMAGE_BOOKMARKS); 
+				Messages.ReusableHelpPart_bookmarksPage_name,
+				IHelpUIConstants.IMAGE_BOOKMARKS);
 		page.setVerticalSpacing(0);
 		page.setHorizontalMargin(0);
 		page.addPart(HV_SEE_ALSO, false);
@@ -813,7 +813,7 @@
 		// context help page
 		page = new HelpPartPage(HV_CONTEXT_HELP_PAGE,
 				Messages.ReusableHelpPart_contextHelpPage_name,
-				IHelpUIConstants.IMAGE_RELATED_TOPICS); 
+				IHelpUIConstants.IMAGE_RELATED_TOPICS);
 		// page.addPart(HV_CONTEXT_HELP, false);
 		// page.addPart(HV_SEARCH_RESULT, false, true);
 		page.setVerticalSpacing(0);
@@ -826,7 +826,7 @@
 		// index page
 		page = new HelpPartPage(HV_INDEX_PAGE,
 				Messages.ReusableHelpPart_indexPage_name,
-				IHelpUIConstants.IMAGE_INDEX); 
+				IHelpUIConstants.IMAGE_INDEX);
 		page.setVerticalSpacing(0);
 		page.addPart(HV_SEE_ALSO, false);
 		page.addPart(HV_MISSING_CONTENT, false);
@@ -862,8 +862,8 @@
 				.getSharedImages().getImageDescriptor(
 						ISharedImages.IMG_TOOL_BACK_DISABLED));
 		backAction.setEnabled(false);
-		backAction.setText(Messages.ReusableHelpPart_back_label); 
-		backAction.setToolTipText(Messages.ReusableHelpPart_back_tooltip); 
+		backAction.setText(Messages.ReusableHelpPart_back_label);
+		backAction.setToolTipText(Messages.ReusableHelpPart_back_tooltip);
 		backAction.setId("back"); //$NON-NLS-1$
 
 		nextAction = new Action("next") { //$NON-NLS-1$
@@ -873,7 +873,7 @@
 				doNext();
 			}
 		};
-		nextAction.setText(Messages.ReusableHelpPart_forward_label); 
+		nextAction.setText(Messages.ReusableHelpPart_forward_label);
 		nextAction.setImageDescriptor(PlatformUI.getWorkbench()
 				.getSharedImages().getImageDescriptor(
 						ISharedImages.IMG_TOOL_FORWARD));
@@ -881,7 +881,7 @@
 				.getSharedImages().getImageDescriptor(
 						ISharedImages.IMG_TOOL_FORWARD_DISABLED));
 		nextAction.setEnabled(false);
-		nextAction.setToolTipText(Messages.ReusableHelpPart_forward_tooltip); 
+		nextAction.setToolTipText(Messages.ReusableHelpPart_forward_tooltip);
 		nextAction.setId("next"); //$NON-NLS-1$
 		toolBarManager.add(backAction);
 		toolBarManager.add(nextAction);
@@ -894,7 +894,7 @@
 			}
 		};
 		openInfoCenterAction
-				.setText(Messages.ReusableHelpPart_openInfoCenterAction_label); 
+				.setText(Messages.ReusableHelpPart_openInfoCenterAction_label);
 		openAction = new OpenHrefAction("open") { //$NON-NLS-1$
 
 			@Override
@@ -902,7 +902,7 @@
 				doOpen(getTarget(), getShowDocumentsInPlace());
 			}
 		};
-		openAction.setText(Messages.ReusableHelpPart_openAction_label); 
+		openAction.setText(Messages.ReusableHelpPart_openAction_label);
 		openInHelpAction = new OpenHrefAction("") {//$NON-NLS-1$
 
 			@Override
@@ -911,9 +911,9 @@
 			}
 		};
 		openInHelpAction
-				.setText(Messages.ReusableHelpPart_openInHelpContentsAction_label); 
+				.setText(Messages.ReusableHelpPart_openInHelpContentsAction_label);
 		copyAction = new CopyAction();
-		copyAction.setText(Messages.ReusableHelpPart_copyAction_label); 
+		copyAction.setText(Messages.ReusableHelpPart_copyAction_label);
 		bookmarkAction = new OpenHrefAction("bookmark") { //$NON-NLS-1$
 
 			@Override
@@ -921,12 +921,12 @@
 				doBookmark(getTarget());
 			}
 		};
-		bookmarkAction.setText(Messages.ReusableHelpPart_bookmarkAction_label); 
+		bookmarkAction.setText(Messages.ReusableHelpPart_bookmarkAction_label);
 		bookmarkAction.setImageDescriptor(HelpUIResources
 				.getImageDescriptor(IHelpUIConstants.IMAGE_ADD_BOOKMARK));
 		if (actionBars != null && actionBars.getMenuManager() != null)
 			contributeToDropDownMenu(actionBars.getMenuManager());
-		
+
 		roleFilter = new RoleFilter();
 		uaFilter = new UAFilter();
 		if (HelpBasePlugin.getActivitySupport().isUserCanToggleFiltering()) {
@@ -941,7 +941,7 @@
 			showAllAction.setImageDescriptor(HelpUIResources
 					.getImageDescriptor(IHelpUIConstants.IMAGE_SHOW_ALL));
 			showAllAction
-					.setToolTipText(Messages.AllTopicsPart_showAll_tooltip); 
+					.setToolTipText(Messages.AllTopicsPart_showAll_tooltip);
 			toolBarManager.insertBefore("back", showAllAction); //$NON-NLS-1$
 			toolBarManager.insertBefore("back", new Separator()); //$NON-NLS-1$
 			showAllAction.setChecked(!HelpBasePlugin.getActivitySupport()
@@ -962,7 +962,7 @@
 		// pages is null when the activity manager listener is added, and is set to null
 		// prior to the activity manager listener being removed, so very short timeframes in
 		// logic where pages could equals null entering this method
-		if (pages != null){ 
+		if (pages != null){
 			for (int i = 0; i < pages.size(); i++) {
 				HelpPartPage page = (HelpPartPage) pages.get(i);
 				page.refilter();
@@ -1029,7 +1029,7 @@
 			BrowserPart part = (BrowserPart) findPart(IHelpUIConstants.HV_BROWSER);
 			part.clearBrowser();
 		}
-		
+
 		HelpPartPage page = findPage(id);
 		if (page != null) {
 			page.refreshPage();
@@ -1160,7 +1160,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.ui.internal.intro.impl.parts.IStandbyContentPart#setFocus()
 	 */
 	public void setFocus() {
@@ -1180,7 +1180,7 @@
 	 * @param context
 	 * @param part
 	 * @param control
-	 * @param isExplicitRequest is true if this is the result of a direct user request such as 
+	 * @param isExplicitRequest is true if this is the result of a direct user request such as
 	 * pressing F1 and false if it is in response to a focus change listener
 	 */
 	public void update(IContextProvider provider, IContext context, IWorkbenchPart part,
@@ -1230,7 +1230,7 @@
 			part = new MissingContentPart(parent, mform.getToolkit());
 		}
 		if (part != null) {
-			mform.addPart(part);			
+			mform.addPart(part);
 			part.init(this, id, memento);
 		}
 		return part;
@@ -1293,7 +1293,7 @@
 	}
 
 	private boolean openInternalBrowser(String url) {
-		String openMode = Platform.getPreferencesService().getString(HelpBasePlugin.PLUGIN_ID, 
+		String openMode = Platform.getPreferencesService().getString(HelpBasePlugin.PLUGIN_ID,
 				 IHelpBaseConstants.P_KEY_HELP_VIEW_OPEN_MODE, IHelpBaseConstants.P_IN_PLACE, null);
 		boolean openInEditor = IHelpBaseConstants.P_IN_EDITOR.equals(openMode);
 		boolean openInBrowser = IHelpBaseConstants.P_IN_BROWSER.equals(openMode);
@@ -1329,9 +1329,9 @@
 					aurl = aurl.substring(0, aurl.length() - 14);
 				DefaultHelpUI.showInWorkbenchBrowser(aurl, false);
                 */
-				
+
 			    PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(aurl);
-				
+
 			} catch (Exception e) {
 				HelpUIPlugin.logError("Error opening browser", e); //$NON-NLS-1$
 			}
@@ -1672,7 +1672,7 @@
 			mng.setMessage(null);
 	}
 
-	
+
 
 	private void toggleShowAll(boolean checked) {
 		if (checked) {
@@ -1698,7 +1698,7 @@
 			page.toggleRoleFilter();
 		}
 	}
-	
+
 	public void saveState(IMemento memento) {
 		for (int i = 0; i < pages.size(); i++) {
 			HelpPartPage page = (HelpPartPage) pages.get(i);
@@ -1743,7 +1743,7 @@
 		}
 		return buff.toString();
 	}
-	
+
 	EngineDescriptorManager getEngineManager() {
 		if (engineManager==null) {
 			engineManager = new EngineDescriptorManager();
@@ -1772,9 +1772,9 @@
 		clearBrowser();
 		showURL("/org.eclipse.help.webapp/" + MissingContentManager.MISSING_BOOKS_HELP_VIEW_HREF); //$NON-NLS-1$
 		updateStatusLinks();
-		
+
 	}
-	
+
 	private void clearBrowser() {
 		IHelpPart part = findPart(HV_BROWSER);
 		if ( part == null ) {
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ReusableHelpPartHistory.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ReusableHelpPartHistory.java
index 0b90e4e..5fd6011 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ReusableHelpPartHistory.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ReusableHelpPartHistory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
 
 	public void addEntry(HistoryEntry entry) {
 		if (cursor!= -1) {
-			// If we are adding a new entry while 
+			// If we are adding a new entry while
 			// the cursor is not at the end, discard
 			// all the entries after the cursor.
 			int extra = queue.size()-1 -cursor;
@@ -47,11 +47,11 @@
 	public boolean hasPrev() {
 		return cursor != -1 && cursor > 0;
 	}
-	
+
 	public HistoryEntry getNext() {
 		return hasNext()?(HistoryEntry)queue.get(cursor+1):null;
 	}
-	
+
 	public HistoryEntry getPrev() {
 		return hasPrev() ? (HistoryEntry)queue.get(cursor-1):null;
 	}
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopePreferenceDialog.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopePreferenceDialog.java
index a2e5699..ed3b799 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopePreferenceDialog.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopePreferenceDialog.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -33,7 +33,7 @@
 public class ScopePreferenceDialog extends PreferenceDialog {
 	private EngineDescriptorManager descManager;
 	private ArrayList<PendingOperation> pendingOperations;
-	
+
 	class PendingOperation {
 		int action;
 		EngineDescriptor desc;
@@ -51,7 +51,7 @@
 	 * The Remove button id.
 	 */
 	private final static int DELETE_ID = IDialogConstants.CLIENT_ID + 2;
-	
+
 	public ScopePreferenceDialog(Shell parentShell, PreferenceManager manager, EngineDescriptorManager descManager, boolean editable) {
 		super(parentShell, manager);
 		this.descManager = descManager;
@@ -69,10 +69,10 @@
 		gd.horizontalSpan = 2;
 		treeControl.setLayoutData(gd);
 
-		Button lbutton = createButton(container, NEW_ID, Messages.ScopePreferenceDialog_new, false); 
+		Button lbutton = createButton(container, NEW_ID, Messages.ScopePreferenceDialog_new, false);
 		gd = (GridData)lbutton.getLayoutData();
 		gd.horizontalAlignment = GridData.HORIZONTAL_ALIGN_BEGINNING;
-		Button rbutton = createButton(container, DELETE_ID, Messages.ScopePreferenceDialog_delete, false); 
+		Button rbutton = createButton(container, DELETE_ID, Messages.ScopePreferenceDialog_delete, false);
 		rbutton.setEnabled(false);
 		gd = (GridData)rbutton.getLayoutData();
 		gd.horizontalAlignment = GridData.HORIZONTAL_ALIGN_BEGINNING;
@@ -82,7 +82,7 @@
 		treeGd.widthHint = Math.max(treeGd.widthHint, size.x);
 		return container;
 	}
-	
+
 	@Override
 	protected TreeViewer createTreeViewer(Composite parent) {
 		TreeViewer viewer = super.createTreeViewer(parent);
@@ -93,7 +93,7 @@
 		});
 		return viewer;
 	}
-	
+
 	@Override
 	protected void buttonPressed(int buttonId) {
 		switch (buttonId) {
@@ -107,7 +107,7 @@
 			super.buttonPressed(buttonId);
 		}
 	}
-	
+
 	private void treeSelectionChanged(Object obj) {
 		boolean removable = false;
 		if (obj instanceof ScopePreferenceManager.EnginePreferenceNode) {
@@ -117,7 +117,7 @@
 		}
 		getButton(DELETE_ID).setEnabled(removable);
 	}
-	
+
 	private void doNew() {
 		NewEngineWizard wizard = new NewEngineWizard(descManager.getEngineTypes());
 		WizardDialog dialog = new WizardDialog(getShell(), wizard);
@@ -147,7 +147,7 @@
 			scheduleOperation(DELETE_ID, desc);
 		}
 	}
-	
+
 	private void scheduleOperation(int action, EngineDescriptor desc) {
 		if (pendingOperations==null)
 			pendingOperations = new ArrayList<>();
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopePreferenceManager.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopePreferenceManager.java
index 32c437c..8417cae 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopePreferenceManager.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopePreferenceManager.java
@@ -20,10 +20,10 @@
 import org.eclipse.jface.preference.PreferenceNode;
 
 public class ScopePreferenceManager extends PreferenceManager implements IHelpUIConstants {
-	private ScopeSet set;	
+	private ScopeSet set;
 	class SubpagePreferenceNode extends PreferenceNode {
 		private IConfigurationElement config;
-	
+
 		public SubpagePreferenceNode(String id, String label,
 				IConfigurationElement config) {
 			super(id, label, null, null);
@@ -45,7 +45,7 @@
 	}
 	class EnginePreferenceNode extends PreferenceNode {
 		private EngineDescriptor desc;
-		
+
 		public EnginePreferenceNode(EngineDescriptor desc) {
 			super(desc.getId(), desc.getLabel(), desc.getImageDescriptor(), null);
 			this.desc = desc;
@@ -64,10 +64,10 @@
 	    }
 	}
 	/**
-	 * 
+	 *
 	 */
 	public ScopePreferenceManager(EngineDescriptorManager descManager, ScopeSet set) {
-		this.set = set;		
+		this.set = set;
 		load(descManager.getDescriptors());
 	}
 
@@ -78,8 +78,8 @@
 			IConfigurationElement [] pages = desc.getPages();
 			for (int j=0; j<pages.length; j++) {
 				String category = pages[i].getAttribute(ATT_CATEGORY);
-				addNode(category, pages[i].getAttribute(ATT_ID), 
-						pages[i].getAttribute(ATT_LABEL), 
+				addNode(category, pages[i].getAttribute(ATT_ID),
+						pages[i].getAttribute(ATT_LABEL),
 						pages[i]);
 			}
 		}
@@ -95,5 +95,5 @@
 		if (parent!=null)
 			parent.add(node);
 		return node;
-	}	
+	}
 }
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSelectPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSelectPart.java
index 123a04f..8f9021e 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSelectPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSelectPart.java
@@ -32,8 +32,8 @@
 import org.eclipse.ui.forms.widgets.TableWrapLayout;
 
 public class ScopeSelectPart extends AbstractFormPart implements IHelpPart  {
-	
-	
+
+
 	public class ScopeObserver implements Observer {
 
 		@Override
@@ -49,14 +49,14 @@
 	private String id;
 	private ScopeObserver scopeObserver;
 
-	public ScopeSelectPart(Composite parent, FormToolkit toolkit) {	
+	public ScopeSelectPart(Composite parent, FormToolkit toolkit) {
 		container = toolkit.createComposite(parent);
 		TableWrapLayout layout = new TableWrapLayout();
 		layout.numColumns = 1;
 		container.setLayout(layout);
 		ScopeSetManager scopeSetManager = ScopeState.getInstance().getScopeSetManager();
 		String name = scopeSetManager.getActiveSet().getName();
-		scopeSetLink = toolkit.createFormText(container, false); 
+		scopeSetLink = toolkit.createFormText(container, false);
 		setScopeLink(name);
 		scopeSetLink.addHyperlinkListener(new HyperlinkAdapter() {
 
@@ -70,13 +70,13 @@
 		td.valign = TableWrapData.MIDDLE;
 		scopeSetLink.setLayoutData(td);
 		scopeObserver = new ScopeObserver();
-		scopeSetManager.addObserver(scopeObserver);	
+		scopeSetManager.addObserver(scopeObserver);
 	}
-	
+
 	private void doChangeScopeSet() {
 		ScopeSetManager scopeSetManager = ScopeState.getInstance().getScopeSetManager();
-		ScopeSetDialog dialog = new ScopeSetDialog(container.getShell(), 
-				scopeSetManager, 
+		ScopeSetDialog dialog = new ScopeSetDialog(container.getShell(),
+				scopeSetManager,
 				ScopeState.getInstance().getEngineManager(), true);
 		dialog.setInput(scopeSetManager);
 		dialog.create();
@@ -90,7 +90,7 @@
 			scopeSetManager.notifyObservers();
 		}
 	}
-	
+
 	private void setActiveScopeSet(ScopeSet set) {
 		setScopeLink(set.getName());
 		ScopeState.getInstance().getScopeSetManager().setActiveSet(set);
@@ -106,7 +106,7 @@
 			nameBuff.append(Messages.FederatedSearchPart_changeScopeSet);
 			nameBuff.append("\""); //$NON-NLS-1$
 		}
-			
+
 		nameBuff.append(">");  //$NON-NLS-1$
 		nameBuff.append(EscapeUtils.escapeSpecialChars(name ));
 		nameBuff.append(" </a><b>"); //$NON-NLS-1$
@@ -159,19 +159,19 @@
 
 	@Override
 	public void stop() {
-		
+
 	}
 
 	@Override
 	public void toggleRoleFilter() {
-		
+
 	}
 
 	@Override
 	public void refilter() {
-			
+
 	}
-	
+
 	@Override
 	public void dispose() {
 		if (scopeObserver != null) {
@@ -179,5 +179,5 @@
 		}
 		super.dispose();
 	}
-		
+
 }
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSet.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSet.java
index e0c3db6..b8d3b44 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSet.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSet.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -32,40 +32,40 @@
 	private PreferenceStore preferenceStore;
 	private boolean needsSaving;
 	private int defaultSet = -1;
-	
+
 	public ScopeSet() {
 		this(Messages.ScopeSet_default);
 		defaultSet = 1;
 	}
-	
+
 	public ScopeSet(String name) {
 		this.needsSaving = true;
 		this.name = name;
 	}
-	
+
 	public boolean isEditable() {
 		return !isDefault();
 	}
-	
+
 	public boolean isDefault() {
 		if (defaultSet==1)
 			return true;
 		return getPreferenceStore().getBoolean(KEY_DEFAULT);
 	}
-	
+
 	public boolean isImplicit() {
 		return false;
 	}
 
 	public ScopeSet(ScopeSet set, String name) {
-		this(name); 
+		this(name);
 		copyFrom(set);
 	}
-	
+
 	public void copyFrom(ScopeSet set) {
 		copy((PreferenceStore)set.getPreferenceStore());
 	}
-	
+
 	public void dispose() {
 		File file = new File(getFileName(name));
 		if (file.exists())
@@ -88,7 +88,7 @@
 		}
 		return preferenceStore;
 	}
-	
+
 	protected String encodeFileName(String name) {
 		return name;
 	}
@@ -96,10 +96,10 @@
 	private String getFileName(String name) {
 		IPath location = HelpUIPlugin.getDefault().getStateLocation();
 		location = location.append(SCOPE_DIR_NAME);
-		location = location.append(encodeFileName(name)+getExtension()); 
+		location = location.append(encodeFileName(name)+getExtension());
 		return location.toOSString();
 	}
-	
+
 	protected String getExtension() {
 		return EXT;
 	}
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSetDialog.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSetDialog.java
index 2720190..b800081 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSetDialog.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSetDialog.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -48,8 +48,8 @@
  * Scope dialog for federated search.
  */
 public class ScopeSetDialog extends TrayDialog  {
-	
-	
+
+
 	public class NonDefaultFilter extends ViewerFilter {
 
 		@Override
@@ -82,7 +82,7 @@
 	private ArrayList<ScopeSet> sets;
 	private ArrayList<PendingOperation> operations;
 	private IStructuredContentProvider contentProvider;
-	
+
 	private Button showAllRadio;
 	private Button showSelectedRadio;
 
@@ -94,7 +94,7 @@
 	private ScopeSet initialSelection;
 	private Object[] result;
 	private boolean localOnly;
-	
+
 	private abstract class PendingOperation {
 		ScopeSet set;
 		public PendingOperation(ScopeSet set) {
@@ -103,7 +103,7 @@
 		public abstract void commit();
 		public abstract void cancel();
 	}
-	
+
 	private class AddOperation extends PendingOperation {
 		public AddOperation(ScopeSet set) {
 			super(set);
@@ -163,7 +163,7 @@
 		public void cancel() {
 		}
 	}
-	
+
 	private class ScopeContentProvider implements IStructuredContentProvider {
 
 		@Override
@@ -179,7 +179,7 @@
 		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 		}
 	}
-	
+
 	private class ScopeLabelProvider extends LabelProvider {
 
 		@Override
@@ -217,11 +217,11 @@
 		labelProvider = new ScopeLabelProvider();
 		setInitialSelections( manager.getActiveSet());
 	}
-	
+
 	private void setInitialSelections(ScopeSet scopeSet) {
 		initialSelection = scopeSet;
 	}
-	
+
 	private ArrayList<ScopeSet> extractSets(ScopeSet[] array) {
 		ArrayList<ScopeSet> list = new ArrayList<>();
 		for (int i=0; i<array.length; i++) {
@@ -229,7 +229,7 @@
 		}
 		return list;
 	}
-	
+
 	@Override
 	protected Control createDialogArea(Composite container) {
     	Composite innerContainer = (Composite)super.createDialogArea(container);
@@ -244,20 +244,20 @@
 		viewer.setFilters(filters );
     	return innerContainer;
     }
-    
+
 	private void createRadioButtons(Composite parent) {
 		boolean showAll = initialSelection != null  && initialSelection.isDefault();
 		showAllRadio = new Button(parent, SWT.RADIO);
     	showAllRadio.setText(Messages.ScopeSet_selectAll);
-    	
+
     	showSelectedRadio = new Button(parent, SWT.RADIO);
     	showSelectedRadio.setText(Messages.ScopeSet_selectWorkingSet);
     	showAllRadio.addSelectionListener(new ShowAllListener());
     	showAllRadio.setSelection(showAll);
     	showSelectedRadio.setSelection(!showAll);
 	}
-    
-    private void createTable(Composite parent) {	
+
+    private void createTable(Composite parent) {
         viewer = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
         viewer.setContentProvider(contentProvider);
         viewer.setLabelProvider(labelProvider);
@@ -265,7 +265,7 @@
 		viewer.addDoubleClickListener(event -> okPressed());
         if (initialSelection != null) {
 			viewer.setSelection(new StructuredSelection(initialSelection));
-		} 
+		}
         GridData gd = new GridData(GridData.FILL_BOTH);
         gd.heightHint = convertHeightInCharsToPixels(heightInChars);
         gd.widthHint = convertWidthInCharsToPixels(widthInChars);
@@ -273,13 +273,13 @@
         table.setLayoutData(gd);
         table.setFont(parent.getFont());
     }
-    
+
 	private void enableTable() {
 		if (viewer != null) {
 		    boolean showSelected = showSelectedRadio.getSelection();
 			viewer.getTable().setEnabled(showSelected);
 		    viewer.refresh();
-		    // Ensure that a scope is selected unless there are no 
+		    // Ensure that a scope is selected unless there are no
 		    // user defined scopes
 		    if (showSelected && viewer.getSelection().isEmpty()) {
 		    	Object firstElement = viewer.getElementAt(0);
@@ -289,7 +289,7 @@
 		    }
 		}
 	}
-    
+
     private void createEditingButtons(Composite composite) {
 		Composite buttonComposite= new Composite(composite, SWT.RIGHT);
 		GridLayout layout= new GridLayout();
@@ -298,19 +298,19 @@
 		GridData data= new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL);
 		data.grabExcessHorizontalSpace= true;
 		composite.setData(data);
-    	createButton(buttonComposite, NEW_ID, Messages.ScopeSetDialog_new, false); 
-       	renameButton = createButton(buttonComposite, RENAME_ID, Messages.ScopeSetDialog_rename, false); 
-       	editButton = createButton(buttonComposite, EDIT_ID, Messages.ScopeSetDialog_edit, false); 
-       	removeButton = createButton(buttonComposite, REMOVE_ID, Messages.ScopeSetDialog_remove, false); 
+    	createButton(buttonComposite, NEW_ID, Messages.ScopeSetDialog_new, false);
+       	renameButton = createButton(buttonComposite, RENAME_ID, Messages.ScopeSetDialog_rename, false);
+       	editButton = createButton(buttonComposite, EDIT_ID, Messages.ScopeSetDialog_edit, false);
+       	removeButton = createButton(buttonComposite, REMOVE_ID, Messages.ScopeSetDialog_remove, false);
        	updateButtons();
     }
-	
+
 	public ScopeSet getActiveSet() {
 		if (result!=null && result.length>0)
 			return (ScopeSet)result[0];
 		return null;
 	}
-	
+
 	@Override
 	protected void okPressed() {
     	if (operations!=null) {
@@ -330,7 +330,7 @@
     	}
     	super.okPressed();
     }
-	
+
 	private void setResult(ScopeSet scope) {
 		result = new Object[] { scope };
 	}
@@ -343,7 +343,7 @@
 			newResult.toArray(result);
 		}
 	}
-	
+
 	@Override
 	protected void cancelPressed() {
     	if (operations!=null) {
@@ -355,7 +355,7 @@
     	}
 		super.cancelPressed();
 	}
-	
+
 	@Override
 	protected void buttonPressed(int buttonId) {
 		switch (buttonId) {
@@ -375,7 +375,7 @@
 		}
 		super.buttonPressed(buttonId);
 	}
-	
+
 	private void doNew() {
 		ScopeSet newSet = new ScopeSet(getDefaultName());
 		String name = getNewName(newSet.getName(), false);
@@ -388,7 +388,7 @@
 			updateButtons();
 		}
 	}
-	
+
 	private String getDefaultName() {
 		Set<String> namesInUse = new HashSet<>();
 		for (int i=0; i<sets.size(); i++) {
@@ -396,7 +396,7 @@
 		    namesInUse.add(set.getName().toLowerCase());
 	    }
 		for (int i = 1; i < 1000; i++) {
-			String name = Messages.ScopeSetDialog_defaultName + i; 
+			String name = Messages.ScopeSetDialog_defaultName + i;
 			if (!namesInUse.contains(name.toLowerCase())) {
 				return name;
 			}
@@ -412,15 +412,15 @@
 			return;
 		}
 		PreferenceManager manager = new ScopePreferenceManager(descManager, set);
-		
-		if (!localOnly) { 
+
+		if (!localOnly) {
 		    PreferenceDialog dialog = new ScopePreferenceDialog(getShell(), manager, descManager, set.isEditable());
 			dialog.setPreferenceStore(set.getPreferenceStore());
 			dialog.create();
 			dialog.getShell().setText(NLS.bind(Messages.ScopePreferenceDialog_wtitle, set.getName()));
 			dialog.open();
 		} else {
-			LocalScopeDialog localDialog = new LocalScopeDialog(getShell(), manager, descManager, set); 
+			LocalScopeDialog localDialog = new LocalScopeDialog(getShell(), manager, descManager, set);
 			localDialog.create();
 			localDialog.getShell().setText(NLS.bind(Messages.ScopePreferenceDialog_wtitle, set.getName()));
 			localDialog.open();
@@ -437,7 +437,7 @@
 			if (newName!=null) {
 				if (rop!=null)
 					rop.newName = newName;
-				else 
+				else
 					scheduleOperation(new RenameOperation(set, newName));
 				viewer.update(set, null);
 				updateButtons();
@@ -454,13 +454,13 @@
 		dialog.create();
 		String dialogTitle = isRename ?
 		  Messages.RenameDialog_wtitle : Messages.NewDialog_wtitle;
-	    dialog.getShell().setText(dialogTitle); 
+	    dialog.getShell().setText(dialogTitle);
 		if (dialog.open()==RenameDialog.OK) {
 			return dialog.getNewName();
 		}
 		return null;
 	}
-	
+
 	private void doRemove() {
 		IStructuredSelection ssel = (IStructuredSelection)viewer.getSelection();
 		ScopeSet set = (ScopeSet)ssel.getFirstElement();
@@ -472,17 +472,17 @@
 			Object element = viewer.getElementAt(0);
 			if (element != null) {
 				viewer.setSelection(new StructuredSelection(element));
-			} 
+			}
 			updateButtons();
 		}
 	}
-	
+
 	private void scheduleOperation(PendingOperation op) {
 		if (operations==null)
 			operations = new ArrayList<>();
 		operations.add(op);
 	}
-	
+
 	private void updateButtons() {
 		IStructuredSelection ssel = (IStructuredSelection)viewer.getSelection();
 		editButton.setEnabled(ssel.isEmpty()==false);
@@ -491,7 +491,7 @@
 		removeButton.setEnabled(editableSet);
 		renameButton.setEnabled(editableSet);
 	}
-	
+
 	private PendingOperation findOperation(ScopeSet set, Class<?> type) {
 		if (operations!=null) {
 			for (int i=0; i<operations.size(); i++) {
@@ -506,6 +506,6 @@
 	}
 
 	public void setInput(ScopeSetManager scopeSetManager) {
-		input = scopeSetManager;	
-	}	
+		input = scopeSetManager;
+	}
 }
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSetManager.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSetManager.java
index a2732d6..6a018e9 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSetManager.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeSetManager.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -113,7 +113,7 @@
 			for (int i = 0; i < files.length; i++) {
 				File file = files[i];
 				String name = file.getName();
-				int loc = name.lastIndexOf(ScopeSet.EXT); 
+				int loc = name.lastIndexOf(ScopeSet.EXT);
 				if (loc != -1) {
 					ScopeSet set = new ScopeSet(name.substring(0, loc));
 					sets.add(set);
@@ -121,7 +121,7 @@
 						defSet = set;
 					continue;
 				}
-				loc = name.lastIndexOf(HistoryScopeSet.EXT); 
+				loc = name.lastIndexOf(HistoryScopeSet.EXT);
 				if (loc != -1) {
 					HistoryScopeSet set = new HistoryScopeSet(name.substring(0,
 							loc), null);
@@ -138,7 +138,7 @@
 		}
 
 	}
-	
+
 	public ScopeSet getDefaultScope() {
 		return defSet;
 	}
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeState.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeState.java
index 4b99bd1..e559c19 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeState.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/ScopeState.java
@@ -12,20 +12,20 @@
 package org.eclipse.help.ui.internal.views;
 
 public class ScopeState  {
-	
+
 	private static ScopeState instance;
 	private ScopeSetManager scopeSetManager;
 	private EngineDescriptorManager engineManager;
-	
-	public static synchronized ScopeState getInstance() {		
+
+	public static synchronized ScopeState getInstance() {
 		if ( instance == null )
 		{
 			instance = new ScopeState();
 		}
 		return instance;
 	}
-	
-	private ScopeState() {	
+
+	private ScopeState() {
 		scopeSetManager = new ScopeSetManager();
 	}
 
@@ -40,5 +40,5 @@
 	public void setEngineManager(EngineDescriptorManager engineManager) {
 		this.engineManager = engineManager;
 	}
-	
+
 }
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SearchPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SearchPart.java
index 4264433..997c3aa 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SearchPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SearchPart.java
@@ -63,7 +63,7 @@
 
 public class SearchPart extends AbstractFormPart implements IHelpPart, IHelpUIConstants {
 
-	
+
 	public class SearchScopeObserver implements Observer {
 
 		@Override
@@ -255,11 +255,11 @@
 				shellDefaultButton = null;
 			}
 		});
-		
+
 		createScopeSection(toolkit);
-		
+
 //		createAlternateQueriesSection(toolkit);
-		
+
 		toolkit.paintBordersFor(container);
 		jobListener = new JobListener();
 		Job.getJobManager().addJobChangeListener(jobListener);
@@ -284,7 +284,7 @@
 		scopeObserver = new SearchScopeObserver();
 		scopeSetManager.addObserver(scopeObserver);
 	}
-	
+
 	private void createSearchExpressionSection(FormToolkit toolkit) {
 		TableWrapData td;
 		Section searchExpressionSection = toolkit.createSection(container, Section.TWISTIE | Section.COMPACT
@@ -312,7 +312,7 @@
 		updateSearchWordText();
 		toolkit.paintBordersFor(detailGroup);
 	}
-	
+
 	private void createAlternateQueriesSection(FormToolkit toolkit){
 
 		TableWrapData td = new TableWrapData();
@@ -320,12 +320,12 @@
 		td.align = TableWrapData.FILL;
 
 		container.setMenu(new Menu(container));
-		
+
 		alternateQuerySection = toolkit.createSection(container, Section.TWISTIE | Section.COMPACT
 				| Section.LEFT_TEXT_CLIENT_ALIGNMENT);
 		alternateQuerySection.setLayoutData(td);
 		alternateQuerySection.setText(Messages.AlternateQueries);
-		
+
 		alternateQueryComposite = toolkit.createComposite(alternateQuerySection);
 		alternateQuerySection.setClient(alternateQueryComposite);
 		TableWrapLayout flayout = new TableWrapLayout();
@@ -335,7 +335,7 @@
 
 //		alternateQuerySection.setVisible(false);
 	}
-	
+
 	private void createAdvancedLink(Composite parent, FormToolkit toolkit) {
 		advancedLink = toolkit.createHyperlink(parent, Messages.FederatedSearchPart_advanced, SWT.NULL);
 		advancedLink.addHyperlinkListener(new HyperlinkAdapter() {
@@ -623,10 +623,10 @@
 												}
 											});
 										}
-									}									
+									}
 								}
 							});
-						}						
+						}
 					}
 
 							@Override
@@ -735,7 +735,7 @@
 			searchPending = false;
 			doSearch(searchWordCombo.getText());
 		}
-		
+
 	}
 
 	@Override
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SearchResultsPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SearchResultsPart.java
index dcf0cef..c0dbf77 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SearchResultsPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SearchResultsPart.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -110,7 +110,7 @@
 		results = new ArrayList<>();
 		contributeToToolBar(tbm);
 	}
-	
+
 	void updateSeparatorVisibility() {
 		ScrollBar scrollBar = innerForm.getVerticalBar();
 		separator.setVisible(scrollBar.getSelection()>0);
@@ -127,9 +127,9 @@
 		 */
 
 		boolean descOn = Platform.getPreferencesService().getBoolean
-			    (HelpBasePlugin.PLUGIN_ID, IHelpBaseConstants.P_KEY_SHOW_SEARCH_DESCRIPTION, false, null);			
+			    (HelpBasePlugin.PLUGIN_ID, IHelpBaseConstants.P_KEY_SHOW_SEARCH_DESCRIPTION, false, null);
 		boolean showCategories = Platform.getPreferencesService().getBoolean
-			    (HelpBasePlugin.PLUGIN_ID, IHelpBaseConstants.P_KEY_SHOW_SEARCH_CATEGORIES, false, null);			
+			    (HelpBasePlugin.PLUGIN_ID, IHelpBaseConstants.P_KEY_SHOW_SEARCH_CATEGORIES, false, null);
 		showCategoriesAction = new Action() {
 
 			@Override
@@ -146,7 +146,7 @@
 		showCategoriesAction.setImageDescriptor(HelpUIResources
 				.getImageDescriptor(IHelpUIConstants.IMAGE_SHOW_CATEGORIES));
 		showCategoriesAction.setChecked(showCategories);
-		showCategoriesAction.setToolTipText(Messages.SearchResultsPart_showCategoriesAction_tooltip); 
+		showCategoriesAction.setToolTipText(Messages.SearchResultsPart_showCategoriesAction_tooltip);
 		showCategoriesAction.setId("categories"); //$NON-NLS-1$
 		tbm.insertBefore("back", showCategoriesAction); //$NON-NLS-1$
 
@@ -166,7 +166,7 @@
 		showDescriptionAction.setImageDescriptor(HelpUIResources
 				.getImageDescriptor(IHelpUIConstants.IMAGE_SHOW_DESC));
 		showDescriptionAction.setChecked(descOn);
-		showDescriptionAction.setToolTipText(Messages.SearchResultsPart_showDescriptionAction_tooltip); 
+		showDescriptionAction.setToolTipText(Messages.SearchResultsPart_showDescriptionAction_tooltip);
 		showDescriptionAction.setId("description"); //$NON-NLS-1$
 		tbm.insertAfter("categories", showDescriptionAction); //$NON-NLS-1$
 		tbm.insertAfter("description", new Separator()); //$NON-NLS-1$
@@ -216,7 +216,7 @@
 	public void setVisible(boolean visible) {
 		container.setVisible(visible);
 	}
-	
+
 	void clearResults() {
 		clearResultSections();
 		separator.setVisible(false);
@@ -247,7 +247,7 @@
 		}
 		reflow();
 	}
-	
+
 	private EngineDescriptor findLocalHelp(ArrayList<EngineDescriptor> eds) {
 		for (int i=0; i<eds.size(); i++) {
 			EngineDescriptor ed = eds.get(i);
@@ -256,14 +256,14 @@
 		}
 		return null;
 	}
-	
+
 	void completed() {
 		for (int i = 0; i < results.size(); i++) {
 			EngineResultSection section = results.get(i);
 			section.completed();
 		}
 	}
-	
+
 	void canceling() {
 		for (int i = 0; i < results.size(); i++) {
 			EngineResultSection section = results.get(i);
@@ -279,7 +279,7 @@
 		} else
 			parent.showURL(url);
 	}
-	
+
 	void doCategoryLink(String href) {
 		parent.showPage(IHelpUIConstants.HV_ALL_TOPICS_PAGE);
 		AllTopicsPart part = (AllTopicsPart) parent
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SeeAlsoPart.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SeeAlsoPart.java
index c306972..8185bb9 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SeeAlsoPart.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SeeAlsoPart.java
@@ -68,7 +68,7 @@
 		rlayout.justify = false;
 		rlayout.wrap = true;
 		linkContainer.setLayout(rlayout);
-		
+
 		hyperlinkGroup = new HyperlinkGroup(container.getDisplay());
 		hyperlinkGroup.setHyperlinkUnderlineMode(toolkit.getHyperlinkGroup().getHyperlinkUnderlineMode());
 	}
@@ -84,7 +84,7 @@
 			} else {
 	            link.setFont(JFaceResources.getDefaultFont());
 			}
-			data.exclude = false; 
+			data.exclude = false;
 			link.setVisible(!data.exclude);
 		}
 		linkContainer.layout();
@@ -101,24 +101,24 @@
 			}
 		};
 		if ((helpPart.getStyle() & ReusableHelpPart.ALL_TOPICS) != 0)
-			addPageLink(container, toolkit, Messages.SeeAlsoPart_allTopics, IHelpUIConstants.HV_ALL_TOPICS_PAGE, 
+			addPageLink(container, toolkit, Messages.SeeAlsoPart_allTopics, IHelpUIConstants.HV_ALL_TOPICS_PAGE,
 				IHelpUIConstants.IMAGE_ALL_TOPICS, listener);
 		if ((helpPart.getStyle() & ReusableHelpPart.SEARCH) != 0) {
-			addPageLink(container, toolkit, Messages.SeeAlsoPart_search, IHelpUIConstants.HV_FSEARCH_PAGE, 
+			addPageLink(container, toolkit, Messages.SeeAlsoPart_search, IHelpUIConstants.HV_FSEARCH_PAGE,
 				IHelpUIConstants.IMAGE_HELP_SEARCH, listener);
 		}
 		if ((helpPart.getStyle() & ReusableHelpPart.CONTEXT_HELP) != 0) {
-			addPageLink(container, toolkit, Messages.SeeAlsoPart_contextHelp, 
+			addPageLink(container, toolkit, Messages.SeeAlsoPart_contextHelp,
 				IHelpUIConstants.HV_CONTEXT_HELP_PAGE,
 				IHelpUIConstants.IMAGE_RELATED_TOPICS, listener);
 		}
 		if ((helpPart.getStyle() & ReusableHelpPart.BOOKMARKS) != 0) {
-			addPageLink(container, toolkit, Messages.SeeAlsoPart_bookmarks, 
+			addPageLink(container, toolkit, Messages.SeeAlsoPart_bookmarks,
 				IHelpUIConstants.HV_BOOKMARKS_PAGE,
 				IHelpUIConstants.IMAGE_BOOKMARKS, listener);
 		}
 		if ((helpPart.getStyle() & ReusableHelpPart.INDEX) != 0) {
-			addPageLink(container, toolkit, Messages.SeeAlsoPart_index, 
+			addPageLink(container, toolkit, Messages.SeeAlsoPart_index,
 				IHelpUIConstants.HV_INDEX_PAGE,
 				IHelpUIConstants.IMAGE_INDEX, listener);
 		}
@@ -183,7 +183,7 @@
 			bgImage.dispose();
 		}
 	}
-	
+
 	@Override
 	public boolean fillContextMenu(IMenuManager manager) {
 		return false;
@@ -222,8 +222,8 @@
 
 	@Override
 	public void saveState(IMemento memento) {
-	}	
-	
+	}
+
 	@Override
 	public void setFocus() {
 		if (linkContainer!=null)
diff --git a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SorterByScore.java b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SorterByScore.java
index 115a6cd..b4a5bf9 100644
--- a/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SorterByScore.java
+++ b/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/views/SorterByScore.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.ui.intro.quicklinks/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.ui.intro.quicklinks/.settings/org.eclipse.jdt.ui.prefs
index 3034211..7ef1796 100644
--- a/org.eclipse.ui.intro.quicklinks/.settings/org.eclipse.jdt.ui.prefs
+++ b/org.eclipse.ui.intro.quicklinks/.settings/org.eclipse.jdt.ui.prefs
@@ -1,6 +1,63 @@
-#Sat Nov 12 22:58:47 EST 2005
 eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
 formatter_profile=_UA
 formatter_settings_version=9
 internal.default.compliance=user
 org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.ui.intro.quicklinks/src/org/eclipse/ui/intro/quicklinks/QuicklinksViewer.java b/org.eclipse.ui.intro.quicklinks/src/org/eclipse/ui/intro/quicklinks/QuicklinksViewer.java
index 23283bb..3588e45 100644
--- a/org.eclipse.ui.intro.quicklinks/src/org/eclipse/ui/intro/quicklinks/QuicklinksViewer.java
+++ b/org.eclipse.ui.intro.quicklinks/src/org/eclipse/ui/intro/quicklinks/QuicklinksViewer.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     Manumitting Technologies Inc - initial API and implementation
  *******************************************************************************/
@@ -70,7 +70,7 @@
  * from an extension point. The appearance of these quicklinks is normally taken
  * from the command metadata, including the image icon, but can be tailored.
  * These tailorings can be made optional depending on the current theme.
- * 
+ *
  * This implementation is still experimental and subject to change. Feedback
  * welcome as a <a href="http://eclip.se/9f">bug report on the Eclipse Bugzilla
  * against Platform/User Assistance</a>.
@@ -160,7 +160,7 @@
 
 		/**
 		 * Return the list of configured {@link Quicklink} that can be found.
-		 * 
+		 *
 		 * @return
 		 */
 		public List<Quicklink> get() {
@@ -177,7 +177,7 @@
 					}
 				}
 			}
-			
+
 			for (IExtension ext : extensions) {
 				if (productBundle == null || !productBundle.getSymbolicName().equals(ext.getNamespaceIdentifier())) {
 					for (IConfigurationElement ce : ext.getConfigurationElements()) {
@@ -247,7 +247,7 @@
 		/**
 		 * Find {@link Quicklink}s whose {@code commandSpec} matches the simple
 		 * wildcard pattern in {@code commandSpecPattern}
-		 * 
+		 *
 		 * @param commandSpecPattern
 		 *            a simple wildcard pattern supporting *, ?
 		 * @return the set of matching Quicklinks
@@ -326,7 +326,7 @@
 
 	/**
 	 * Find the current Welcome/Intro identifier
-	 * 
+	 *
 	 * @return the current identifier or {@code null} if no theme
 	 */
 	protected String getCurrentThemeId() {
@@ -396,7 +396,7 @@
 	 * Rewrite or possible extract the icon at the given URL to a stable URL
 	 * that can be embedded in HTML and rendered in a browser. May create
 	 * temporary files that will be cleaned up on exit.
-	 * 
+	 *
 	 * @param iconURL
 	 * @return stable URL
 	 */
@@ -425,7 +425,7 @@
 
 	/**
 	 * Write out the image as a data: URL if possible or to the file-system.
-	 * 
+	 *
 	 * @param descriptor
 	 * @return URL with the resulting image
 	 */
@@ -496,7 +496,7 @@
 	 * Attempt to populate common fields given other information. For commands,
 	 * we look up information in the ICommandService and ICommandImageService.
 	 * Return false if this quicklink cannot be found and should not be shown.
-	 * 
+	 *
 	 * @return true if should be included
 	 */
 	private boolean populateQuicklink(Quicklink ql) {
diff --git a/org.eclipse.ui.intro.quicklinks/src/org/eclipse/ui/intro/quicklinks/URLLabelProvider.java b/org.eclipse.ui.intro.quicklinks/src/org/eclipse/ui/intro/quicklinks/URLLabelProvider.java
index 20ec3ab..8ba0555 100644
--- a/org.eclipse.ui.intro.quicklinks/src/org/eclipse/ui/intro/quicklinks/URLLabelProvider.java
+++ b/org.eclipse.ui.intro.quicklinks/src/org/eclipse/ui/intro/quicklinks/URLLabelProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     Manumitting Technologies Inc - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.ui.intro.universal/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.ui.intro.universal/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..3f3352a
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,59 @@
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/BaseData.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/BaseData.java
index 82ec33a..a022398 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/BaseData.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/BaseData.java
@@ -24,7 +24,7 @@
 	public GroupData getParent() {
 		return parent;
 	}
-	
+
 	public abstract void write(PrintWriter writer, String indent);
 
 	public String getId() {
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationContentsArea.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationContentsArea.java
index 9a404f4..2f4d9ab 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationContentsArea.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationContentsArea.java
@@ -266,7 +266,7 @@
 			sel = null;
 		}
 	}
-	
+
 	CustomizationContentsArea() {
 	}
 
@@ -349,7 +349,7 @@
 			}
 			return super.getText(obj);
 		}
-		
+
 		@Override
 		public Image getImage(Object obj) {
 			if (obj instanceof ExtensionData) {
@@ -397,7 +397,7 @@
 		public String getId() {
 			return element.getAttribute("id"); //$NON-NLS-1$
 		}
-		
+
 		public boolean isScalable() {
 			return "true".equals(element.getAttribute(FontSelection.ATT_SCALABLE)); //$NON-NLS-1$
 		}
@@ -405,7 +405,7 @@
 		public IntroTheme(IConfigurationElement element) {
 			this.element = element;
 		}
-		
+
 		public Image getPreviewImage() {
 			if (previewImage==null) {
 				String path = element.getAttribute("previewImage"); //$NON-NLS-1$
@@ -420,7 +420,7 @@
 			}
 			return previewImage;
 		}
-		
+
 		public void dispose() {
 			if (previewImage!=null) {
 				previewImage.dispose();
@@ -552,7 +552,7 @@
 		gd.verticalSpan = 3;
 		gd.widthHint = 10;
 		label.setLayoutData(gd);
-		
+
 		label = new Label(pageContainer, SWT.NULL);
 		label.setText(Messages.WelcomeCustomizationPreferencePage_left);
 		label = new Label(pageContainer, SWT.NULL);
@@ -581,7 +581,7 @@
 		gd = new GridData(GridData.FILL_BOTH);
 		gd.widthHint = 100;
 		bottomLeft.getControl().setLayoutData(gd);
-		
+
 		bottomRight = createTableViewer(pageContainer, "bottom-right"); //$NON-NLS-1$
 		gd = new GridData(GridData.FILL_BOTH);
 		gd.widthHint = 100;
@@ -716,7 +716,7 @@
 	private void enableFontsButton() {
 		if (introTheme != null) {
 			useRelativeFonts.setEnabled(introTheme.isScalable());
-		}	
+		}
 	}
 
 	private void updateThemePreview() {
@@ -739,7 +739,7 @@
 
 	/**
 	 * Remember the current page, close intro, reopen it and show the saved page.
-	 * 
+	 *
 	 */
 	private void restartIntro() {
 		IIntroManager manager = PlatformUI.getWorkbench().getIntroManager();
@@ -943,7 +943,7 @@
 		});
 		item.setControl(container);
 	}
-	
+
 	private void loadThemes() {
 		IConfigurationElement [] elements = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.ui.intro.configExtension"); //$NON-NLS-1$
 		for (int i=0; i<elements.length; i++) {
@@ -1077,7 +1077,7 @@
 
 	private void fillPopupMenu(IMenuManager manager, final TableViewer viewer) {
 		StructuredSelection ssel = (StructuredSelection) viewer.getSelection();
-		
+
 		manager.add(new Separator());
 		Action addSeparator = new Action(Messages.WelcomeCustomizationPreferencePage_addSeparator) {
 			@Override
@@ -1085,7 +1085,7 @@
 				doAddSeparator(viewer);
 			}
 		};
-		
+
 		manager.add(addSeparator);
 		manager.add(new Separator());
 
@@ -1121,9 +1121,9 @@
 			addMoveToAction(menu, bottomLeft, viewer, Messages.WelcomeCustomizationPreferencePage_menu_bottom_left);
 			addMoveToAction(menu, bottomRight, viewer, Messages.WelcomeCustomizationPreferencePage_menu_bottom_right);
 			manager.add(menu);
-			
+
 			boolean addDeleteSeparator=false;
-			
+
 			for (Iterator<?> iter=ssel.iterator(); iter.hasNext();) {
 				Object obj = iter.next();
 				if (obj instanceof SeparatorData)
@@ -1168,7 +1168,7 @@
 			gd.moveDown((BaseData) obj);
 		viewer.refresh();
 	}
-	
+
 	private void doAddSeparator(Viewer viewer) {
 		Object obj = ((StructuredSelection) viewer.getSelection()).getFirstElement();
 		GroupData gd = (GroupData) viewer.getInput();
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationDialog.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationDialog.java
index 7d9f46e..a35b213 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationDialog.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationDialog.java
@@ -23,7 +23,7 @@
 
     private CustomizationContentsArea contentsArea;
 	private String pageId;
-	
+
 	private CustomizationContentsArea getContentsArea() {
 		if (contentsArea == null) {
 			contentsArea = new CustomizationContentsArea();
@@ -35,7 +35,7 @@
 		setShellStyle(getShellStyle() | SWT.RESIZE);
 		this.pageId = pageId;
 	}
-	
+
 	@Override
 	protected Control createDialogArea(Composite parent) {
 		CustomizationContentsArea contents = getContentsArea();
@@ -46,7 +46,7 @@
 		inner.setLayoutData(new GridData(GridData.FILL_BOTH));
 		return outerContainer;
 	}
-	
+
 	@Override
 	protected void okPressed() {
 		if (getContentsArea().performOk()) {
@@ -54,7 +54,7 @@
 		}
 		super.okPressed();
 	}
-	
+
 	@Override
 	protected void cancelPressed() {
 	    getContentsArea().dispose();
@@ -63,9 +63,9 @@
 
     @Override
 	protected void configureShell(Shell newShell) {
-	    super.configureShell(newShell);	
-		newShell.setText(Messages.WelcomeCustomizationPreferencePage_Customize); 
+	    super.configureShell(newShell);
+		newShell.setText(Messages.WelcomeCustomizationPreferencePage_Customize);
 	    newShell.setImage(ImageUtil.createImage("full/elcl16/configure.gif")); //$NON-NLS-1$);
     }
-	
+
 }
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizeAction.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizeAction.java
index fd2c69a..d4242df 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizeAction.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizeAction.java
@@ -19,11 +19,11 @@
 public class CustomizeAction extends Action {
 
 	private IIntroSite site;
-	
+
 	public CustomizeAction(IIntroSite site) {
 		this.site = site;
 	}
-	
+
 	@Override
 	public void run() {
 		String pageId = IntroPlugin.getDefault().getIntroModelRoot().getCurrentPageId();
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/GroupData.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/GroupData.java
index 276bd84..5c76409 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/GroupData.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/GroupData.java
@@ -24,7 +24,7 @@
 	boolean fDefault=false;
 	private String path;
 	private ArrayList<BaseData> children = new ArrayList<>();
-	
+
 	public GroupData(String path, boolean defaultGroup) {
 		fDefault = defaultGroup;
 		this.path = path;
@@ -42,7 +42,7 @@
 				if (child.getNodeName().equals("extension")) { //$NON-NLS-1$
 					loadExtension((Element) child);
 				}
-				else if (child.getNodeName().equals("separator")) {//$NON-NLS-1$" 
+				else if (child.getNodeName().equals("separator")) {//$NON-NLS-1$"
 					loadSeparator((Element)child);
 				}
 			}
@@ -51,11 +51,11 @@
 		if (df!=null && df.equalsIgnoreCase("true")) //$NON-NLS-1$
 			fDefault = true;
 	}
-	
+
 	public boolean isHidden() {
 		return (path.equals(IUniversalIntroConstants.HIDDEN));
 	}
-	
+
 	public boolean isDefault() {
 		return fDefault;
 	}
@@ -73,7 +73,7 @@
 			result.add(element);
 		}
 	}
-	
+
 	public void add(BaseData ed) {
 		children.add(ed);
 		ed.setParent(this);
@@ -86,12 +86,12 @@
 		children.remove(ed);
 		ed.setParent(null);
 	}
-	
+
 	public void addImplicitExtension(String id, String name) {
 		ExtensionData ed = new ExtensionData(id, name, IUniversalIntroConstants.LOW, true);
 		add(ed);
 	}
-	
+
 	private void loadSeparator(Element element) {
 		String id = element.getAttribute("id"); //$NON-NLS-1$
 		SeparatorData sd = new SeparatorData(id);
@@ -105,7 +105,7 @@
 		ExtensionData ed = new ExtensionData(id, name, importance, false);
 		add(ed);
 	}
-	
+
 	public BaseData[] getChildren() {
 		return children.toArray(new BaseData[children.size()]);
 	}
@@ -138,7 +138,7 @@
 	public boolean contains(String id) {
 		return find(id)!=null;
 	}
-	
+
 	BaseData find(String extensionId) {
 		for (int i = 0; i < children.size(); i++) {
 			BaseData data = children.get(i);
@@ -151,7 +151,7 @@
 	public int getIndexOf(BaseData ed) {
 		return children.indexOf(ed);
 	}
-	
+
 	public int getIndexOf(String baseId) {
 		for (int i = 0; i < children.size(); i++) {
 			BaseData bd = children.get(i);
@@ -160,17 +160,17 @@
 		}
 		return -1;
 	}
-	
+
 	public boolean canMoveUp(BaseData ed) {
 		int index = children.indexOf(ed);
 		return (index>0);
 	}
-	
+
 	public boolean canMoveDown(BaseData ed) {
 		int index = children.indexOf(ed);
 		return (index!= -1 && index < children.size()-1);
 	}
-	
+
 	public void moveUp(BaseData ed) {
 		int index = children.indexOf(ed);
 		BaseData swapped = children.get(index-1);
@@ -182,9 +182,9 @@
 		int index = children.indexOf(ed);
 		BaseData swapped = children.get(index+1);
 		children.set(index, swapped);
-		children.set(index+1, ed);		
+		children.set(index+1, ed);
 	}
-	
+
 	public void addSeparator(BaseData after) {
 		SeparatorData sd = new SeparatorData();
 		sd.id = ""+sd.hashCode(); //$NON-NLS-1$
@@ -197,7 +197,7 @@
 		}
 		children.add(sd);
 	}
-	
+
 	public void write(PrintWriter writer, String indent) {
 		writer.print(indent);
 		if (isHidden())
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IUniversalIntroConstants.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IUniversalIntroConstants.java
index b6d7463..961fd4b 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IUniversalIntroConstants.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IUniversalIntroConstants.java
@@ -55,16 +55,16 @@
     String PERF_SET_STANDBY_STATE = PLUGIN_ID + "/perf/setStandbyState"; //$NON-NLS-1$
     // not exposed in .option. Used because framework is convenient.
     String PERF_UI_ZOOM = PLUGIN_ID + "/perf/uiZoom"; //$NON-NLS-1$
-    
+
     // Universal Welcome
-    
+
 	String LOW = "low"; //$NON-NLS-1$
 	String MEDIUM = "medium"; //$NON-NLS-1$
 	String HIGH = "high"; //$NON-NLS-1$
 	String CALLOUT = "callout"; //$NON-NLS-1$
 	String HIDDEN = "hidden"; //$NON-NLS-1$
 	String NEW = "new"; //$NON-NLS-1$
-	
+
 	String STYLE_LOW = "importance-low"; //$NON-NLS-1$
 	String STYLE_MEDIUM = "importance-medium"; //$NON-NLS-1$
 	String STYLE_HIGH = "importance-high"; //$NON-NLS-1$
@@ -85,7 +85,7 @@
 	String ID_MIGRATE = "migrate";//$NON-NLS-1$
 	String ID_WEBRESOURCES = "webresources";//$NON-NLS-1$
 	String ID_WORKBENCH = "workbench"; //$NON-NLS-1$
-	
+
 	// Page DIV ids
 	String DIV_PAGE_LINKS = "page-links"; //$NON-NLS-1$
 	String DIV_ACTION_LINKS = "action-links"; //$NON-NLS-1$
@@ -94,17 +94,17 @@
 	String DIV_LAYOUT_BOTTOM_LEFT = "bottom-left"; //$NON-NLS-1$
 	String DIV_LAYOUT_BOTTOM_RIGHT = "bottom-right"; //$NON-NLS-1$
 
-	// Product intro variables 
+	// Product intro variables
 	String VAR_INTRO_BACKGROUND_IMAGE = "INTRO_BACKGROUND_IMAGE"; //$NON-NLS-1$
 	String VAR_INTRO_ROOT_PAGES = "INTRO_ROOT_PAGES"; //$NON-NLS-1$
 	String VAR_INTRO_DATA = "INTRO_DATA";  //$NON-NLS-1$
 	String VAR_WORKBENCH_AS_ROOT_LINK="workbenchAsRootLink"; //$NON-NLS-1$
 	String VAR_INTRO_DESCRIPTION_PREFIX = "introDescription"; //$NON-NLS-1$
-	
+
 	//Page table properties
 	String P_IMPORTANCE = "importance"; //$NON-NLS-1$
 	String P_NAME = "name"; //$NON-NLS-1$
-	
+
 	//Theme property constants
 	String LAUNCHBAR_OVERVIEW_ICON = "launchbarOverviewIcon"; //$NON-NLS-1$
 	String LAUNCHBAR_FIRSTSTEPS_ICON = "launchbarFirststepsIcon"; //$NON-NLS-1$
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IntroData.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IntroData.java
index 00b42aa..b08914e 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IntroData.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IntroData.java
@@ -39,18 +39,18 @@
 	private String productId;
 	private Map<String, PageData> pages = new HashMap<>();
 	private boolean active;
-	
+
 	public IntroData(String productId, String fileNameOrData, boolean active) {
 		this.productId = productId;
 		this.active = active;
 		if (fileNameOrData!=null)
 			initialize(fileNameOrData);
 	}
-	
+
 	public String getProductId() {
 		return productId;
 	}
-	
+
 	public PageData getPage(String pageId) {
 		return pages.get(pageId);
 	}
@@ -77,7 +77,7 @@
 		PageData pd = new PageData(page);
 		pages.put(pd.getId(), pd);
 	}
-	
+
 	public void addImplicitContent() {
 		IConfigurationElement [] elements = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.ui.intro.configExtension"); //$NON-NLS-1$
 		for (int i=0; i<elements.length; i++) {
@@ -164,7 +164,7 @@
 			buffer.append(spe.getLineNumber());
 			buffer.append(", uri "); //$NON-NLS-1$
 			buffer.append(spe.getSystemId());
-			buffer.append("\n"); //$NON-NLS-1$   
+			buffer.append("\n"); //$NON-NLS-1$
 			buffer.append(spe.getMessage());
 
 			// Use the contained exception.
@@ -188,7 +188,7 @@
 		}
 		return null;
 	}
-	
+
 	public void write(PrintWriter writer) {
 		writer.println("<?xml version=\"1.0\" encoding=\"utf-8\" ?>"); //$NON-NLS-1$
 		writer.println("<extensions>"); //$NON-NLS-1$
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.java
index 41ed0b1..1c5cb6b 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.java
@@ -89,7 +89,7 @@
 	public static String WelcomeCustomizationPreferencePage_menu_top_left;
 	public static String WelcomeCustomizationPreferencePage_menu_top_right;
 	public static String WelcomeCustomizationPreferencePage_menu_bottom_left;
-	public static String WelcomeCustomizationPreferencePage_menu_bottom_right;	
+	public static String WelcomeCustomizationPreferencePage_menu_bottom_right;
 	public static String WelcomeCustomizationPreferencePage_browse;
 	public static String WelcomeCustomizationPreferencePage_browseTitle;
 	public static String SharedIntroConfigurer_customize_label;
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/PageData.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/PageData.java
index a27b628..d0b11ce 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/PageData.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/PageData.java
@@ -30,11 +30,11 @@
 	private String id;
 	private ArrayList<GroupData> groups = new ArrayList<>();
 	private GroupData hidden=null;
-	
+
 	public PageData(String id) {
 		this.id = id;
 	}
-	
+
 	public PageData(Element page) {
 		this.id = page.getAttribute("id"); //$NON-NLS-1$
 		NodeList children = page.getChildNodes();
@@ -51,7 +51,7 @@
 			}
 		}
 	}
-	
+
 	public void add(GroupData gd) {
 		if (gd.isHidden())
 			hidden = gd;
@@ -95,7 +95,7 @@
 	public boolean isHidden(String extensionId) {
 		return hidden!=null && hidden.contains(extensionId);
 	}
-	
+
 	public GroupData findGroup(String groupId) {
 		if (groupId.equals(IUniversalIntroConstants.HIDDEN))
 			return hidden;
@@ -107,14 +107,14 @@
 		}
 		return null;
 	}
-	
+
 	private void addGroup(Element element, boolean hide) {
 		GroupData gd = new GroupData(element);
 		if (hide) hidden = gd;
 		else
 			groups.add(gd);
 	}
-	
+
 	public void addImplicitExtension(String extensionId, String name) {
 		ExtensionData ed = findExtension(extensionId, true);
 		if (ed!=null) {
@@ -148,11 +148,11 @@
 		}
 		return defaultGroup;
 	}
-	
+
 	public String getId() {
 		return id;
 	}
-	
+
 	public ExtensionData findExtension(String extensionId, boolean checkHidden) {
 		for (int i=0; i<groups.size(); i++) {
 			GroupData gdata = groups.get(i);
@@ -165,7 +165,7 @@
 			return find (hidden, extensionId);
 		return null;
 	}
-		
+
 	private ExtensionData find(GroupData gd, String extensionId) {
 		BaseData bd = gd.find(extensionId);
 		if (bd!=null && bd instanceof ExtensionData)
@@ -189,7 +189,7 @@
 		GroupData last = groups.get(groups.size()-1);
 		return id + "/" + last.getPath() + "/" + IUniversalIntroConstants.DEFAULT_ANCHOR;  //$NON-NLS-1$//$NON-NLS-2$
 	}
-	
+
 	public void write(PrintWriter writer, String indent) {
 		writer.print(indent);
 		String indent2 = indent+"   "; //$NON-NLS-1$
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/SeparatorData.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/SeparatorData.java
index 8e4eb27..b92c152 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/SeparatorData.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/SeparatorData.java
@@ -13,10 +13,10 @@
 import java.io.PrintWriter;
 
 public class SeparatorData extends BaseData {
-	
+
 	public SeparatorData() {
 	}
-	
+
 	public SeparatorData(String id) {
 		this.id = id;
 	}
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroConfigurer.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroConfigurer.java
index 52b2f05..e465243 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroConfigurer.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroConfigurer.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *      IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -41,12 +41,12 @@
 /**
  * This class provides for dynamic configuration of the shared intro
  * implementation based on the data file associated with the product.
- * 
+ *
  * @since 3.2
  */
 public class UniversalIntroConfigurer extends IntroConfigurer implements
 		IUniversalIntroConstants {
-	
+
 	private IntroData primaryIntroData;
 	private IntroData[] secondaryIntroData;
 	private SequenceResolver<IntroElement> sequenceResolver;
@@ -99,7 +99,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.ui.intro.config.IntroConfigurer#getMixinStyle(java.lang.String)
 	 */
 	@Override
@@ -216,7 +216,7 @@
 	 * <ul>
 	 * <li>foo &rarr; org.eclipse.ui.intro.universal.solstice/foo
 	 * </ul>
-	 * 
+	 *
 	 * @param path
 	 *            the path
 	 * @return same path with a prefixed theme directory component
@@ -297,7 +297,7 @@
 
 	private IntroElement[] getRootPageActionLinks(boolean standby) {
 		String wb = getVariable(VAR_WORKBENCH_AS_ROOT_LINK);
-		// only create the workbench link if 
+		// only create the workbench link if
 		// not already configured as a root link
 		if (wb==null || !wb.equalsIgnoreCase("true")) { //$NON-NLS-1$
 			IntroElement page = createRootPageLink(ID_WORKBENCH, standby);
@@ -309,9 +309,9 @@
 
 	private IntroElement[] getNavLinks(String pageId) {
 		ArrayList<IntroElement> links = new ArrayList<>();
-		String ids = getVariable(VAR_INTRO_ROOT_PAGES);		
+		String ids = getVariable(VAR_INTRO_ROOT_PAGES);
 		/*
-		 * In high contrast mode the workbench link must be generated in the nav links 
+		 * In high contrast mode the workbench link must be generated in the nav links
 		 * otherwise it will not show
 		 */
 		if (ImageUtil.isHighContrast()) {
@@ -397,7 +397,7 @@
 	private IntroElement createNavLink(String id, String pageId, int [] counter) {
 		if (id.equals(ID_OVERVIEW))
 			return createNavLink(Messages.SharedIntroConfigurer_overview_nav,
-					createPageURL(id, false), id, "left nav_link"+(++counter[0])); //$NON-NLS-1$ 
+					createPageURL(id, false), id, "left nav_link"+(++counter[0])); //$NON-NLS-1$
 		if (id.equals(ID_FIRSTSTEPS))
 			return createNavLink(Messages.SharedIntroConfigurer_firststeps_nav,
 					createPageURL(id, false), id, "left  nav_link"+(++counter[0])); //$NON-NLS-1$
@@ -421,7 +421,7 @@
 			return createNavLink(
 					Messages.SharedIntroConfigurer_workbench_name,
 					"http://org.eclipse.ui.intro/switchToLaunchBar", //$NON-NLS-1$
-					id, 
+					id,
 					"right nav_link"+(++counter[0])); //$NON-NLS-1$
 		return null;
 	}
@@ -436,31 +436,31 @@
 	private IntroElement createLaunchBarShortcut(String id) {
 		if (id.equals(ID_OVERVIEW))
 			return createShortcutLink(
-					getThemeProperty(LAUNCHBAR_OVERVIEW_ICON), Messages.SharedIntroConfigurer_overview_nav, 
+					getThemeProperty(LAUNCHBAR_OVERVIEW_ICON), Messages.SharedIntroConfigurer_overview_nav,
 					id);
 		if (id.equals(ID_FIRSTSTEPS))
 			return createShortcutLink(
-					getThemeProperty(LAUNCHBAR_FIRSTSTEPS_ICON), Messages.SharedIntroConfigurer_firststeps_nav, 
+					getThemeProperty(LAUNCHBAR_FIRSTSTEPS_ICON), Messages.SharedIntroConfigurer_firststeps_nav,
 					id);
 		if (id.equals(ID_TUTORIALS))
 			return createShortcutLink(
-					getThemeProperty(LAUNCHBAR_TUTORIALS_ICON), Messages.SharedIntroConfigurer_tutorials_nav, 
+					getThemeProperty(LAUNCHBAR_TUTORIALS_ICON), Messages.SharedIntroConfigurer_tutorials_nav,
 					id);
 		if (id.equals(ID_SAMPLES))
 			return createShortcutLink(
-					getThemeProperty(LAUNCHBAR_SAMPLES_ICON), Messages.SharedIntroConfigurer_samples_nav, 
+					getThemeProperty(LAUNCHBAR_SAMPLES_ICON), Messages.SharedIntroConfigurer_samples_nav,
 					id);
 		if (id.equals(ID_WHATSNEW))
 			return createShortcutLink(
-					getThemeProperty(LAUNCHBAR_WHATSNEW_ICON), Messages.SharedIntroConfigurer_whatsnew_nav, 
+					getThemeProperty(LAUNCHBAR_WHATSNEW_ICON), Messages.SharedIntroConfigurer_whatsnew_nav,
 					id);
 		if (id.equals(ID_MIGRATE))
 			return createShortcutLink(
-					getThemeProperty(LAUNCHBAR_MIGRATE_ICON), Messages.SharedIntroConfigurer_migrate_nav, 
+					getThemeProperty(LAUNCHBAR_MIGRATE_ICON), Messages.SharedIntroConfigurer_migrate_nav,
 					id);
 		if (id.equals(ID_WEBRESOURCES))
 			return createShortcutLink(
-					getThemeProperty(LAUNCHBAR_WEBRESOURCES_ICON), Messages.SharedIntroConfigurer_webresources_nav, 
+					getThemeProperty(LAUNCHBAR_WEBRESOURCES_ICON), Messages.SharedIntroConfigurer_webresources_nav,
 					id);
 		return null;
 	}
@@ -508,7 +508,7 @@
 			if (value!=null)
 				img.setAttribute("src", value); //$NON-NLS-1$
 			img.setAttribute("alt", label); //$NON-NLS-1$
-			element.addChild(img);		
+			element.addChild(img);
 			styleId += " "+HIGH_CONTRAST; //$NON-NLS-1$
 		}
 		element.setAttribute("style-id", styleId); //$NON-NLS-1$
@@ -594,7 +594,7 @@
 		}
 		return sequenceResolver.getSequence(primaryAnchors, secondaryAnchors);
 	}
-	
+
 	private List<IntroElement> getAnchors(IntroData data, String pageId, String groupId) {
 		PageData pdata = data.getPage(pageId);
 		if (pdata != null) {
@@ -604,7 +604,7 @@
 		}
 		return null;
 	}
-	
+
 	@Override
 	public String resolvePath(String extensionId, String path) {
 		boolean extensionRelativePath = false;
@@ -662,7 +662,7 @@
 		// there was no clear winner; fall back to the default
 		return resolveDefaultPath(pageId, extensionId);
 	}
-	
+
 	private String resolveDefaultPath(String pageId, String extensionId) {
 		String pluginId = ExtensionMap.getInstance().getPluginId(extensionId);
 		if (ContentDetector.isNew(pluginId)) {
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroPlugin.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroPlugin.java
index bfc6a36..357828b 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroPlugin.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroPlugin.java
@@ -29,12 +29,12 @@
     // used for performance logging. Time when the constructor of
     // CustomizableIntroPart is called.
     private long uiCreationStartTime;
-    
+
     // image registry that can be disposed while the
     // plug-in is still active. This is important for
     // switching themes after the plug-in has been loaded.
     private ImageRegistry volatileImageRegistry;
-    
+
     /**
      * The constructor.
      */
@@ -48,7 +48,7 @@
     public static UniversalIntroPlugin getDefault() {
         return inst;
     }
-    
+
     /**
      * Returns the Intro Part.
      */
@@ -96,7 +96,7 @@
         return PlatformUI.getWorkbench().getIntroManager().closeIntro(
             getIntro());
     }
-    
+
     public ImageRegistry getVolatileImageRegistry() {
     	if (volatileImageRegistry==null) {
     		volatileImageRegistry = createImageRegistry();
@@ -104,7 +104,7 @@
     	}
     	return volatileImageRegistry;
     }
-    
+
     public void resetVolatileImageRegistry() {
     	if (volatileImageRegistry!=null) {
     		volatileImageRegistry.dispose();
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/WelcomeCustomizationPreferencePage.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/WelcomeCustomizationPreferencePage.java
index 4fb1621..d4d00bf 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/WelcomeCustomizationPreferencePage.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/WelcomeCustomizationPreferencePage.java
@@ -35,7 +35,7 @@
 	public WelcomeCustomizationPreferencePage(String title, ImageDescriptor image) {
 		super(title, image);
 	}
-	
+
 	private CustomizationContentsArea getContentsArea() {
 		if (contentsArea == null) {
 			contentsArea = new CustomizationContentsArea();
@@ -74,7 +74,7 @@
 	@Override
 	public void init(IWorkbench workbench) {
 	}
-	
+
 	public void setCurrentPage(String pageId) {
 		getContentsArea().setCurrentPage(pageId);
 	}
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/contentdetect/ContentDetectHelper.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/contentdetect/ContentDetectHelper.java
index 7fb469e..026e774 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/contentdetect/ContentDetectHelper.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/contentdetect/ContentDetectHelper.java
@@ -30,7 +30,7 @@
 import org.eclipse.ui.XMLMemento;
 
 public class ContentDetectHelper {
-	
+
 	public static final int NO_STATE = -1;
 	private static final String EXTENSION_COUNT_XML = "extensionCount.xml"; //$NON-NLS-1$
 	private static final String EXTENSION_NAMES_XML = "extensionNames.xml"; //$NON-NLS-1$
@@ -39,7 +39,7 @@
 	private static final String NAME = "name"; //$NON-NLS-1$
 	private static final String ROOT = "root"; //$NON-NLS-1$
 	private static final String PLUGIN_ID = "org.eclipse.ui.intro.universal"; //$NON-NLS-1$
-	
+
 	private File configurationDirectory;
 
 	private File getConfigurationLocation() {
@@ -57,14 +57,14 @@
 		}
 		return configurationDirectory;
 	}
-	
-	public void saveExtensionCount(int count) {	
+
+	public void saveExtensionCount(int count) {
 		XMLMemento writeMemento = XMLMemento.createWriteRoot(ROOT);
 		writeMemento.putInteger(INTROCOUNT, count);
 		saveMemento(writeMemento, EXTENSION_COUNT_XML);
 	}
-	
-	public int getExtensionCount() {	
+
+	public int getExtensionCount() {
 		XMLMemento readMemento = getReadMemento(EXTENSION_COUNT_XML);
 		if (readMemento == null) {
 			return NO_STATE;
@@ -74,7 +74,7 @@
 		if (extensionCount == null) {
 			return NO_STATE;
 		}
-			
+
 		return extensionCount.intValue();
 	}
 
@@ -86,7 +86,7 @@
 		}
 		saveMemento(writeMemento, EXTENSION_NAMES_XML);
 	}
-	
+
 	public Set<String> getContributors() {
 		Set<String> contributors = new HashSet<>();
 		XMLMemento readMemento = getReadMemento(EXTENSION_NAMES_XML);
@@ -99,19 +99,19 @@
 		}
 		return contributors;
 	}
-	
+
 	private XMLMemento getReadMemento(String filename) {
 		XMLMemento memento;
 		InputStreamReader reader = null;
 
 		try {
-			final File stateFile = getStateFile(filename); 
+			final File stateFile = getStateFile(filename);
 
 			FileInputStream input = new FileInputStream(stateFile);
 			reader = new InputStreamReader(input, StandardCharsets.UTF_8);
 			memento = XMLMemento.createReadRoot(reader);
 
-			
+
 		} catch (FileNotFoundException e) {
 			memento = null;
 			// Do nothing, the file will not exist the first time the workbench in used.
@@ -128,10 +128,10 @@
 		}
 		return memento;
 	}
-	
+
 	private void saveMemento(XMLMemento memento, String filename) {
 		// Save the IMemento to a file.
-		File stateFile = getStateFile(filename); 
+		File stateFile = getStateFile(filename);
 		OutputStreamWriter writer = null;
 		try {
 			FileOutputStream stream = new FileOutputStream(stateFile);
@@ -147,7 +147,7 @@
 			}
 		}
 	}
-	
+
 	private File getStateFile(String filename) {
 		if (getConfigurationLocation() == null) {
 			return null;
@@ -155,7 +155,7 @@
 		File stateFile = new File(getConfigurationLocation(), filename);
 		return stateFile;
 	}
-	
+
 	public Set<String> findNewContributors(Set<String> contributors, Set<String> previousContributors) {
 		Set<String> result = new HashSet<>(contributors);
 		for (Iterator<String> iter = previousContributors.iterator(); iter.hasNext();) {
@@ -166,9 +166,9 @@
 
 	public void deleteStateFiles() {
 		try {
-			File stateFile = new File(getConfigurationLocation(), EXTENSION_COUNT_XML);	
+			File stateFile = new File(getConfigurationLocation(), EXTENSION_COUNT_XML);
 			stateFile.delete();
-			stateFile = new File(getConfigurationLocation(), EXTENSION_NAMES_XML);	
+			stateFile = new File(getConfigurationLocation(), EXTENSION_NAMES_XML);
 			stateFile.delete();
 		} catch (RuntimeException e) {
 		}
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/contentdetect/ContentDetector.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/contentdetect/ContentDetector.java
index bd239ca..8820600 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/contentdetect/ContentDetector.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/contentdetect/ContentDetector.java
@@ -22,12 +22,12 @@
 
 	private static Set<String> newContributors;
 	private static boolean detectorCalled = false;
-	
+
 	public ContentDetector() {
 	}
 
 	@Override
-	public boolean isNewContentAvailable() {		
+	public boolean isNewContentAvailable() {
 		try {
 			detectorCalled = true;
 			// If we have previously found new content no need to recompute
@@ -38,7 +38,7 @@
 					.getExtensionRegistry()
 					.getExtensionPoint("org.eclipse.ui.intro.configExtension").getExtensions(); //$NON-NLS-1$
 			int numIntroExtensions = extensions.length;
-      
+
 			ContentDetectHelper helper = new ContentDetectHelper();
 			int previous = helper.getExtensionCount();
 			if (numIntroExtensions != previous) {
@@ -55,13 +55,13 @@
 				}
 				helper.saveContributors(contributors);
 			}
-		} catch (Exception e) { 
+		} catch (Exception e) {
 			return false;
 		}
 		newContributors = new HashSet<>();
 		return false;
 	}
-	
+
 	/**
 	 * @return The set of the ids of config extensions which are new since the last time
 	 * intro was opened. May be null if there are no contributors.
@@ -73,7 +73,7 @@
 	    }
 		return newContributors;
 	}
-	
+
 	/**
 	 * Test to see if this contribution was newly installed
 	 * @param contributionId
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/BundleUtil.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/BundleUtil.java
index 65a6f4c..53b1eee 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/BundleUtil.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/BundleUtil.java
@@ -56,7 +56,7 @@
 
     /**
      * Retrieves the given key from the bundle header.
-     * 
+     *
      * @param bundle
      * @param key
      * @return
@@ -74,7 +74,7 @@
 
     /**
      * Get the resourcelocation, but do not force an $nl$ on it.
-     * 
+     *
      * @param resource
      * @param element
      * @return
@@ -90,7 +90,7 @@
      * Returns the fully qualified location of the passed resource string from
      * the passed plugin id. If the file could not be loaded from the plugin,
      * the resource is returned as is.
-     * 
+     *
      * @param resource
      * @return
      */
@@ -103,7 +103,7 @@
 
     /**
      * Shorthand util method.
-     * 
+     *
      * @param resource
      * @return
      */
@@ -174,7 +174,7 @@
             return resource;
         }
     }
-    
+
     private static String toExternalForm(URL localURL) {
     	try {
     		localURL = FileLocator.toFileURL(localURL);
@@ -215,7 +215,7 @@
     /**
      * Get the absolute path of the given bundle, in the form
      * file:/path_to_plugin
-     * 
+     *
      * @param bundle
      * @return
      */
@@ -243,7 +243,7 @@
     /**
      * Get the absolute path of the bundle with id <code>bundleId</code>. If
      * no such bundle is found, return null.
-     * 
+     *
      * @param bundleId
      * @return
      */
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/ImageUtil.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/ImageUtil.java
index 09e9b22..833b931 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/ImageUtil.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/ImageUtil.java
@@ -68,7 +68,7 @@
 
 	/**
 	 * Convenience method to create an image descriptor from the Intro plugin.
-	 * 
+	 *
 	 * Method assumes that images are under the "icons" directory, so don't
 	 * append that directory name for "imageName".
 	 */
@@ -79,7 +79,7 @@
 
 	/**
 	 * Convenience method to create an image descriptor.
-	 * 
+	 *
 	 */
 	public static ImageDescriptor createImageDescriptor(Bundle bundle,
 			String imageName) {
@@ -100,7 +100,7 @@
 
 	/**
 	 * Convenience method to create an image descriptor.
-	 * 
+	 *
 	 */
 	public static ImageDescriptor createImageDescriptor(IPath base,
 			String imageName) {
@@ -118,7 +118,7 @@
 
 	/**
 	 * Convenience method to create an image from the Intro plugin.
-	 * 
+	 *
 	 * Method assumes that images are under the "icons" directory, so don't
 	 * append that directory name for "imageName".
 	 */
@@ -135,7 +135,7 @@
 
 	/**
 	 * Util method for image re-use in Intro Plugin.
-	 * 
+	 *
 	 * @param key
 	 * @return
 	 */
@@ -157,7 +157,7 @@
 	/**
 	 * Register an image descriptor in the Intro Plugin image registry. Has no
 	 * effect if the key has already been registered.
-	 * 
+	 *
 	 * @param key
 	 * @param imageName
 	 */
@@ -188,11 +188,11 @@
 			return;
 		registry.put(key, createImageDescriptor(base, imageName));
 	}
-	
+
 	/**
 	 * Tests for high contrast mode. Returns false if not called from a
 	 * UI thread (causes deadlocks during junit tests).
-	 * 
+	 *
 	 * @return whether or not the display is in high contrast mode
 	 */
 	public static boolean isHighContrast() {
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/Log.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/Log.java
index e3cd96c..98675b0 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/Log.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/Log.java
@@ -25,7 +25,7 @@
  * mode. Info messages are only logged when the /trace/logInfo debug option is
  * set to true. Performance reports are only logged when /trace/performance is
  * set to true.
- * 
+ *
  */
 public class Log implements IUniversalIntroConstants {
 
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/PreferenceArbiter.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/PreferenceArbiter.java
index 4173d89..07f5dc5 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/PreferenceArbiter.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/PreferenceArbiter.java
@@ -22,7 +22,7 @@
 
 	private Map<Object, int[]> references;
 	private Object leader;
-	
+
 	public void consider(Object obj) {
 		if (obj != null) {
 			if (references == null) {
@@ -44,7 +44,7 @@
 			}
 		}
 	}
-	
+
 	public Object getWinner() {
 		return leader;
 	}
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/intro/universal/ExtensionFactory.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/intro/universal/ExtensionFactory.java
index 631d34c..1bb0231 100644
--- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/intro/universal/ExtensionFactory.java
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/intro/universal/ExtensionFactory.java
@@ -33,7 +33,7 @@
  * </ul>
  * <p>This class should be referenced in extensions but not subclassed
  * or instantiated programmatically.
- * 
+ *
  * @since 3.2
  * @noextend This class is not intended to be subclassed by clients.
  * @noinstantiate This class is not intended to be instantiated by clients.
@@ -52,7 +52,7 @@
 			return configure(new WelcomeCustomizationPreferencePage());
 
 		throw new CoreException(new Status(IStatus.ERROR, UniversalIntroPlugin.PLUGIN_ID, 0,
-				"Unknown id in data argument for " + getClass(), null)); //$NON-NLS-1$        		
+				"Unknown id in data argument for " + getClass(), null)); //$NON-NLS-1$
 	}
 
 	private Object configure(Object obj) throws CoreException {
diff --git a/org.eclipse.ui.intro/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.ui.intro/.settings/org.eclipse.jdt.ui.prefs
index 3034211..7ef1796 100644
--- a/org.eclipse.ui.intro/.settings/org.eclipse.jdt.ui.prefs
+++ b/org.eclipse.ui.intro/.settings/org.eclipse.jdt.ui.prefs
@@ -1,6 +1,63 @@
-#Sat Nov 12 22:58:47 EST 2005
 eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
 formatter_profile=_UA
 formatter_settings_version=9
 internal.default.compliance=user
 org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/FontSelection.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/FontSelection.java
index 8d4326d..6d7a51e 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/FontSelection.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/FontSelection.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,23 +22,23 @@
 import org.osgi.service.prefs.BackingStoreException;
 
 public class FontSelection {
-	
+
 	public static final String VAR_FONT_STYLE = "fontStyle";  //$NON-NLS-1$
 	public static final String FONT_ABSOLUTE = "absolute";  //$NON-NLS-1$
-	public static final String FONT_RELATIVE = "relative";  //$NON-NLS-1$	
+	public static final String FONT_RELATIVE = "relative";  //$NON-NLS-1$
 	private static final String SCALE_FACTOR = "scaleFactor"; //$NON-NLS-1$
 	public static final String ATT_SCALABLE = "scalable"; //$NON-NLS-1$
-	
-	private static final int MIN_HEIGHT = 10;	
+
+	private static final int MIN_HEIGHT = 10;
 	private static final int MAX_HEIGHT = 16;
-	
+
 	/*
 	 * Returns the height in points of the default SWT font
 	 */
 	private static int getDefaultFontHeight() {
        Font defaultFont = JFaceResources.getDefaultFont();
        FontData[] fontData = defaultFont.getFontData();
-       int height = MIN_HEIGHT;	
+       int height = MIN_HEIGHT;
 		for (int i=0; i< fontData.length; i++) {
 			FontData data = fontData[i];
 			height = Math.max(height, data.getHeight());
@@ -58,7 +58,7 @@
 		result += getFontSizeDeclaration("h6", defaultFontHeight, 70, scale); //$NON-NLS-1$
 		return result;
 	}
-	
+
 	public static final int getScalePercentage() {
 		int scale = Platform.getPreferencesService().getInt(IntroPlugin.PLUGIN_ID,  (SCALE_FACTOR), 0, null);
 		return scale;
@@ -72,13 +72,13 @@
 
 	public static void setScalePercentage(int i) {
 		IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(IntroPlugin.PLUGIN_ID);
-		prefs.putInt(SCALE_FACTOR, i); 
+		prefs.putInt(SCALE_FACTOR, i);
 		try {
 			prefs.flush();
 		} catch (BackingStoreException e) {
-		}	
+		}
 	}
-	
+
 	// Set the scale factor to it's default
 	public static void resetScalePercentage() {
 		IEclipsePreferences iprefs = InstanceScope.INSTANCE.getNode(IntroPlugin.PLUGIN_ID);
@@ -97,7 +97,7 @@
 	    		return style;
 	    	}
 	    	style = Platform.getPreferencesService().getString
-	    	    (IntroPlugin.PLUGIN_ID,  (FontSelection.VAR_FONT_STYLE), "", null); //$NON-NLS-1$ 
+	    	    (IntroPlugin.PLUGIN_ID,  (FontSelection.VAR_FONT_STYLE), "", null); //$NON-NLS-1$
 	    	if (style.length() > 0) {
 	    		return style;
 	    	}
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/IntroPlugin.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/IntroPlugin.java
index e4970bc..df39994 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/IntroPlugin.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/IntroPlugin.java
@@ -30,11 +30,11 @@
 	public static final String PLUGIN_ID = "org.eclipse.ui.intro"; //$NON-NLS-1$
 
 	// Debug control variables
-	public static boolean LOG_WARN = 
+	public static boolean LOG_WARN =
 		"true".equalsIgnoreCase(Platform.getDebugOption(PLUGIN_ID+"/debug/warn")); //$NON-NLS-1$ //$NON-NLS-2$
-	public static boolean LOG_INFO = 
+	public static boolean LOG_INFO =
 		"true".equalsIgnoreCase(Platform.getDebugOption(PLUGIN_ID+"/debug/info")); //$NON-NLS-1$ //$NON-NLS-2$
-	
+
     // The static shared instance.
     private static IntroPlugin inst;
 
@@ -45,12 +45,12 @@
     // used for performance logging. Time when the constructor of
     // CustomizableIntroPart is called.
     private long uiCreationStartTime;
-    
+
     // image registry that can be disposed while the
     // plug-in is still active. This is important for
     // switching themes after the plug-in has been loaded.
     private ImageRegistry volatileImageRegistry;
-    
+
     // debug options
 	public static boolean DEBUG = false;
 	public static boolean DEBUG_NO_BROWSER = false;
@@ -69,7 +69,7 @@
     public static IntroPlugin getDefault() {
         return inst;
     }
-    
+
     public ImageRegistry getVolatileImageRegistry() {
     	if (volatileImageRegistry==null) {
     		volatileImageRegistry = createImageRegistry();
@@ -77,7 +77,7 @@
     	}
     	return volatileImageRegistry;
     }
-    
+
     public void resetVolatileImageRegistry() {
     	if (volatileImageRegistry!=null) {
     		volatileImageRegistry.dispose();
@@ -108,7 +108,7 @@
 
     /**
      * Returns the model root. Will always guarantee that model is loaded.
-     * 
+     *
      * @return Returns the introModelRoot.
      */
     public IntroModelRoot getIntroModelRoot() {
@@ -201,8 +201,8 @@
 	 */
 	public static synchronized void logError(String message) {
 		logError(message,null);
-	}		
-	
+	}
+
 	/**
 	 * Logs an Error message with an exception.  To print errors to console,
 	 * run eclipse with the -console -consolelog arguments
@@ -213,13 +213,13 @@
 		}
 		Status errorStatus = new Status(IStatus.ERROR, PLUGIN_ID, message, ex);
 		IntroPlugin.getDefault().getLog().log(errorStatus);
-	}	
-	
-	
+	}
+
+
 	/**
 	 * Logs a Warning message with an exception.  To print warnings to console,
 	 * run eclipse with the -console -consolelog arguments
-	 * 
+	 *
 	 * Only logs if the following conditions are true:
 	 * 	-debug switch is enabled at the command line
 	 *  .options file is placed at the eclipse work directory with the contents:
@@ -229,7 +229,7 @@
 	public static synchronized void logWarning(String message) {
 		logWarning(message,null);
 	}
-	
+
 
 	public static synchronized void logWarning(String message,Throwable ex) {
 		if (IntroPlugin.getDefault().isDebugging() && LOG_WARN) {
@@ -240,11 +240,11 @@
 			getDefault().getLog().log(warningStatus);
 		}
 	}
-	
+
 	/**
 	 * Logs a debug message.  To print messages to console,
 	 * run eclipse with the -console -consolelog arguments
-	 * 
+	 *
 	 * Only logs if the following conditions are true:
 	 * 	-debug switch is enabled at the command line
 	 *  .options file is placed at the eclipse work directory with the contents:
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/Messages.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/Messages.java
index 3b07660..50005e1 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/Messages.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/Messages.java
@@ -55,7 +55,7 @@
     // -------
     public static String IntroPart_openExternal_tooltip;
     public static String IntroPart_showContentButton_tooltip;
-	
+
     //Always Welcome Checkbox
 	public static String AlwaysWelcomeCheckbox_Text;
 
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/FormattedHTMLElement.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/FormattedHTMLElement.java
index 316d789..065e095 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/FormattedHTMLElement.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/FormattedHTMLElement.java
@@ -54,7 +54,7 @@
 	}
 	/**
 	 * Set whether the end tag is required for this element
-	 * 
+	 *
 	 * @param required
 	 *            true if end tag required, false otherwise
 	 */
@@ -63,7 +63,7 @@
 	}
 	/**
 	 * Set the indent level that should be applied to this element when printed
-	 * 
+	 *
 	 * @param indentLevel
 	 *            The indentLevel to set.
 	 */
@@ -73,7 +73,7 @@
 	/**
 	 * Set whether or not this element should be printed over multiple lines,
 	 * or on a single line
-	 * 
+	 *
 	 * @param spanMultipleLines
 	 *            true if the element should be printed over multiple lines,
 	 *            false if it should be printed on a single line
@@ -83,7 +83,7 @@
 	}
 	/**
 	 * Create a string of tabs to insert before the element is printed
-	 * 
+	 *
 	 * @param indentLevel
 	 *            the number of tabs to insert
 	 * @return
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/HTMLElement.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/HTMLElement.java
index aac3a49..d2babce 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/HTMLElement.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/HTMLElement.java
@@ -45,7 +45,7 @@
 
 	/**
 	 * Add an attribute with the given name and value to this HTMLElement
-	 * 
+	 *
 	 * @param attributeName
 	 * @param attributeValue
 	 */
@@ -64,7 +64,7 @@
 
 	/**
 	 * Get the attributes associated with this element
-	 * 
+	 *
 	 * @return Returns the elementAttributes.
 	 */
 	public Map<String, String> getElementAttributes() {
@@ -76,7 +76,7 @@
 
 	/**
 	 * Set the attributes associated with this element
-	 * 
+	 *
 	 * @param elementAttributes
 	 *            The elementAttributes to set.
 	 */
@@ -86,7 +86,7 @@
 
 	/**
 	 * Get this element's content
-	 * 
+	 *
 	 * @return Returns the elementContent.
 	 */
 	public Vector<Object> getElementContent() {
@@ -98,7 +98,7 @@
 
 	/**
 	 * Set this element's content
-	 * 
+	 *
 	 * @param elementContent
 	 *            The elementContent to set.
 	 */
@@ -108,7 +108,7 @@
 
 	/**
 	 * Get the name of this element
-	 * 
+	 *
 	 * @return Returns the elementName.
 	 */
 	public String getElementName() {
@@ -117,7 +117,7 @@
 
 	/**
 	 * Set the name of this element
-	 * 
+	 *
 	 * @param elementName
 	 *            The elementName to set.
 	 */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/HTMLUtil.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/HTMLUtil.java
index 699a619..37b495f 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/HTMLUtil.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/HTMLUtil.java
@@ -21,7 +21,7 @@
     /**
      * Creates an HTML opening element of the form <elementName
      * elementAttributes>
-     * 
+     *
      * @param elementName
      *            the name of the element to create
      * @param elementAttributes
@@ -50,7 +50,7 @@
 
     /**
      * Creates an HTML start tag of the form <elementName>
-     * 
+     *
      * @param elementName
      *            the name of the element to create
      * @param insertLineBreak
@@ -65,7 +65,7 @@
     /**
      * Creates an HTML start tag of the form <elementName>and inserts a line
      * break after the start tag
-     * 
+     *
      * @param elementName
      *            the name of the element to create
      * @return
@@ -76,7 +76,7 @@
 
     /**
      * Creates an HTML closing element of the form </elementName>
-     * 
+     *
      * @param elementName
      *            the name of the closing element to create
      * @param addNewLine
@@ -97,7 +97,7 @@
      * Given a map of attribute names and values, this method will create a
      * StringBuffer of the attributes in the form: attrName="attrValue". These
      * attributes can appear in the start tag of an HTML element.
-     * 
+     *
      * @param attributes
      *            the attributes to be converted into a String list
      * @return
@@ -123,7 +123,7 @@
 
     /**
      * Creates an HTML attribute of the form attrName="attrValue"
-     * 
+     *
      * @param attrName
      *            the name of the attribute
      * @param attrValue
@@ -159,7 +159,7 @@
 
     /**
      * Determine if the contents of two character arrays are equal
-     * 
+     *
      * @param a
      * @param b
      * @return
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/IntroHTMLGenerator.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/IntroHTMLGenerator.java
index e9b53ee..c5489cd 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/IntroHTMLGenerator.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/html/IntroHTMLGenerator.java
@@ -57,7 +57,7 @@
 	/**
 	 * Generates the HTML code that will be presented in the browser widget for the provided intro
 	 * page.
-	 * 
+	 *
 	 * @param page
 	 *            the page to generate HTML for
 	 * @param presentation
@@ -70,13 +70,13 @@
 		this.providerSite = providerSite;
 
 		initializeBackgroundSizeWorks();
-		
+
 		// generate and add the appropriate encoding to the top of the document
 		// generateEncoding();
 		// create the main HTML element, and all of its contents.
 		return generateHTMLElement();
 	}
-	
+
 	private void initializeBackgroundSizeWorks() {
 		// Internet Explorer <= 9 doesn't properly handle background-size
 		backgroundSizeWorks = true;
@@ -100,7 +100,7 @@
 
 	/**
 	 * Return the SWT Browser instance being used to render the intro.
-	 * 
+	 *
 	 * @return the browser or {@code null} if the browser could not be determined
 	 */
 	private Browser getBrowser() {
@@ -119,9 +119,9 @@
 
 	/**
 	 * Generates the HTML element and its content:
-	 * 
+	 *
 	 * <pre>
-	 *   
+	 *
 	 *                        &lt;HTML&gt;
 	 *                        &lt;HEAD&gt;
 	 *                        head content
@@ -130,9 +130,9 @@
 	 *                        body content
 	 *                        &lt;/BODY&gt;
 	 *                        &lt;/HTML&gt;
-	 *    
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @return the html HTMLElement
 	 */
 	private HTMLElement generateHTMLElement() {
@@ -148,10 +148,10 @@
 
 	/**
 	 * Generates the HEAD element and its content:
-	 * 
+	 *
 	 * <pre>
-	 *   
-	 *                
+	 *
+	 *
 	 *                        &lt;HEAD&gt;
 	 *                        &lt;BASE href=&quot;base_plugin_location&gt;
 	 *                        &lt;style type=&quot;text/css&quot;&gt;HTML, IMG { border: 0px; } &lt;/style&gt;
@@ -159,9 +159,9 @@
 	 *                        &lt;LINK href=&quot;style sheet&quot;&gt;
 	 *                        additional head content, if specified
 	 *                        &lt;/HEAD&gt;
-	 *    
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param indentLevel
 	 *            the number of indents to insert before the element when it is printed
 	 * @return the head HTMLElement
@@ -228,7 +228,7 @@
 
 	/**
 	 * Add any browser-specific rendering quirks
-	 * 
+	 *
 	 * @param indentLevel
 	 */
 	private void addBrowserRenderingDirectives(HTMLElement head, int indentLevel) {
@@ -272,18 +272,18 @@
 
 	/**
 	 * Generates the BODY element and its content:
-	 * 
+	 *
 	 * <pre>
-	 *   
-	 *               
+	 *
+	 *
 	 *                        &lt;BODY&gt;
 	 *                        &lt;DIV id=&quot;pageId&quot; class=&quot;pageClass&quot;&gt;
 	 *                        page content
 	 *                        &lt;/DIV&gt;
 	 *                        &lt;/BODY&gt;
-	 *    
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param indentLevel
 	 *            the number of indents to insert before the element when it is printed
 	 * @return the body HTMLElement
@@ -317,7 +317,7 @@
 
 	/**
 	 * Given an IntroElement, generate the appropriate HTMLElement
-	 * 
+	 *
 	 * @param element
 	 *            the IntroElement
 	 * @param indentLevel
@@ -343,7 +343,7 @@
 		case AbstractIntroElement.IMAGE:
 			return generateIntroImage((IntroImage) element, indentLevel);
 		case AbstractIntroElement.HR:
-			return generateIntroSeparator((IntroSeparator) element, indentLevel);			
+			return generateIntroSeparator((IntroSeparator) element, indentLevel);
 		case AbstractIntroElement.TEXT:
 			return generateIntroText((IntroText) element, indentLevel);
 		case AbstractIntroElement.PAGE_TITLE:
@@ -357,17 +357,17 @@
 
 	/**
 	 * Create a div element and its content from an IntroDiv:
-	 * 
+	 *
 	 * <pre>
-	 *   
-	 *                    
+	 *
+	 *
 	 *                        &lt;div id=&quot;attrvalue&quot;&gt;
 	 *                        &lt;h4&gt;&lt;span class=&quot;div-label&quot;&gt;attrvalue&lt;/span&gt;&lt;h4&gt;
 	 *                        any defined divs, links, html, images, text, includes
 	 *                        &lt;/div&gt;
-	 *    
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param element
 	 *            the IntroDiv
 	 * @param indentLevel
@@ -400,11 +400,11 @@
 				StringBuffer call = new StringBuffer();
 				call.append("return (toggleSection('");//$NON-NLS-1$
 				call.append(clientId);
-				call.append("','");//$NON-NLS-1$ 
+				call.append("','");//$NON-NLS-1$
 				call.append(toggleClosedId);
-				call.append("','");//$NON-NLS-1$ 
+				call.append("','");//$NON-NLS-1$
 				call.append(toggleOpenId);
-				call.append("'))"); //$NON-NLS-1$ 
+				call.append("'))"); //$NON-NLS-1$
 				link.addAttribute("onClick", call.toString()); //$NON-NLS-1$
 				link.addContent(divLabel);
 				divElement.addContent(link);
@@ -427,7 +427,7 @@
 								IIntroConstants.PLUGIN_ID));
 				toggleImageOpen.addAttribute(IIntroHTMLConstants.ATTRIBUTE_CLASS, "section-toggle-image-open"); //$NON-NLS-1$
 				if (element.isExpanded())
-					toggleImageOpen.addAttribute(IIntroHTMLConstants.ATTRIBUTE_STYLE, "display: inline"); //$NON-NLS-1$				
+					toggleImageOpen.addAttribute(IIntroHTMLConstants.ATTRIBUTE_STYLE, "display: inline"); //$NON-NLS-1$
 				link.addContent(toggleImageOpen);
 				childContainer = generateDivElement(clientId, indentLevel + 1);
 				childContainer.addAttribute("class", "section-body"); //$NON-NLS-1$//$NON-NLS-2$
@@ -481,17 +481,17 @@
 
 	/**
 	 * Generates an anchor (link) element and its content from an IntroLink:
-	 * 
+	 *
 	 * <pre>
-	 *   
+	 *
 	 *                        &lt;A id=linkId class=&quot;link&quot; href=linkHref&gt;
 	 *                        &lt;IMG src=&quot;blank.gif&quot;&gt;
 	 *                        &lt;SPAN class=&quot;link-label&quot;&gt;linkLabel &lt;/SPAN&gt;
 	 *                        &lt;P&gt;&lt;SPAN&gt;text&lt;/SPAN&gt;&lt;/P&gt;
 	 *                        &lt;/A&gt;
-	 *    
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param element
 	 *            the IntroLink
 	 * @param indentLevel
@@ -525,7 +525,7 @@
 		}
 		if (!useTable) {
 			HTMLElement imageDiv = new FormattedHTMLElement(IIntroHTMLConstants.ELEMENT_DIV, indentBase+1, false);
-			imageDiv.addAttribute(IIntroHTMLConstants.ATTRIBUTE_CLASS, 
+			imageDiv.addAttribute(IIntroHTMLConstants.ATTRIBUTE_CLASS,
 					IIntroHTMLConstants.LINK_EXTRA_DIV);
 			anchor1.addContent(imageDiv);
 		}
@@ -533,7 +533,7 @@
 		if (element.getLabel() != null) {
 			HTMLElement label = generateSpanElement(IIntroHTMLConstants.SPAN_CLASS_LINK_LABEL,
 					indentBase + 2);
-			label.addContent(element.getLabel());			
+			label.addContent(element.getLabel());
 			labelAnchor.addContent(label);
 		}
 		IntroText linkText = element.getIntroText();
@@ -562,7 +562,7 @@
 	 * content from the referenced file is emitted as-is into a div element. If the type is "embed",
 	 * an OBJECT html element is created whose <code>data</code> attribute is equal to the
 	 * IntroHTML's <code>src</code> value
-	 * 
+	 *
 	 * @param element
 	 *            the IntroHTML
 	 * @param indentLevel
@@ -578,13 +578,13 @@
 
 	/**
 	 * Generate an image element from an IntroImage:
-	 * 
+	 *
 	 * <pre>
-	 *   
+	 *
 	 *                        &lt;IMG src=imageSrc id=imageId&gt;
-	 *    
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param element
 	 *            the IntroImage
 	 * @param indentLevel
@@ -598,7 +598,7 @@
 			imageElement.addAttribute(IIntroHTMLConstants.ATTRIBUTE_ID, element.getId());
 		return imageElement;
 	}
-	
+
 	private HTMLElement generateIntroSeparator(IntroSeparator element, int indentLevel) {
 		HTMLElement hrElement = new FormattedHTMLElement(IIntroHTMLConstants.ELEMENT_HR, indentLevel, false);
 		if (element.getId() != null)
@@ -612,14 +612,14 @@
 	 * Generate a paragraph (&lt;P&gt;) element from an IntroText. The paragraph element will
 	 * contain a span element that will contain the actual text. Providing the span element provides
 	 * additional flexibility for CSS designers.
-	 * 
+	 *
 	 * <pre>
-	 *              
-	 *               
+	 *
+	 *
 	 *                        &lt;P&gt;&lt;SPAN&gt;spanContent&lt;/SPAN&gt;&lt;/P&gt;
-	 *                 
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param element
 	 *            the IntroText
 	 * @param indentLevel
@@ -659,16 +659,16 @@
 	/**
 	 * Generate "inline" content from an IntroHTML. The content from the file referenced by the
 	 * IntroHTML's <code>src</code> attribute is emitted as-is into a div element:
-	 * 
+	 *
 	 * <pre>
-	 *               
-	 *                    
+	 *
+	 *
 	 *                        &lt;div id=&quot;attrvalue&quot; class=&quot;attrvalue2&quot;&gt;
 	 *                        content from file specified in src attribute
 	 *                        &lt;/div&gt;
-	 *                
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param element
 	 *            the IntroHTML
 	 * @param indentLevel
@@ -694,7 +694,7 @@
 
 	/**
 	 * Includes HTML content that is created by an IIntroContentProvider implementation.
-	 * 
+	 *
 	 * @param element
 	 * @param indentLevel
 	 * @return
@@ -739,15 +739,15 @@
 	/**
 	 * Generate "embedded" content from an IntroHTML. An OBJECT html element is created whose
 	 * <code>data</code> attribute is equal to the IntroHTML's <code>src</code> value.
-	 * 
+	 *
 	 * <pre>
-	 *                
+	 *
 	 *                        &lt;OBJECT type=&quot;text/html&quot; data=&quot;attrvalue&quot;&gt;
 	 *                        alternative text in case the object can not be rendered
-	 *                        &lt;/OBJECT&gt; 
-	 *     
+	 *                        &lt;/OBJECT&gt;
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param element
 	 *            the IntroHTML
 	 * @param indentLevel
@@ -786,13 +786,13 @@
 	/**
 	 * Generates the BASE element for the head of the html document. Each document can have only one
 	 * base element
-	 * 
+	 *
 	 * <pre>
-	 *   
-	 *                
+	 *
+	 *
 	 *                      	&lt;BASE href=baseURL&gt;
 	 * </pre>
-	 * 
+	 *
 	 * @param indentLevel
 	 * @param baseURL
 	 * @return
@@ -807,13 +807,13 @@
 
 	/**
 	 * Generates the style element that goes into HEAD:
-	 * 
+	 *
 	 * <pre>
-	 *                
+	 *
 	 *                        &lt;style type=&quot;text/css&quot;&gt;HTML, IMG { border: 0px; } &lt;/style&gt;
-	 *                   
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param indentLevel
 	 *            the number of indents to insert before the element when it is printed
 	 * @return the style HTMLElement
@@ -823,9 +823,9 @@
 		style.addAttribute(IIntroHTMLConstants.ATTRIBUTE_TYPE, IIntroHTMLConstants.LINK_STYLE);
 		style.addContent(IIntroHTMLConstants.STYLE_HTML);
 		IntroTheme theme = introPage.getModelRoot().getTheme();
-		if (theme != null && theme.isScalable() 
+		if (theme != null && theme.isScalable()
 				&& FontSelection.FONT_RELATIVE.equals(FontSelection.getFontStyle())) {
-		    String sizeStyle = FontSelection.generatePageFontStyle(); 
+		    String sizeStyle = FontSelection.generatePageFontStyle();
             style.addContent(sizeStyle);
 		}
 		return style;
@@ -833,13 +833,13 @@
 
 	/**
 	 * Generates the title element and its content:
-	 * 
+	 *
 	 * <pre>
-	 *   
+	 *
 	 *                        &lt;TITLE&gt;intro title&lt;/TITLE&gt;
-	 *                     
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param title
 	 *            the title of this intro page
 	 * @param indentLevel
@@ -856,13 +856,13 @@
 
 	/**
 	 * Generates a link element that refers to a cascading style sheet (CSS):
-	 * 
+	 *
 	 * <pre>
-	 *                
-	 *                    
+	 *
+	 *
 	 *                        &lt;LINK rel=&quot;stylesheet&quot; style=&quot;text/css&quot; href=&quot;style sheet&quot;&gt;
 	 * </pre>
-	 * 
+	 *
 	 * @param href
 	 *            the value of the href attribute for this link element
 	 * @param indentLevel
@@ -881,13 +881,13 @@
 
 	/**
 	 * Generate an anchor element:
-	 * 
+	 *
 	 * <pre>
-	 *   
+	 *
 	 *                        &lt;A id=linkId class=linkClass href=linkHref&gt; &lt;/A&gt;
-	 *                     
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param link
 	 *            the IntroLink element that contains the value for the id and href attributes
 	 * @param indentLevel
@@ -909,16 +909,16 @@
 
 	/**
 	 * Generates a div block that contains a header and span element:
-	 * 
+	 *
 	 * <pre>
-	 *   
-	 *                      
+	 *
+	 *
 	 *                        &lt;DIV id=divId&gt;
 	 *                        &lt;H&gt;&lt;SPAN&gt;spanContent &lt;/SPAN&gt; &lt;/H&gt;
 	 *                        &lt;/DIV&gt;
-	 *                     
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param divId
 	 *            the id of the div to create
 	 * @param divClass
@@ -945,13 +945,13 @@
 	 * Generates a span element inside a text element, where the text element can be a P
 	 * (paragraph), or any of the H (Header) elements. Providing the span element provides
 	 * additional flexibility for CSS designers.
-	 * 
+	 *
 	 * <pre>
-	 *                
+	 *
 	 *                        &lt;P&gt;&lt;SPAN&gt;spanContent&lt;/SPAN&gt;&lt;/P&gt;
-	 *                    
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param type
 	 *            the type of text element to create (e.g., P, H1, H2, etc)
 	 * @param spanID
@@ -986,7 +986,7 @@
 
 	/**
 	 * Generates a DIV element with the provided indent, id, and class.
-	 * 
+	 *
 	 * @param divId
 	 *            value for the div's id attribute
 	 * @param divClass
@@ -1003,7 +1003,7 @@
 
 	/**
 	 * Generates a DIV element with the provided indent and id.
-	 * 
+	 *
 	 * @param divId
 	 *            value for the div's id attribute
 	 * @param indentLevel
@@ -1019,14 +1019,14 @@
 
 	/**
 	 * Generates an IMG element:
-	 * 
+	 *
 	 * <pre>
-	 *   
-	 *                      
+	 *
+	 *
 	 *                        &lt;IMG src=imageSrc alt=altText&gt;
-	 *                     
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param imageSrc
 	 *            the value to be supplied to the src attribute
 	 * @param indentLevel
@@ -1068,14 +1068,14 @@
 
 	/**
 	 * Generate a span element
-	 * 
+	 *
 	 * <pre>
-	 *   
+	 *
 	 *                        &lt;SPAN class=spanClass&gt; &lt;/SPAN&gt;
-	 *      
-	 *    
+	 *
+	 *
 	 * </pre>
-	 * 
+	 *
 	 * @param spanClass
 	 *            the value to be supplied to the class attribute
 	 * @param indentLevel
@@ -1090,12 +1090,12 @@
 
 	/**
 	 * Generate a span element
-	 * 
+	 *
 	 * <pre>
-	 *   
+	 *
 	 *                     &lt;iframe src=&quot;localPage1.xhtml&quot; frameborder=&quot;1&quot; scrolling=&quot;auto&quot; longdesc=&quot;localPage1.xhtml&quot;&gt;
 	 * </pre>
-	 * 
+	 *
 	 * @param spanClass
 	 *            the value to be supplied to the class attribute
 	 * @param indentLevel
@@ -1129,7 +1129,7 @@
 	 * content in the form of a StringBuffer. If the file read contains substitution segments of the
 	 * form $plugin:plugin_id$ then this method will make the proper substitution (the segment will
 	 * be replaced with the absolute path to the plugin with id plugin_id).
-	 * 
+	 *
 	 * @param src -
 	 *            the file that contains the target conent
 	 * @param charsetName -
@@ -1198,7 +1198,7 @@
 	 * substitution string is of the form: <code>$plugin:plugin_id$</code> where plugin_id is the
 	 * valid id of an installed plugin. The substitution string will be replaced with the absolute
 	 * path to the plugin.
-	 * 
+	 *
 	 * An example usage of the string substution: The html file <code>inline.html</code> is
 	 * included in your intro via the html inline mechanism . This file needs to reference a
 	 * resource that is located in another plugin. The following might be found in inline.html:
@@ -1208,7 +1208,7 @@
 	 * is read in, the relevant section will be replaced as follows: <code>
 	 *   <a href="file:/install_path/plugins/test.plugin/html/test.html">link to file</a>
 	 * </code>
-	 * 
+	 *
 	 */
 	private static class PluginIdParser {
 
@@ -1244,7 +1244,7 @@
 		 * above conditions are not met, no substitution occurs. If the above conditions are met,
 		 * the content between (and including) the opening and closing "$" characters will be
 		 * replaced by the absolute path to the plugin
-		 * 
+		 *
 		 * @return
 		 */
 		protected String parsePluginId() {
@@ -1288,10 +1288,10 @@
 		 * expected characters are found, they will be appended to the tokenContent StringBuffer and
 		 * the method will return true. If they are not found, false is returned and the caller
 		 * should reset the BufferedReader to the position it was in before this method was called.
-		 * 
+		 *
 		 * Resetting the reader ensures that the characters read in this method can be re-examined
 		 * in case one of them happens to be the beginning of a valid substitution segment.
-		 * 
+		 *
 		 * @return true if the next characters match <code>plugin:</code>, and false otherwise.
 		 */
 		private boolean findValidPluginSegment() {
@@ -1320,10 +1320,10 @@
 		 * SUBSTITUTION_END character is found, the method looks up the plugin id that has been
 		 * built up to see if it is a valid id. If so, return the absolute path to that plugin. If
 		 * not, return null.
-		 * 
+		 *
 		 * This method assumes that the reader is positioned just after a valid <code>plugin:</code>
 		 * segment in a substitution string.
-		 * 
+		 *
 		 * @return absolute path of the plugin id, if valid. null otherwise
 		 */
 		private String getPluginPath() {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractBaseIntroElement.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractBaseIntroElement.java
index b04b284..53691f9 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractBaseIntroElement.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractBaseIntroElement.java
@@ -51,7 +51,7 @@
 
     /**
      * Filter this element out based on the presentation kind.
-     * 
+     *
      */
     private boolean checkFilterState() {
         if (this.isOfType(AbstractIntroElement.MODEL_ROOT))
@@ -69,7 +69,7 @@
     public String getStyleId() {
         return style_id;
     }
-    
+
     @Override
 	protected void loadFromParent() {
         style_id = getAttribute(getElement(), ATT_STYLE_ID);
@@ -88,7 +88,7 @@
      * this element has been added to the model, and it has a parent. Also, this
      * method will not be valid if the UI has not been loaded yet because it it
      * the creation of the UI that determines the presentation details.
-     * 
+     *
      * @return Returns the isFiltered.
      */
     public boolean isFiltered() {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroContainer.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroContainer.java
index 0b1765d..7924e8c 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroContainer.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroContainer.java
@@ -70,7 +70,7 @@
     /**
      * Get the children of this container. Loading children and resolving
      * includes and extension is delayed until this method call.
-     * 
+     *
      * @return Returns all the children of this container.
      */
     public AbstractIntroElement[] getChildren() {
@@ -86,7 +86,7 @@
             resolveChildren();
 
         Vector filtered = filterChildren(children);
-        
+
         AbstractIntroElement[] childrenElements = (AbstractIntroElement[]) convertToModelArray(
         	filtered, AbstractIntroElement.ELEMENT);
         return childrenElements;
@@ -99,7 +99,7 @@
      * <p>
      * <code>
      * 		int elementMask = IntroElement.IMAGE | IntroElement.DEFAULT_LINK;
-     * 		int elementMask = IntroElement.ABSTRACT_CONTAINER; 
+     * 		int elementMask = IntroElement.ABSTRACT_CONTAINER;
      * </code>
      * The return type is determined depending on the mask. If the mask is a
      * predefined constant in the IntroElement, and it does not correspond to an
@@ -111,7 +111,7 @@
      * <code>
      * 		Introgroup[] groups  = (IntroGroup[])page.getChildrenOfType(IntroElement.GROUP);
      * </code>
-     * 
+     *
      * However, if the element mask is not homogenous (for example: LINKS |
      * GROUP) then the returned array must be cast to an array of
      * IntroElements.For exmaple, the following code gets all images and links
@@ -120,10 +120,10 @@
      * <p>
      * <code>
      * 		int elementMask = IntroElement.IMAGE | IntroElement.DEFAULT_LINK;
-     * 		IntroElement[] imagesAndLinks  = 
+     * 		IntroElement[] imagesAndLinks  =
      * 			(IntroElement[])page.getChildrenOfType(elementMask);
      * </code>
-     * 
+     *
      * @return An array of elements of the right type. If the container has no
      *         children, or no children of the specified types, returns an empty
      *         array.
@@ -149,7 +149,7 @@
      * IntroElement instances. If elementMask is a predefined model type (ie:
      * homogenous), then return array of corresponding type. Else, returns an
      * array of IntroElements.
-     * 
+     *
      * @param vector
      */
     private Object[] convertToModelArray(Vector vector, int elementMask) {
@@ -205,7 +205,7 @@
             src = new AbstractIntroElement[size];
             break;
         }
-        
+
         vector.copyInto(src);
         return src;
 
@@ -219,7 +219,7 @@
     protected void loadChildren() {
         // init the children vector. old children are disposed automatically.
 		children = new Vector<>();
-        
+
 
         NodeList nodeList = element.getChildNodes();
 		Vector<Node> vector = new Vector<>();
@@ -241,7 +241,7 @@
     /**
      * Adds the given elements as children of this container, before the
      * specified index.
-     * 
+     *
      * @param childElements
      */
     protected void insertElementsBefore(Element[] childElements, Bundle bundle,
@@ -263,7 +263,7 @@
     /**
      * Adds the given elements as children of this container, before the
      * specified element. The element must be a direct child of this container.
-     * 
+     *
      * @param childElements
      */
     protected void insertElementsBefore(Element[] childElements, Bundle bundle,
@@ -280,7 +280,7 @@
     /**
      * Adds a child to this container, depending on its type. Subclasses may
      * override if there is a child specific to the subclass.
-     * 
+     *
      * @param childElements
      */
     protected AbstractIntroElement getModelChild(Element childElement,
@@ -340,7 +340,7 @@
      * and adds it as a child of this current container. If target is not a
      * group, or any element that can be included in a group, ignore this
      * include.
-     * 
+     *
      * @param include
      */
     private void resolveInclude(IntroInclude include) {
@@ -361,7 +361,7 @@
      * Filters the appropriate elements from the given Vector, according to the current
      * environment. For example, if one of the elements has a tag to filter for os=linux and
      * the os is win32, the element will not be returned in the resulting Vector.
-     * 
+     *
      * @param unfiltered the unfiltered elements
      * @return a new Vector with elements filtered
      */
@@ -376,12 +376,12 @@
     	}
     	return filtered;
     }
-    
+
     /**
      * Find the target element pointed to by the path in the include. It is
      * assumed that configId always points to an external config, and not the
      * same config of the inlcude.
-     * 
+     *
      * @param include
      * @param path
      * @return
@@ -406,7 +406,7 @@
      * model.<br>
      * ps: This method could be a static method, but left as instance for model
      * enhancements.
-     * 
+     *
      * @param model
      * @param path
      * @return
@@ -417,7 +417,7 @@
         String[] pathSegments = StringUtil.split(path, "/"); //$NON-NLS-1$
         if (container == null)
             return null;
-        
+
         AbstractIntroElement target = container.findChild(pathSegments[0]);
         if (target == null)
             // there is no direct child with the specified first path segment.
@@ -437,7 +437,7 @@
         }
         return target;
     }
-    
+
     public AbstractIntroElement findTarget(AbstractIntroContainer container,
             String path, String extensionId) {
         // resolve path segments if they are incomplete.
@@ -465,7 +465,7 @@
      * searches direct children for the first child with the given id. The type
      * of the child can be any model element that has an id. ie:
      * AbstractIntroIdElement
-     * 
+     *
      * @see org.eclipse.ui.internal.intro.impl.model.IntroElement#getType()
      */
     public AbstractIntroElement findChild(String elementId) {
@@ -477,7 +477,7 @@
      * of the child must be of the passed model types mask. This method handles
      * the 3.0 style model for content. Pages enhance this behavior with DOM
      * apis.
-     * 
+     *
      * @see org.eclipse.ui.internal.intro.impl.model.IntroElement#getType()
      */
     public AbstractIntroElement findChild(String elementId, int elementMask) {
@@ -537,7 +537,7 @@
      * plugin. Also note that when including a container, it must be resolved
      * otherwise reparenting will cause includes in this target container to
      * fail.
-     * 
+     *
      * @param include
      * @param target
      */
@@ -579,11 +579,11 @@
     /**
      * Creates a clone of the given target node. A clone is create by simply
      * recreating that protion of the model.
-     * 
+     *
      * Note: looked into the clonable interface in Java, but it was not used
      * because it makes modifications/additions to the model harder to maintain.
      * Will revisit later.
-     * 
+     *
      * @param targer
      * @return
      */
@@ -617,7 +617,7 @@
 
     /**
      * Returns the element.
-     * 
+     *
      * @return
      */
     @Override
@@ -642,13 +642,13 @@
     /**
      * Adds a model element as a child. Caller is responsible for inserting
      * model elements that rea valid as children.
-     * 
+     *
      * @param child
      */
     public void addChild(AbstractIntroElement child) {
         children.add(child);
     }
-    
+
     public void removeChild(AbstractIntroElement child) {
     	children.remove(child);
     }
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroElement.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroElement.java
index 2e1eaba..13adf8c 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroElement.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroElement.java
@@ -139,12 +139,12 @@
      * Type constant which identifies am injected IFrame model element.
      */
     public static final int INJECTED_IFRAME = 1 << 17;
-    
+
     /**
      * Type constant for the theme element.
      */
     public static final int THEME = 1 << 18;
-    
+
     /**
      * Type constant for the hr element.
      */
@@ -196,7 +196,7 @@
      * Constructor used when model elements are being loaded from an xml content
      * file. Bundle is propagated down the model to enable resolving resources
      * relative to the base of the bundle.
-     * 
+     *
      * @param element
      * @param pd
      */
@@ -214,7 +214,7 @@
      * In the case of a configExtension, it is set to point to the relative
      * position of the parent folder that holds the extension. Only when needed,
      * the base field is stored in a model element. This saves memory.
-     * 
+     *
      * @param element
      * @param pd
      */
@@ -229,13 +229,13 @@
      * Returns the configuration element from which this intro element was
      * loaded. In the case of extension, returns the configuration element of
      * the defining extension.
-     * 
+     *
      * @return
      */
     public IConfigurationElement getCfgElement() {
         return cfgElement instanceof IConfigurationElement?(IConfigurationElement)cfgElement:null;
     }
-    
+
     public Element getElement() {
     	return cfgElement instanceof Element?(Element)cfgElement:null;
     }
@@ -244,7 +244,7 @@
      * DOM getAttribute retruns an empty string (not null) if attribute is not
      * defined. Override this behavior to be consistent with Intro Model, and
      * IConfiguration element.
-     * 
+     *
      * @param element
      * @param att
      * @return
@@ -264,7 +264,7 @@
 
     /**
      * Util method to parse a comma separated list of values
-     * 
+     *
      * @param element
      * @param att
      * @return
@@ -278,7 +278,7 @@
             	if (root!=null) {
             		for (int i = 0; i < splitValues.length; i++) {
             			splitValues[i] = root.resolveVariables(splitValues[i]);
-            		}     		
+            		}
             	}
             	return splitValues;
             }
@@ -289,7 +289,7 @@
             */
         return null;
     }
-    
+
     protected void loadFromParent() {
     }
 
@@ -298,7 +298,7 @@
      * Returns the plugin descriptor of the plugin from which this intro element
      * was loaded. In the case of extension, returns the plugin descriptor of
      * the plugin defining the extension.
-     * 
+     *
      * @return
      */
     public Bundle getBundle() {
@@ -310,7 +310,7 @@
     /**
      * Returns the specific model type of this intro element. To be implemented
      * by all subclasses.
-     * 
+     *
      * @return returns one of the model class types defined in this class.
      */
     public abstract int getType();
@@ -331,7 +331,7 @@
      * <li>for Head elements that are children of Implementation elements
      * (shared Heads), it returns the holding presentation element.</li>
      * </ul>
-     * 
+     *
      * @return returns the parent of this intro element. Null only for model
      *         root.
      */
@@ -382,7 +382,7 @@
             return (AbstractIntroPage) parent;
         return null;
     }
-    
+
     public IntroModelRoot getModelRoot() {
         // return yourself if you are a model root.
         if (isOfType(AbstractIntroElement.MODEL_ROOT))
@@ -397,7 +397,7 @@
             parent = parent.getParent();
         if (parent.isOfType(MODEL_ROOT))
             return (IntroModelRoot) parent;
-        return null;    	
+        return null;
     }
 
 
@@ -409,7 +409,7 @@
      *  	int elementMask = IntroElement.ABSTRACT_CONTAINER;
      * 		int elementMask = IntroElement.DIV | IntroElement.DEFAULT_LINK;
      * </code>
-     * 
+     *
      * @param elementMask
      *            element mask formed by bitwise OR of element type constants
      *            defined in this class.
@@ -428,7 +428,7 @@
      * <code>
      * int elementMask = IntroElement.DIV | IntroElement.DEFAULT_LINK;
      * </code>
-     * 
+     *
      * @return <code>true</code> if all elements are of the right type, and
      *         <code>false</code> if the list is empty, or at least one
      *         element is not of the specified types.
@@ -459,13 +459,13 @@
     }
 
 
-	
+
 	public String getMixinStyle() {
 		return mixinStyle;
 	}
 
 
-	
+
 	public void setMixinStyle(String mixinStyle) {
 		this.mixinStyle = mixinStyle;
 	}
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroIdElement.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroIdElement.java
index ecb5388..2f499d2 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroIdElement.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroIdElement.java
@@ -19,7 +19,7 @@
  * An Intro Config component that has an id attribute. It is used as a base
  * class for all config elements that can take an id, and hence are valid
  * targets for includes and finds.
- * 
+ *
  */
 public abstract class AbstractIntroIdElement extends AbstractIntroElement {
 
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroPage.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroPage.java
index dc3f9fb..8527efb 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroPage.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroPage.java
@@ -80,7 +80,7 @@
     // DOM representing XHTML content. DOM is only cached in the case of XHTML
     // content.
     private Document dom;
-    
+
     private DocumentProcessor domProcessor;
 
     // set when the content file is loaded (ie: loadChildren is called)
@@ -125,7 +125,7 @@
      * different from the bundle for all the other pages. Only pages do this
      * logic and so other model objects might have the wrong bundle cached if
      * the resource was loaded from an nl directory.
-     * 
+     *
      * @param element
      */
     AbstractIntroPage(Element element, Bundle bundle, String base) {
@@ -167,20 +167,20 @@
             url = ModelUtil.resolveURL(base, url, bundle);
 
     }
-    
+
     @Override
 	public void setParent(AbstractIntroElement parent) {
     	super.setParent(parent);
         if (content == null)
             init(element, getBundle(), initialBase);
     }
-    
+
     /**
      * Returns unresolved content value as found in the source file.
      * the source file.
      * @return the unresolved content value
      */
-    
+
     public String getRawContent() {
     	return getAttribute(element, ATT_CONTENT);
     }
@@ -189,7 +189,7 @@
      * Initialize styles. Take first style in style attribute and make it the
      * page style. Then put other styles in styles vectors. Make sure to resolve
      * each style.
-     * 
+     *
      * @param element
      * @param bundle
      */
@@ -225,7 +225,7 @@
 
     /**
      * The page's title. Each page can have one title.
-     * 
+     *
      * @return Returns the title of this page.
      */
     public String getTitle() {
@@ -267,7 +267,7 @@
      * <p>
      * Note: this call needs to get all the children of this page, and so it
      * will resolve this page. might be expensive.
-     * 
+     *
      * @return Returns all the inherited styles of this page. Returns an empty
      *         array if page is not expandable or does not have inherited
      *         styles.
@@ -291,7 +291,7 @@
      * resources from the inherited target plugin. Note: this call needs to get
      * all the children of this page, and so its will resolve this page. might
      * be expensive.
-     * 
+     *
      * @return Returns all the inherited styles of this page. Returns an empty
      *         hashtable if page is not expandable, does not have any includes,
      *         or has includes that do not merge styles.
@@ -306,7 +306,7 @@
     /**
      * Adds the given style to the list. Style is not added if it already exists
      * in the list.
-     * 
+     *
      * @param style
      */
     protected void addStyle(String style) {
@@ -330,7 +330,7 @@
     /**
      * Adds the given style to the list.Style is not added if it already exists
      * in the list.
-     * 
+     *
      * @param altStyle
      */
     protected void addAltStyle(String altStyle, Bundle bundle) {
@@ -344,7 +344,7 @@
 
     /**
      * Util method to add given styles to the list.
-     * 
+     *
      */
     protected void addStyles(String[] styles) {
         if (styles == null)
@@ -394,7 +394,7 @@
      * Override parent behavior to lazily initialize styles vectors. This will
      * only be called once, if resolved == false. In the case of DOM model,
      * resolve this page's full DOM.
-     * 
+     *
      * @see org.eclipse.ui.internal.intro.impl.model.AbstractIntroContainer#resolveChildren()
      */
     @Override
@@ -411,7 +411,7 @@
     /**
      * Override parent behavior to add support for HEAD & Title element in pages
      * only, and not in divs.
-     * 
+     *
      * @see org.eclipse.ui.internal.intro.impl.model.AbstractIntroContainer#getModelChild(org.eclipse.core.runtime.IConfigurationElement)
      */
     @Override
@@ -436,7 +436,7 @@
     /**
      * Returns all head contributions in this page. There can be more than one
      * head contribution in the page;
-     * 
+     *
      * @return
      */
     public IntroHead[] getHTMLHeads() {
@@ -501,7 +501,7 @@
      * Load the xml content from the introContent.xml file pointed to by the
      * content attribute, and loaded into the passed DOM. Load the first page
      * with correct id from this content file.
-     * 
+     *
      * @param dom
      */
     private void loadXMLContent(Document dom) {
@@ -563,7 +563,7 @@
      * Returns the DOM representing an external XHTML file. May return null if
      * extension content is 3.0 format. The page is resolved before returning,
      * meaning includes are resolved, and the base of the page is defined.
-     * 
+     *
      * @return
      */
     public Document getResolvedDocument() {
@@ -577,7 +577,7 @@
      * Returns the DOM representing an external XHTML file. May return null if
      * extension content is 3.0 format. The page is NOT resolved before
      * returning. It is retruned as given by the dom parser.
-     * 
+     *
      * @return
      */
     public Document getDocument() {
@@ -592,7 +592,7 @@
      * Returns whether or not we have an XHTML page as the content for this
      * page. The XHTML page is defined through the content attribute. This
      * method forces the content file to be parsed and loaded in memory.
-     * 
+     *
      * @return
      */
     public boolean isXHTMLPage() {
@@ -614,7 +614,7 @@
      * whether or not an xmlns was used in the xml. note: could not have used
      * inheritance from parent container because return type for parent is intro
      * legacy model.
-     * 
+     *
      */
     public Element findDomChild(String id, String localElementName) {
         if (!loaded)
@@ -626,7 +626,7 @@
 
     /**
      * Search for any element with the given id.
-     * 
+     *
      * @param id
      * @return
      */
@@ -670,7 +670,7 @@
         }
         UAElement element = UAElementFactory.newElement(dom.getDocumentElement());
         domProcessor.process(element, null);
-        
+
         // and resolve includes.
         resolveIncludes();
 
@@ -724,7 +724,7 @@
      * Find the target Element pointed to by the path in the include. It is
      * assumed that configId always points to an external config, and not the
      * same config of the inlcude.
-     * 
+     *
      * @param include
      * @param path
      * @return
@@ -749,7 +749,7 @@
     /**
      * Finds the child element that corresponds to the given path in the passed
      * model.
-     * 
+     *
      * @param model
      *            model containing target path.
      * @param path
@@ -814,7 +814,7 @@
     /**
      * Used when cloning pages to assign a unique id. Cache original id before
      * setting.
-     * 
+     *
      * @param id
      */
     public void setId(String id) {
@@ -846,7 +846,7 @@
 
     /**
      * Return true if this page is a cloned page that has an IFrame.
-     * 
+     *
      * @return
      */
     public boolean isIFramePage() {
@@ -863,7 +863,7 @@
 
     /**
      * Set the url of the embedded IFrame, if this page is an IFrame page.
-     * 
+     *
      * @param url
      */
     public void setIFrameURL(String url) {
@@ -874,7 +874,7 @@
 
     /**
      * Return the url of the embedded IFrame, if this page is an IFrame page.
-     * 
+     *
      * @param url
      */
     public String getIFrameURL() {
@@ -889,10 +889,10 @@
     public String getInitialBase() {
     	return initialBase;
     }
-    
+
     /**
      * Return the url of the embedded IFrame, if this page is an IFrame page.
-     * 
+     *
      * @param url
      */
     public boolean injectSharedStyle() {
@@ -900,13 +900,13 @@
     }
 
 	/**
-	 * Returns true if this is a dynamicpage or not. 
+	 * Returns true if this is a dynamicpage or not.
 	 * @return Returns the isDynamic.
 	 */
 	public boolean isDynamic() {
 	    return isDynamic;
 	}
-	
+
 	/**
      * @return Returns the url.
      */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroPartImplementation.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroPartImplementation.java
index 57ba999..e67662a 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroPartImplementation.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/AbstractIntroPartImplementation.java
@@ -35,7 +35,7 @@
  * instantiated from plugin markup and so we need a default constructor,
  * including in subclasses. It has some base methods, including maintaining a
  * history of navigation locations. Also, dynamic awarness is honored here.
- * 
+ *
  */
 public abstract class AbstractIntroPartImplementation {
 
@@ -121,7 +121,7 @@
 
     /**
      * Creates the UI based on this implementation class. .
-     * 
+     *
      * @param parent
      */
     public abstract void createPartControl(Composite parent);
@@ -130,7 +130,7 @@
      * Called when the init method is called in the IIntroPart. Subclasses may
      * extend, for example to get the passed Memento. When extending, make sure
      * you include a call to super.
-     * 
+     *
      * @param introPart
      */
     public void init(IIntroPart introPart, IMemento memento) {
@@ -156,7 +156,7 @@
 
     /**
      * Updates the UI navigation history with either a real URL.
-     * 
+     *
      * @param location
      */
     public void updateHistory(String location) {
@@ -166,7 +166,7 @@
 
     /**
      * Updates the UI navigation history with a page ID.
-     * 
+     *
      * @param pageId
      */
     public void updateHistory(AbstractIntroPage page) {
@@ -178,7 +178,7 @@
     /**
      * Subclasses must implement to set the state of the navigation actions in
      * the toolbar.
-     * 
+     *
      */
     public abstract void setFocus();
 
@@ -186,7 +186,7 @@
     /**
      * Subclasses must implement to update the intro view actions when history
      * is updated.
-     * 
+     *
      */
     protected abstract void updateNavigationActionsState();
 
@@ -224,7 +224,7 @@
      * Called when the Intro changes state. This method should not be
      * subclassed. It adds performance logging calls. Subclasses must implement
      * doStandbyStateChanged instead.
-     * 
+     *
      * @param standby
      */
     public void standbyStateChanged(boolean standby, boolean isStandbyPartNeeded) {
@@ -305,12 +305,12 @@
      * about the most recently visited intro page. In static case, the last HTML
      * page is remembered. In dynamic case, the last UI page or HTML page is
      * remembered.
-     * 
+     *
      * Note: This method saves the last visited intro page in a dynamic case.
      * Subclasses need to extend to get the desired behavior relavent to the
      * specific implementation. Broswer implementation needs to cache an http
      * web page, if it happens to be the last page visited.
-     * 
+     *
      * @param memento
      */
     public void saveState(IMemento memento) {
@@ -323,7 +323,7 @@
      * memento. If a given implementation requires saving alternative
      * information (e.g., information about the most recently visited static
      * page) it should override this method.
-     * 
+     *
      * @param memento
      */
     protected void saveCurrentPage(IMemento memento) {
@@ -376,7 +376,7 @@
     /**
      * Support dynamic awarness. Clear cached models first, then update UI by
      * delegating to implementation.
-     * 
+     *
      * @see org.eclipse.core.runtime.IRegistryChangeListener#registryChanged(org.eclipse.core.runtime.IRegistryChangeEvent)
      */
     public void registryChanged(IRegistryChangeEvent event) {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/ExtensionMap.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/ExtensionMap.java
index 45666fa..01fd0a8 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/ExtensionMap.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/ExtensionMap.java
@@ -16,20 +16,20 @@
 
 /**
  * This package maintains the mapping between extension ids in the registry and extension ids
- * as defined in extension files. It also allows a configurer to change the page which will be 
+ * as defined in extension files. It also allows a configurer to change the page which will be
  * displayed when the welcome screen is shown.
  */
 
 public class ExtensionMap {
-	
+
 	private static ExtensionMap instance;
 	private static String startPage;
 	private Map<String, String> extensions = new HashMap<>();
-	
+
 	private ExtensionMap() {
-		
+
 	}
-	
+
 	/**
 	 * Get the one and only instance of this class
 	 * @return
@@ -51,9 +51,9 @@
 		    extensions.put(anchorId, pluginId);
 		}
 	}
-	
+
 	/**
-	 * Lookup in which plugin 
+	 * Lookup in which plugin
 	 * @param anchorId
 	 * @return the plugin which contributed that anchor
 	 */
@@ -76,9 +76,9 @@
 	public String getStartPage() {
 		return startPage;
 	}
-	
+
 	/**
-	 * Allows a configurer to override the page which is displayed when 
+	 * Allows a configurer to override the page which is displayed when
 	 * the welcome screen is first shown
 	 * @param contentPage
 	 */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/History.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/History.java
index 4d7f6a4..ecf503b 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/History.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/History.java
@@ -50,7 +50,7 @@
 
         /**
          * returns the history page. If iframe page, updated to correct url.
-         * 
+         *
          * @return
          */
         AbstractIntroPage getPage() {
@@ -91,7 +91,7 @@
 
     /**
      * Updates the UI navigation history with either a real URL, or a page ID.
-     * 
+     *
      * @param pageId
      */
     public void updateHistory(String location) {
@@ -104,7 +104,7 @@
 
     /**
      * Updates the UI navigation history with either a real URL, or a page ID.
-     * 
+     *
      * @param page
      */
     public void updateHistory(AbstractIntroPage page) {
@@ -162,7 +162,7 @@
         // point the nav location to the end of the vector.
         navigationLocation = getHistoryEndPosition();
     }
-    
+
      public void removeLastHistory() {
         history.remove(getHistoryEndPosition());
         // point the nav location to the end of the vector.
@@ -180,7 +180,7 @@
     /**
      * Return the position of the last element in the navigation history. If
      * vector is empty, return 0.
-     * 
+     *
      * @param vector
      * @return
      */
@@ -199,7 +199,7 @@
 
     /**
      * Navigate forward in the history.
-     * 
+     *
      * @return
      */
     public void navigateHistoryForward() {
@@ -221,7 +221,7 @@
     /**
      * Returns true if the current location in the navigation history represents
      * a URL. False if the location is an Intro Page id.
-     * 
+     *
      * @return Returns the locationIsURL.
      */
     private HistoryObject getCurrentLocation() {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroContentProvider.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroContentProvider.java
index 43f7aca..83145aa 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroContentProvider.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroContentProvider.java
@@ -21,7 +21,7 @@
  * implement the IIntroContentProvider interface. The pluginId attribute can be
  * used if the class doesn't come from the plugin that defined the markup. The
  * text content should be used only if we fail to load the class. <br>
- * 
+ *
  * INTRO: model class has access to style-id attribute but it is not used in the
  * schema.
  */
@@ -44,7 +44,7 @@
     /**
      * Returns the content provider, which should implement
      * IIntroContentProvider
-     * 
+     *
      * @return Returns the contentProvider.
      */
     public String getClassName() {
@@ -53,7 +53,7 @@
 
     /**
      * Returns the id of the plugin that contains the content provider class
-     * 
+     *
      * @return Returns the pluginId.
      */
     public String getPluginId() {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroExtensionContent.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroExtensionContent.java
index cfb5622..5453202 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroExtensionContent.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroExtensionContent.java
@@ -43,7 +43,7 @@
 
     public static final int TYPE_CONTRIBUTION = 0;
     public static final int TYPE_REPLACEMENT = 1;
-   
+
     protected static final String ATT_PATH = "path"; //$NON-NLS-1$
     protected static final String ATT_ID = "id"; //$NON-NLS-1$
     private static final String ATT_STYLE = "style"; //$NON-NLS-1$
@@ -87,12 +87,12 @@
                 bundle);
             this.base = newBase;
         }
-        
+
         // Save the mapping between plugin registry id and base/anchor id
         String contributor = configExtElement.getContributor().getName();
         ExtensionMap.getInstance().putPluginId(anchorId, contributor);
     }
-    
+
     public String getId() {
     	return anchorId;
     }
@@ -102,7 +102,7 @@
      * Initialize styles. Take first style in style attribute and make it the
      * page style. Then put other styles in styles vectors. Make sure to resolve
      * each style.
-     * 
+     *
      * @param element
      * @param bundle
      */
@@ -131,7 +131,7 @@
     /**
      * Adds the given style to the list. Style is not added if it already exists
      * in the list.
-     * 
+     *
      * @param style
      */
     protected void addStyle(String style) {
@@ -144,7 +144,7 @@
     /**
      * Adds the given style to the list.Style is not added if it already exists
      * in the list.
-     * 
+     *
      * @param altStyle
      */
     protected void addAltStyle(String altStyle, Bundle bundle) {
@@ -197,7 +197,7 @@
 	 * that should be inserted for the extension. If it is a file, all child elements
 	 * of body are returned. If it is a file with an id, only the element with the id
 	 * is returned.
-	 * 
+	 *
 	 * @return the elements to be inserted
 	 */
     public Element[] getElements() {
@@ -250,13 +250,13 @@
     public String getBase() {
         return base;
     }
-    
+
 	/**
 	 * Extracts the file and id parts of the content attribute. This attribute has two modes -
 	 * if you specify a file, it will include the body of that file (minus the body element itself).
 	 * If you append an id after the file, only the element with that id will be included. However
 	 * we need to know which mode we're in.
-	 * 
+	 *
 	 * @param bundle the bundle that contributed this extension
 	 */
     private void extractFileAndId(Bundle bundle) {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroGroup.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroGroup.java
index 2ab39b6..49e8b7b 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroGroup.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroGroup.java
@@ -38,11 +38,11 @@
     IntroGroup(Element element, Bundle bundle, String base) {
         super(element, bundle, base);
     }
-    
+
     @Override
 	protected void loadFromParent() {
     }
-    
+
     private void resolve() {
     	// reinitialize if there are variables in the value.
     	if (label==null) {
@@ -66,22 +66,22 @@
     	resolve();
         return label;
     }
-    
+
     @Override
 	public int getType() {
         return AbstractIntroElement.GROUP;
     }
-    
+
     public boolean isExpandable() {
     	String value=getAttribute(element, ATT_EXPANDABLE);
     	return value!=null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
     }
-    
+
     public boolean isExpanded() {
     	String value=getAttribute(element, ATT_EXPANDED);
     	return value!=null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
     }
-    
+
     @Override
 	protected void loadChildren() {
     	String value = getAttribute(element, ATT_COMPUTED);
@@ -102,7 +102,7 @@
     	    addDynamicNodes(this.element, nodes);
     	}
     }
-  
+
     private void addDynamicNodes(Element target, IntroElement [] nodes) {
     	for (int i=0; i<nodes.length; i++) {
     		IntroElement node = nodes[i];
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroHTML.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroHTML.java
index ccd5d10..83ceec7 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroHTML.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroHTML.java
@@ -85,7 +85,7 @@
     /**
      * Returns the html type. Will be either "inline" or "embed". If not, null
      * will be returned as if the attibute was nto defined.
-     * 
+     *
      * @return Returns the html type value.
      */
     public boolean isInlined() {
@@ -111,7 +111,7 @@
     /**
      * Returns the intro image used as a replacement if this HTML element fails.
      * May return null if there is no image child.
-     * 
+     *
      * @return Returns the introImage.
      */
     public IntroImage getIntroImage() {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroImage.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroImage.java
index 83aa018..a13f8bf 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroImage.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroImage.java
@@ -42,7 +42,7 @@
     public String getAlt() {
         return getAttribute(element, ATT_ALT);
     }
-    
+
     /**
      * @return Returns the title.
      */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroLaunchBarElement.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroLaunchBarElement.java
index d23ded6..e2f9c3b 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroLaunchBarElement.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroLaunchBarElement.java
@@ -26,7 +26,7 @@
  * An Intro Config component captures launch bar information. It can have
  * shortcuts and one handle. <br>
  * ps: Handles are not modeled in a dedicated class, but are handled here.
- * 
+ *
  * @since 3.1
  */
 public class IntroLaunchBarElement extends AbstractIntroElement {
@@ -50,7 +50,7 @@
      * Returns the desired launch bar orientation that results from the desired
      * location. Valid values are <code>SWT.VERTICAL</code> and
      * <code>SWT.HORIZONTAL</code>.
-     * 
+     *
      * @return
      */
     public int getOrientation() {
@@ -63,7 +63,7 @@
      * Returns the location of the launch bar in the workbench window. Valid
      * values are <code>SWT.RIGHT</code>,<code>SWT.LEFT</code> and
      * <code>SWT.BOTTOM</code>.
-     * 
+     *
      * @return
      */
     public int getLocation() {
@@ -113,7 +113,7 @@
 
     /**
      * Returns the relative icon path of the handle image.
-     * 
+     *
      * @return
      */
     private String getHandleImage() {
@@ -126,7 +126,7 @@
     /**
      * Returns the icon image of the handle, or <code>null</code> if not
      * defined or found.
-     * 
+     *
      * @return
      */
     public ImageDescriptor getHandleImageDescriptor() {
@@ -146,7 +146,7 @@
 
     /**
      * Returns an array of shorcut elements.
-     * 
+     *
      * @return
      */
     public IntroLaunchBarShortcut[] getShortcuts() {
@@ -159,16 +159,16 @@
 
     /**
      * Creates an array of shortcut elements
-     * 
+     *
      */
     private void createShortcuts() {
 		shortcuts = new ArrayList<>();
         IntroModelRoot model = getModelRoot();
         IntroConfigurer configurer = model!=null?model.getConfigurer():null;
-        
+
         String cvalue = getCfgElement().getAttribute("computed"); //$NON-NLS-1$
         boolean computed = cvalue!=null && cvalue.equalsIgnoreCase("true"); //$NON-NLS-1$
-        
+
         if (computed && configurer!=null) {
         	IntroElement [] children = configurer.getLaunchBarShortcuts();
         	for (int i=0; i<children.length; i++) {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroLaunchBarShortcut.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroLaunchBarShortcut.java
index ba83969..406f4c5 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroLaunchBarShortcut.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroLaunchBarShortcut.java
@@ -20,7 +20,7 @@
 
 /**
  * An Intro Config component that captures launch bar shortcut information.
- * 
+ *
  * @since 3.1
  */
 public class IntroLaunchBarShortcut extends AbstractIntroElement {
@@ -30,14 +30,14 @@
     private static final String ATT_TOOLTIP = "tooltip"; //$NON-NLS-1$
     private static final String ATT_ICON = "icon"; //$NON-NLS-1$
     private static final String ATT_URL = "url"; //$NON-NLS-1$
-    
+
     private IntroElement ielement;
-    
+
     IntroLaunchBarShortcut(IConfigurationElement element, IntroElement ielement) {
     	super(element);
     	this.ielement = ielement;
     }
-    
+
     IntroLaunchBarShortcut(IConfigurationElement element) {
         super(element);
     }
@@ -47,7 +47,7 @@
 	public int getType() {
         return AbstractIntroElement.LAUNCH_BAR_SHORTCUT;
     }
-    
+
     private String getAttribute(String name) {
     	if (ielement!=null)
     		return ielement.getAttribute(name);
@@ -56,7 +56,7 @@
 
     /**
      * Returns the URL of this shortcut.
-     * 
+     *
      * @return
      */
     public String getURL() {
@@ -65,7 +65,7 @@
 
     /**
      * Returns the tooltip of this shortcut.
-     * 
+     *
      * @return
      */
     public String getToolTip() {
@@ -74,7 +74,7 @@
 
     /**
      * Returns the relative icon path of this shortcut.
-     * 
+     *
      * @return
      */
     private String getIcon() {
@@ -84,7 +84,7 @@
     /**
      * Returns the icon image of this shortcut, or <code>null</code> if not
      * found.
-     * 
+     *
      * @return
      */
     public ImageDescriptor getImageDescriptor() {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroLink.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroLink.java
index d8ce465..c9f2b36 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroLink.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroLink.java
@@ -81,7 +81,7 @@
     /**
      * Retruns an IntroURL instance if link has a valid intro url. Returns null
      * otherwise.
-     * 
+     *
      * @return Returns the introURL.
      */
     public IntroURL getIntroURL() {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroModelRoot.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroModelRoot.java
index 4e8c114..109c80b 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroModelRoot.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroModelRoot.java
@@ -46,7 +46,7 @@
 /**
  * The root class for the OOBE model. It loads the configuration into the
  * appropriate classes.
- * 
+ *
  * Model rules:
  * <ol>
  * <li>if an attribute is not included in the markup, its value will be null in
@@ -133,7 +133,7 @@
 	public ListenerList<IPropertyListener> propChangeListeners = new ListenerList<>();
 
     // a list to hold all loaded DOMs until resolving all configExtensions
-    // is done. 
+    // is done.
 	private List<ExtensionContent> unresolvedConfigExt = new ArrayList<>();
 
 
@@ -172,7 +172,7 @@
      * extension pages and groups. The presentation is loaded from the
      * IConfiguration element representing the config. All else is loaded from
      * xml content file.
-     * 
+     *
      */
     @Override
 	protected void loadChildren() {
@@ -189,7 +189,7 @@
             Log.warning("Could not find presentation element in intro config."); //$NON-NLS-1$
             return;
         }
-        
+
         loadTheme();
         loadConfigurer();
 
@@ -232,7 +232,7 @@
      * presentation as the first child, so use that fact. This method is used
      * for dynamic awarness to enable replacing the new presentation with the
      * existing one after a model refresh.
-     * 
+     *
      * @param presentation
      */
     public void setPresentation(IntroPartPresentation presentation) {
@@ -262,7 +262,7 @@
                 IntroPartPresentation.ATT_HOME_PAGE_ID);
         return presentationElement;
     }
-    
+
     private void loadConfigurer() {
     	String cname = getCfgElement().getAttribute(ATT_CONFIGURER);
     	if (cname!=null) {
@@ -277,7 +277,7 @@
     		}
     	}
     }
-    
+
     private void determineHomePage() {
     	String pid = Platform.getProduct().getId();
     	startPageId = getProcessPreference("INTRO_START_PAGE", pid); //$NON-NLS-1$
@@ -308,11 +308,11 @@
             standbyPage.setStandbyPage(true);
         }
     }
-    
+
     private void loadTheme() {
     	String pid = Platform.getProduct().getId();
     	String themeId = getProcessPreference("INTRO_THEME", pid); //$NON-NLS-1$
-    	
+
     	IConfigurationElement [] elements = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.ui.intro.configExtension"); //$NON-NLS-1$
     	IConfigurationElement themeElement=null;
     	for (int i=0; i<elements.length; i++) {
@@ -389,9 +389,9 @@
         for (int i = 0; i < configExtensionElements.length; i++) {
             processConfigExtension(configExtensionElements[i]);
         }
-        
+
         tryResolvingExtensions();
-        
+
         // At this stage all pages will be resolved, some contributions may not be
 
         // now add all unresolved extensions as model children and log fact.
@@ -471,8 +471,8 @@
 				Bundle bundle = BundleUtil.getBundleFromConfigurationElement(configExtElement);
 				String elementBase = getBase(configExtElement);
                 processOneExtension(configExtElement, elementBase, bundle, extensionContentElement);
-				if (extensionContentElement.hasAttribute("failed")) { //$NON-NLS-1$					
-					stillUnresolved.add(content);				
+				if (extensionContentElement.hasAttribute("failed")) { //$NON-NLS-1$
+					stillUnresolved.add(content);
 				}
             }
             unresolvedConfigExt = stillUnresolved;
@@ -486,10 +486,10 @@
      * not include the page and group contributions as part of the model. If
      * extension content has XHTML content (ie: content attribute is defined) we
      * load extension DOM into target page dom.
-     * 
+     *
      * note: the extension Element is returned to enable creating a child model
      * element on failure.
-     * 
+     *
      * @param
      * @return
      */
@@ -506,7 +506,7 @@
 
         addUnfilteredExtensions(elements, extensionContents);
         addUnfilteredExtensions(elements, replacementContents);
-        
+
         return (Element[])elements.toArray(new Element[elements.size()]);
     }
 
@@ -515,7 +515,7 @@
         	Element extensionContentElement = extensionContents[i];
         	if (!UAContentFilter.isFiltered(UAElementFactory.newElement(extensionContentElement), IntroEvaluationContext.getContext())) {
         	    elements.add(extensionContentElement);
-            }    	
+            }
         }
 	}
 
@@ -540,7 +540,7 @@
 
     /**
      * Insert the extension content into the target.
-     * 
+     *
      * @param extensionContent
      * @return
      */
@@ -582,7 +582,7 @@
         if (extensionContent.getExtensionType() == IntroExtensionContent.TYPE_REPLACEMENT) {
             targetElement.getParentNode().removeChild(targetElement);
         }
-        
+
         // now handle style inheritance.
         // Update the parent page styles. skip style if it is null;
         String[] styles = extensionContent.getStyles();
@@ -599,7 +599,7 @@
 
     /**
      * Insert the extension content (3.0 format) into the target.
-     * 
+     *
      * @param extensionContent
      * @return
      */
@@ -630,7 +630,7 @@
         Element [] children = extensionContent.getChildren();
         parent.insertElementsBefore(children, bundle, base, target, mixinStyle);
     }
-    
+
     private String getMixinStyle(IntroExtensionContent extensionContent) {
     	String path = extensionContent.getPath();
     	if (!path.endsWith("/@")) //$NON-NLS-1$
@@ -660,7 +660,7 @@
      * configExtension. If we are extending a shared group do nothing. For
      * inherited alt-styles, we have to cache the bundle from which we inherited
      * the styles to be able to access resources in that plugin.
-     * 
+     *
      * @param include
      * @param target
      */
@@ -686,7 +686,7 @@
     }
 
     /**
-     * Sets the model state based on all the model classes. 
+     * Sets the model state based on all the model classes.
      */
     private void setModelState(boolean loaded, boolean hasValidConfig) {
         this.loaded = loaded;
@@ -697,7 +697,7 @@
      * Returns true if there is a valid contribution to
      * org.eclipse.ui.intro.config extension point, with a valid Presentation,
      * and pages.
-     * 
+     *
      * @return Returns the hasValidConfig.
      */
     public boolean hasValidConfig() {
@@ -710,7 +710,7 @@
     public IntroPartPresentation getPresentation() {
         return introPartPresentation;
     }
-    
+
     public IntroConfigurer getConfigurer() {
     	return configurer;
     }
@@ -721,7 +721,7 @@
     public AbstractIntroPage getHomePage() {
         return homePage;
     }
-    
+
     /**
      * @return Returns the root Page.
      */
@@ -767,7 +767,7 @@
     /**
      * Sets the current page. If the model does not have a page with the passed
      * id, the message is logged, and the model retains its old current page.
-     * 
+     *
      * @param currentPageId
      *            The currentPageId to set. *
      * @param fireEvent
@@ -811,7 +811,7 @@
     /**
      * Fires a property changed event. Made public because it can be used to
      * trigger a UI refresh.
-     * 
+     *
      * @param propertyId
      *            the id of the property that changed
      */
@@ -872,7 +872,7 @@
      * the configExt content files. ie: in plugin.xml. <br>
      * This method also sets the base attribute on the root element in the DOM
      * to enable resolving all resources relative to this DOM.
-     * 
+     *
      * @return
      */
     protected Document loadDOM(IConfigurationElement cfgElement) {
@@ -898,7 +898,7 @@
         String content = configElement.getAttribute(ATT_CONTENT);
         return ModelUtil.getParentFolderToString(content);
     }
-    
+
     public String resolveVariables(String text) {
     	if (text==null) return null;
     	if (text.indexOf('$')== -1)
@@ -942,20 +942,20 @@
     			return "rtl"; //$NON-NLS-1$
     		} else {
     			return "ltr"; //$NON-NLS-1$
-    		}			
+    		}
     	}
-		
+
     	if (configurer!=null)
     		return configurer.getVariable(variable);
     	return null;
     }
-    
+
     public String resolvePath(String extensionId, String path) {
     	if (configurer==null) return null;
     	return configurer.resolvePath(extensionId, path);
     }
 
-	
+
 	public IntroTheme getTheme() {
 		return theme;
 	}
@@ -963,13 +963,13 @@
 	public String getStartPageId() {
 		return startPageId;
 	}
-	
+
 	private String getProcessPreference(String key, String pid) {
 		String result = Platform.getPreferencesService().getString
-		      (IntroPlugin.PLUGIN_ID,  pid + '_' + key, "", null); //$NON-NLS-1$ 
+		      (IntroPlugin.PLUGIN_ID,  pid + '_' + key, "", null); //$NON-NLS-1$
     	if (result.length() == 0) {
     		result = Platform.getPreferencesService().getString
-		        (IntroPlugin.PLUGIN_ID,  key, "", null); //$NON-NLS-1$ 
+		        (IntroPlugin.PLUGIN_ID,  key, "", null); //$NON-NLS-1$
     	}
     	return result;
 	}
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroPartPresentation.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroPartPresentation.java
index cc7fead..fcbc602 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroPartPresentation.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroPartPresentation.java
@@ -90,7 +90,7 @@
 	private IMemento memento;
 
 	/**
-	 * 
+	 *
 	 */
 	IntroPartPresentation(IConfigurationElement element) {
 		super(element);
@@ -131,7 +131,7 @@
 	/**
 	 * Returns the styles associated with the Presentation. May be null if no shared presentation
 	 * style is needed, or in the case of static HTML OOBE.
-	 * 
+	 *
 	 * @return Returns the array of styles or null if not defined.
 	 */
 	public String[] getImplementationStyles() {
@@ -140,7 +140,7 @@
 
 	/**
 	 * Returns the type attribute of the implementation picked by this presentation.
-	 * 
+	 *
 	 * @return Returns the implementationKind.
 	 */
 	public String getImplementationKind() {
@@ -155,7 +155,7 @@
 	/**
 	 * Returns the model class for the Head element under an implementation. Returns null if there
 	 * is no head contribution.
-	 * 
+	 *
 	 * @param element
 	 * @return
 	 */
@@ -179,7 +179,7 @@
 	/**
 	 * Returns the launch bar element if defined in this presentation, or <code>null</code>
 	 * otherwise.
-	 * 
+	 *
 	 * @since 3.1
 	 * @return
 	 */
@@ -211,7 +211,7 @@
 
 	/**
 	 * Creates the UI based on the implementation class.
-	 * 
+	 *
 	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
 	 */
 	public void createPartControl(Composite parent) {
@@ -344,7 +344,7 @@
 	/**
 	 * Util method that searches for the given value in a comma separated list of values. The list
 	 * is retrieved as an attribute value of OS, WS.
-	 * 
+	 *
 	 */
 	private boolean listValueHasValue(String stringValue, String value) {
 		String[] attributeValues = StringUtil.split(stringValue, ","); //$NON-NLS-1$
@@ -382,7 +382,7 @@
 
 	/**
 	 * Creates the actual implementation class. Returns null on failure.
-	 * 
+	 *
 	 */
 	private AbstractIntroPartImplementation createIntroPartImplementation(String implementationType) {
 		// quick exits
@@ -391,14 +391,14 @@
 		if (!implementationType.equals(BROWSER_IMPL_KIND) && !implementationType.equals(FORMS_IMPL_KIND)
 				&& !implementationType.equals(TEXT_IMPL_KIND))
 			return null;
-		if (implementationType.equals(BROWSER_IMPL_KIND) && IntroPlugin.DEBUG_NO_BROWSER) 
+		if (implementationType.equals(BROWSER_IMPL_KIND) && IntroPlugin.DEBUG_NO_BROWSER)
 			return null;
 
 		AbstractIntroPartImplementation implementation = null;
 		try {
 			if (implementationType.equals(BROWSER_IMPL_KIND))
-				implementation = //null; 
-			      new BrowserIntroPartImplementation(); 
+				implementation = //null;
+			      new BrowserIntroPartImplementation();
 			else if (implementationType.equals(FORMS_IMPL_KIND))
 				implementation = new FormIntroPartImplementation();
 			else
@@ -413,7 +413,7 @@
 	/**
 	 * Returns the the Customizable Intro Part. may return null if init() has not been called yet on
 	 * the presentation.
-	 * 
+	 *
 	 * @return Returns the introPart.
 	 */
 	public IIntroPart getIntroPart() {
@@ -423,7 +423,7 @@
 	/**
 	 * Save the current state of the intro. Delegate to the implementation to do the work, as
 	 * different implementations may have different requirements.
-	 * 
+	 *
 	 * @param memento
 	 *            the memento in which to store state information
 	 */
@@ -480,7 +480,7 @@
 	/**
 	 * Support dynamic awarness. Clear cached models first, then update UI by delegating to
 	 * implementation.
-	 * 
+	 *
 	 * @see org.eclipse.core.runtime.IRegistryChangeListener#registryChanged(org.eclipse.core.runtime.IRegistryChangeEvent)
 	 */
 	public void registryChanged(IRegistryChangeEvent event) {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroSearchParticipant.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroSearchParticipant.java
index 54ef233..923da20 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroSearchParticipant.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroSearchParticipant.java
@@ -34,13 +34,13 @@
 /**
  * An implementation of SearchParticipant that adds Welcome content into the local help
  * index so that it can be searched.
- * 
+ *
  */
 
 public class IntroSearchParticipant extends SearchParticipant {
 
 	private IntroModelRoot model;
-	
+
 	private class TitleAndSummary {
 		String title;
 		String summary;
@@ -165,7 +165,7 @@
 			     addTitle(titleSummary.title, doc);
             }
             if (titleSummary.summary != null) {
-            	doc.setSummary(titleSummary.summary); 
+            	doc.setSummary(titleSummary.summary);
             }
             doc.addContents(contents);
 			return Status.OK_STATUS;
@@ -195,11 +195,11 @@
 				}
 				if (title != null) {
 					titleSummary.title = title;
-				}				
-				if  ("page-description".equals(childId)) { //$NON-NLS-1$
-					titleSummary.summary = childIntroText.getText(); 
 				}
-			} 
+				if  ("page-description".equals(childId)) { //$NON-NLS-1$
+					titleSummary.summary = childIntroText.getText();
+				}
+			}
             if (child instanceof AbstractIntroContainer) {
 				AbstractIntroContainer container = (AbstractIntroContainer) child;
 				if (!"navigation-links".equals(container.getId())) { //$NON-NLS-1$
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroStandbyContentPart.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroStandbyContentPart.java
index 4081340..64eda36 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroStandbyContentPart.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroStandbyContentPart.java
@@ -31,7 +31,7 @@
     /**
      * Note: model class with public constructor because it is not instantiated
      * by the model root.
-     * 
+     *
      * @param element
      */
     public IntroStandbyContentPart(IConfigurationElement element) {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroTheme.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroTheme.java
index ffd539f..0c39a33 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroTheme.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/IntroTheme.java
@@ -27,7 +27,7 @@
 	private String path;
 	private Hashtable<String, String> properties;
 	private boolean scalable;
-	
+
 	public IntroTheme(IConfigurationElement element) {
 		super(element);
 		name = element.getAttribute(ATT_NAME);
@@ -44,11 +44,11 @@
 	public IntroTheme(Element element, Bundle bundle, String base) {
 		super(element, bundle, base);
 	}
-	
+
 	public String getName() {
 		return name;
 	}
-	
+
 	public String getPath() {
 		return path;
 	}
@@ -57,15 +57,15 @@
 	public int getType() {
 		return THEME;
 	}
-	
+
 	public Map<String, String> getProperties() {
 		return properties;
 	}
-	
+
 	public boolean isScalable() {
 		return scalable;
 	}
-	
+
 	private void loadProperties(IConfigurationElement element) {
 		IConfigurationElement [] children = element.getChildren("property"); //$NON-NLS-1$
 		if (children.length==0)
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/BaseExtensionPointManager.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/BaseExtensionPointManager.java
index 4d8f4c3..d7de96c 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/BaseExtensionPointManager.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/BaseExtensionPointManager.java
@@ -119,7 +119,7 @@
      * that maps to the correct intro part id. If there is more than one config
      * thats maps to the same intro part id, log the fact, and return the first
      * one. If there are non, return null.
-     * 
+     *
      * @param configElements
      * @return
      */
@@ -150,7 +150,7 @@
 
         IConfigurationElement[] configExtensionElements = registry
             .getConfigurationElementsFor(CONFIG_EXTENSION);
-        
+
         /*
          * Extension filter is used for performance testing to only load contributions
          * from a specific plug-in (fixed data set).
@@ -174,7 +174,7 @@
     /**
      * Add a model to the cache. This method is private because only this
      * manager class knows how to load an intro model.
-     * 
+     *
      * @param modelId
      * @param model
      */
@@ -184,7 +184,7 @@
 
     /**
      * Gets the given model from the cache.
-     * 
+     *
      * @param modelId
      */
     protected IntroModelRoot getCachedModel(String configId) {
@@ -196,7 +196,7 @@
      * with an attribute of the given value. If there is more than one
      * configuration element that maps to the attribute value log the fact, and
      * return the first one. If there are non, return null.
-     * 
+     *
      * @param configElements
      * @return
      */
@@ -263,7 +263,7 @@
 	public Map<String, IntroModelRoot> getIntroModels() {
         return introModels;
     }
-    
+
     /*
      * Internal test hook for restricting which extensions to load.
      */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/ContentProviderManager.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/ContentProviderManager.java
index 5504003..fc545bc 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/ContentProviderManager.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/ContentProviderManager.java
@@ -89,7 +89,7 @@
 
 	/**
 	 * Retrieve an existing content provider class, or null if never created before.
-	 * 
+	 *
 	 * @param provider
 	 * @return
 	 */
@@ -107,7 +107,7 @@
 	/**
 	 * Tries to create an intro content provider class. may return null if creation fails. This will
 	 * be logged.
-	 * 
+	 *
 	 * @param provider
 	 * @param site
 	 * @return
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/ExtensionPointManager.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/ExtensionPointManager.java
index 80a69e1..18a2eba 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/ExtensionPointManager.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/ExtensionPointManager.java
@@ -76,7 +76,7 @@
 
     /**
      * Load an intro model given a config id.
-     * 
+     *
      * @param configId
      * @return
      */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/IntroContentParser.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/IntroContentParser.java
index 6555f49..3f56b59 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/IntroContentParser.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/IntroContentParser.java
@@ -36,7 +36,7 @@
 
 
 /**
- * 
+ *
  */
 public class IntroContentParser {
 
@@ -94,7 +94,7 @@
             buffer.append(spe.getLineNumber());
             buffer.append(", uri "); //$NON-NLS-1$
             buffer.append(spe.getSystemId());
-            buffer.append("\n"); //$NON-NLS-1$   
+            buffer.append("\n"); //$NON-NLS-1$
             buffer.append(spe.getMessage());
 
             // Use the contained exception.
@@ -123,7 +123,7 @@
     /**
      * Returned the DOM representing the intro xml content file. May return null
      * if parsing the file failed.
-     * 
+     *
      * @return Returns the document.
      */
     public Document getDocument() {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/ModelLoaderUtil.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/ModelLoaderUtil.java
index 162ae12..17328f0 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/ModelLoaderUtil.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/ModelLoaderUtil.java
@@ -29,7 +29,7 @@
 
     /**
      * Utility method to validate an elements name.
-     * 
+     *
      * @param element
      * @param validName
      * @return
@@ -48,7 +48,7 @@
      * passed array of elements. If the array is empty, null is returned. If
      * there is more than one element in the array, the first one is picked, but
      * this fact is logged. Attribute passed is used for logging.
-     * 
+     *
      * @param configElements
      * @return the first configElement in the array, or null if the array is
      *         empty.
@@ -127,7 +127,7 @@
 
     /**
      * Util class for creating class instances from plugins.
-     * 
+     *
      * @param pluginId
      * @param className
      * @return
@@ -158,7 +158,7 @@
     /**
      * Creates a key for the given element. Returns null if any id is null along
      * the path.
-     * 
+     *
      * @param element
      * @return
      */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/SharedConfigExtensionsManager.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/SharedConfigExtensionsManager.java
index fe37646..ccfc3a9 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/SharedConfigExtensionsManager.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/loader/SharedConfigExtensionsManager.java
@@ -78,7 +78,7 @@
 
     /**
      * Create an intro standby part or an intro command model class.
-     * 
+     *
      * @param element
      */
     private void createModelClass(IConfigurationElement element) {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/url/IntroURL.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/url/IntroURL.java
index 17b942d..40734c9 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/url/IntroURL.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/url/IntroURL.java
@@ -123,7 +123,7 @@
     /**
      * Prevent creation. Must be created through an IntroURLParser. This
      * constructor assumed we have a valid intro url.
-     * 
+     *
      * @param url
      */
     IntroURL(String action, Properties parameters) {
@@ -133,13 +133,13 @@
 
     /**
      * Executes whatever valid Intro action is embedded in this Intro URL.
-     * 
+     *
      */
     @Override
 	public boolean execute() {
         final boolean[] result = new boolean[1];
         Display display = Display.getCurrent();
-        
+
         BusyIndicator.showWhile(display, () -> result[0] = doExecute());
         return result[0];
     }
@@ -189,7 +189,7 @@
             // the parameters and the standby state.
             return runAction(getParameter(KEY_PLUGIN_ID),
                 getParameter(KEY_CLASS), parameters, getParameter(KEY_STANDBY));
-        
+
         else if (action.equals(EXECUTE))
 			// execute a serialized command
 			return executeCommand(getParameter(KEY_COMAND), getParameter(KEY_STANDBY));
@@ -220,7 +220,7 @@
     /**
      * Sets the into part to standby, and shows the passed standby part, with
      * the given input. Forces the Intro view to open, if not yet created.
-     * 
+     *
      * @param partId
      * @param input
      */
@@ -248,10 +248,10 @@
 
     /**
 	 * Set the Workbench Intro Part state. Forces the Intro view to open, if not yet created.
-	 * 
+	 *
 	 * Historically this value was "true" (show standby) or "false" (show normal). In Neon we add
 	 * "close", "standby" and "launchbar".
-	 * 
+	 *
 	 * @param state
 	 * @return true if the intro was shown, or false if the intro could not be shown
 	 */
@@ -315,7 +315,7 @@
             return false;
         }
     }
-    
+
     /**
 	 * Executes a serialized <code>ParameterizedCommand</code>. Uses
 	 * {@link ICommandService#deserialize(String)} to convert the <code>command</code> argument
@@ -342,9 +342,9 @@
 			return false;
 		}
 	}
-    
+
     private ICommandService getCommandService() {
-		IWorkbench wb =	PlatformUI.getWorkbench(); 
+		IWorkbench wb =	PlatformUI.getWorkbench();
 		if (wb != null) {
 			Object serviceObject = wb.getAdapter(ICommandService.class);
 		    if (serviceObject != null) {
@@ -356,7 +356,7 @@
 	}
 
 	private IHandlerService getHandlerService() {
-		IWorkbench wb =	PlatformUI.getWorkbench(); 
+		IWorkbench wb =	PlatformUI.getWorkbench();
 		if (wb != null) {
 			Object serviceObject = wb.getAdapter(IHandlerService.class);
 		    if (serviceObject != null) {
@@ -475,7 +475,7 @@
 
     /**
      * Finds the target page and includes it in passed model.
-     * 
+     *
      * @param pageId
      * @return
      */
@@ -523,7 +523,7 @@
 
     /**
      * Searches all loaded models for the first page with the given id.
-     * 
+     *
      * @param pageId
      * @return
      */
@@ -541,7 +541,7 @@
 
     /**
      * Navigate foward in the presentation, whichever one it is.
-     * 
+     *
      * @return
      */
     private boolean navigate(String direction) {
@@ -577,7 +577,7 @@
      * Return a parameter defined in the Intro URL. Returns null if the
      * parameter is not defined. If this intro url has a decode=true parameter,
      * then all parameters are returned decoded using UTF-8.
-     * 
+     *
      * @param parameterId
      * @return
      */
@@ -633,7 +633,7 @@
 
     /**
      * Recreate the initial query passed to this URL.
-     * 
+     *
      * @return
      */
     private String retrieveInitialQuery() {
@@ -675,7 +675,7 @@
         Rectangle endBounds = Geometry.toDisplay(launchBar.getControl()
             .getParent(), launchBar.getControl().getBounds());
 
-		AnimationEngine.createTweakedAnimation(window.getShell(), 400, startBounds, endBounds); 
+		AnimationEngine.createTweakedAnimation(window.getShell(), 400, startBounds, endBounds);
         return true;
     }
 }
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/url/IntroURLParser.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/url/IntroURLParser.java
index 308d774..696a30d 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/url/IntroURLParser.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/url/IntroURLParser.java
@@ -97,7 +97,7 @@
      * Checks to see if tha passed URL is an Intro URL. An intro URL is an http
      * URL that has the intro plugin id as a host. eg:
      * "http://org.eclipse.ui.intro/test".
-     * 
+     *
      * @param url
      * @return true if url is an intro URL.
      */
@@ -136,7 +136,7 @@
     /**
      * Retruns the path attribute of the passed URL, stripped out of the leading
      * "/". Returns null if the url does not have a path.
-     * 
+     *
      * @param url
      * @return
      */
@@ -151,7 +151,7 @@
 
     /**
      * Retruns the Query part of the URL as an instance of a Properties class.
-     * 
+     *
      * @param url
      * @return
      */
@@ -176,7 +176,7 @@
                         + params[i]);
                 continue;
             }
-            
+
             String key = urlDecode(keyValuePair[0]);
 			if (key == null) {
 				Log.warning("Failed to URL decode key: " + keyValuePair[0]); //$NON-NLS-1$
@@ -188,7 +188,7 @@
 				Log.warning("Failed to URL decode value: " + keyValuePair[1]); //$NON-NLS-1$
 				continue;
 			}
-            
+
             properties.setProperty(key, value);
         }
         return properties;
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/BundleUtil.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/BundleUtil.java
index 0828fcc..24b75fa 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/BundleUtil.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/BundleUtil.java
@@ -60,7 +60,7 @@
 
     /**
      * Retrieves the given key from the bundle header.
-     * 
+     *
      * @param bundle
      * @param key
      * @return
@@ -78,7 +78,7 @@
 
     /**
      * Get the resourcelocation, but do not force an $nl$ on it.
-     * 
+     *
      * @param resource
      * @param element
      * @return
@@ -94,7 +94,7 @@
      * Returns the fully qualified location of the passed resource string from
      * the passed plugin id. If the file could not be loaded from the plugin,
      * the resource is returned as is.
-     * 
+     *
      * @param resource
      * @return
      */
@@ -107,7 +107,7 @@
 
     /**
      * Shorthand util method.
-     * 
+     *
      * @param resource
      * @return
      */
@@ -168,7 +168,7 @@
     				}
     			}
     		}
-    		
+
             // we need to resolve this URL.
             String copyResource = resource;
             if (forceNLResolve && !copyResource.startsWith(NL_TAG)) {
@@ -224,7 +224,7 @@
     /**
      * Get the absolute path of the given bundle, in the form
      * file:/path_to_plugin
-     * 
+     *
      * @param bundle
      * @return
      */
@@ -252,7 +252,7 @@
     /**
      * Get the absolute path of the bundle with id <code>bundleId</code>. If
      * no such bundle is found, return null.
-     * 
+     *
      * @param bundleId
      * @return
      */
@@ -262,12 +262,12 @@
             return null;
         return getResolvedBundleLocation(bundle);
     }
-    
+
     /*
      * Bug 126085 - need to fix up file: protocol
-     * to a form that IE7 understands (file:///). 
+     * to a form that IE7 understands (file:///).
      */
-    
+
     private static String toExternalForm(URL localURL) {
     	try {
     		localURL = FileLocator.toFileURL(localURL);
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/FindSupport.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/FindSupport.java
index 8a8622e..0de967c 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/FindSupport.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/FindSupport.java
@@ -44,21 +44,21 @@
 	}
 
 	/**
-	 * See doc on @link Platform#find(Bundle, IPath) Platform#find(Bundle, IPath) 
+	 * See doc on @link Platform#find(Bundle, IPath) Platform#find(Bundle, IPath)
 	 */
 	public static URL find(Bundle bundle, IPath path) {
 		return find(bundle, path, null);
 	}
 
     /**
-     * Proposed API for Platform in Eclispe 3.2. 
+     * Proposed API for Platform in Eclispe 3.2.
      * Same as @link #find(Bundle, IPath) except multiple entries can be
-     * returned if more than one entry matches the path in the host and 
+     * returned if more than one entry matches the path in the host and
      * any of its fragments.
-     * 
+     *
      * @param bundle
      * @param path
-     * @return an array of entries which match the given path.  An empty 
+     * @return an array of entries which match the given path.  An empty
      * array is returned if no matches are found.
      */
     public static URL[] findEntries(Bundle bundle, IPath path) {
@@ -69,7 +69,7 @@
 	 * Proposed API for Platform in Eclipse 3.2. Same as @link #find(Bundle, IPath) except multiple
 	 * entries can be returned if more than one entry matches the path in the host and any of its
 	 * fragments.
-	 * 
+	 *
 	 * @param bundle
 	 * @param path
 	 * @param override
@@ -83,12 +83,12 @@
     }
 
 	/**
-	 * See doc on @link Platform#find(Bundle, IPath, Map) Platform#find(Bundle, IPath, Map) 
+	 * See doc on @link Platform#find(Bundle, IPath, Map) Platform#find(Bundle, IPath, Map)
 	 */
 	public static URL find(Bundle b, IPath path, Map<String, String> override) {
         return find(b, path, override, null);
     }
- 
+
 	private static URL find(Bundle b, IPath path, Map<String, String> override, List<URL> multiple) {
 		if (path == null)
 			return null;
@@ -99,7 +99,7 @@
 		if (path.isEmpty() || path.isRoot()) {
 			// Watch for the root case.  It will produce a new
 			// URL which is only the root directory (and not the
-			// root of this plugin).	
+			// root of this plugin).
 			result = findInPlugin(b, Path.EMPTY, multiple);
 			if (result == null || multiple != null)
 				result = findInFragments(b, Path.EMPTY, multiple);
@@ -182,7 +182,7 @@
 			ws = Platform.getWS();
 		IPath filePath = new Path("ws").append(ws).append(path); //$NON-NLS-1$
 		// We know that there is only one segment to the ws path
-		// e.g. ws/win32	
+		// e.g. ws/win32
 		URL result = findInPlugin(b, filePath, multiple);
 		if (result != null && multiple == null)
 			return result;
@@ -252,7 +252,7 @@
 	}
 
 	/**
-	 * See doc on @link Platform#openStream(Bundle, IPath, boolean) Platform#Platform#openStream(Bundle, IPath, boolean) 
+	 * See doc on @link Platform#openStream(Bundle, IPath, boolean) Platform#Platform#openStream(Bundle, IPath, boolean)
 	 */
 	public static final InputStream openStream(Bundle bundle, IPath file, boolean localized) throws IOException {
 		URL url = null;
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/ModelUtil.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/ModelUtil.java
index d5198aa..2604229 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/ModelUtil.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/ModelUtil.java
@@ -65,7 +65,7 @@
      * yes, returns it as is. If no, treats it as a resource relative to the
      * declaring plugin. Return the plugin relative location, fully qualified.
      * Retruns null if the passed string itself is null.
-     * 
+     *
      * @param resource
      * @param pluginDesc
      * @return returns the URL as is if it had a protocol.
@@ -85,7 +85,7 @@
      * yes, returns it as is. If no, treats it as a resource relative to the
      * declaring plugin. Return the plugin relative location, fully qualified.
      * Retruns null if the passed string itself is null.
-     * 
+     *
      * @param resource
      * @param pluginDesc
      * @return returns the URL as is if it had a protocol.
@@ -138,7 +138,7 @@
 
 
     /*
-     * 
+     *
      * ******** XHTML DOM util methods *********************************
      */
 
@@ -226,7 +226,7 @@
 
     /**
      * Returns a reference to the body of the DOM.
-     * 
+     *
      * @param dom
      * @return
      */
@@ -291,7 +291,7 @@
     /**
      * Same as getElementsByTagName(Element parent, String tagName) but the
      * parent element is assumed to be the root of the document.
-     * 
+     *
      * @see getElementsByTagName(Element parent, String tagName)
      */
     public static Element[] getElementsByTagName(Document dom, String tagName) {
@@ -323,7 +323,7 @@
      */
     public static Element getElementById(Document dom, String id,
             String localElementName) {
-        
+
         NodeList children = dom.getElementsByTagNameNS("*", localElementName); //$NON-NLS-1$
         for (int i = 0; i < children.getLength(); i++) {
             Element element = (Element) children.item(i);
@@ -338,7 +338,7 @@
     public static Element getElementById(Document dom, String id) {
     	return getElementById(dom, id, "*"); //$NON-NLS-1$
     }
-    
+
     public static void updateResourceAttributes(Element element,
             AbstractIntroPage page) {
         updateResourceAttributes(element, page.getBase(), page.getBundle());
@@ -354,7 +354,7 @@
     /**
      * Updates all the resource attributes of the passed element to point to a
      * local resolved url.
-     * 
+     *
      * @param element
      * @param extensionContent
      */
@@ -424,7 +424,7 @@
 
     /**
      * Remove all instances of the element from the DOM.
-     * 
+     *
      */
     public static void removeAllElements(Document dom, String elementLocalName) {
         // get all elements in DOM and remove them.
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/viewer/IntroModelLabelProvider.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/viewer/IntroModelLabelProvider.java
index 3e6efba..feec88d 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/viewer/IntroModelLabelProvider.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/viewer/IntroModelLabelProvider.java
@@ -123,10 +123,10 @@
         case AbstractIntroElement.CONTAINER_EXTENSION:
             label = "Unresolved ConfigExtension: " //$NON-NLS-1$
                     + ((IntroExtensionContent) introElement).getPath();
-            break; 
+            break;
         case AbstractIntroElement.ANCHOR:
             label = "ANCHOR: " //$NON-NLS-1$
-                    + getPath(introElement.getParent(), ((IntroAnchor) introElement).getId()); 
+                    + getPath(introElement.getParent(), ((IntroAnchor) introElement).getId());
             break;
         case AbstractIntroElement.PAGE_TITLE:
             label = "Title: " //$NON-NLS-1$
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/parts/StandbyPart.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/parts/StandbyPart.java
index 80c57d3..24a0b47 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/parts/StandbyPart.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/parts/StandbyPart.java
@@ -54,7 +54,7 @@
  * Intro goes out of standby content mode, and the standby content parts are not
  * shown anymore until the user explicitly asks for a part again. This is
  * accomplished through a data flag on the CustomizableIntroPart control.
- * 
+ *
  */
 public class StandbyPart implements IIntroConstants {
 
@@ -124,7 +124,7 @@
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see org.eclipse.ui.intro.IIntroPart#saveState(org.eclipse.ui.IMemento)
      */
     private IMemento getMemento(IMemento memento, String key) {
@@ -174,7 +174,7 @@
 
     /**
      * Empty content part used as backup for failures.
-     * 
+     *
      */
     private void addAndShowEmptyPart(String message) {
         if (emptyPart == null)
@@ -186,7 +186,7 @@
 
     /**
      * Tries to create the last content part viewed, based on content part id..
-     * 
+     *
      * @param memento
      * @return
      */
@@ -204,7 +204,7 @@
     /**
      * Sets the into part to standby, and shows the passed standby part, with
      * the given input.
-     * 
+     *
      * @param partId
      * @param input
      */
@@ -258,7 +258,7 @@
      * the corresponding part id. This is needed to retrive the control of a
      * given standby part. The IMemento should be passed to the StandbyPart when
      * it is initialized.
-     * 
+     *
      * @param standbyContent
      */
     public Control addStandbyContentPart(String partId,
@@ -350,7 +350,7 @@
 
     /**
      * Calls dispose on all cached IStandbyContentParts.
-     * 
+     *
      */
     public void dispose() {
 		for (ControlKey controlKey : cachedContentParts.values()) {
@@ -365,7 +365,7 @@
      * subclass momento to also give the standby content part its own name
      * space. This was momentos saved by different content parts will not
      * conflict.
-     * 
+     *
      * @param memento
      *            the memento in which to store state information
      */
@@ -394,7 +394,7 @@
     /*
      * Set focus on the IStandbyContentPart that corresponds to the top control
      * in the stack.
-     * 
+     *
      * @see org.eclipse.ui.internal.intro.impl.parts.IStandbyContentPart#setFocus()
      */
     public void setFocus() {
@@ -410,7 +410,7 @@
     /**
      * Checks the standby cache stack if we have already created a similar
      * IStandbyContentPart. If not, returns null.
-     * 
+     *
      * @param standbyContent
      * @return
      */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/presentations/BrowserIntroPartImplementation.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/presentations/BrowserIntroPartImplementation.java
index 548829a..9707778 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/presentations/BrowserIntroPartImplementation.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/presentations/BrowserIntroPartImplementation.java
@@ -76,12 +76,12 @@
 public class BrowserIntroPartImplementation extends
         AbstractIntroPartImplementation implements IPropertyListener,
         IIntroContentProviderSite {
- 
+
 
     private final class ReduceAction extends Action {
 
 		{
-            setToolTipText(Messages.Browser_reduce_tooltip); 
+            setToolTipText(Messages.Browser_reduce_tooltip);
             setImageDescriptor(ImageUtil
                 .createImageDescriptor("full/elcl16/reduce_font.gif")); //$NON-NLS-1$
             setDisabledImageDescriptor(ImageUtil
@@ -101,7 +101,7 @@
 	private final class MagnifyAction extends Action {
 
 		{
-            setToolTipText(Messages.Browser_magnify_tooltip); 
+            setToolTipText(Messages.Browser_magnify_tooltip);
             setImageDescriptor(ImageUtil
                 .createImageDescriptor("full/elcl16/magnify_font.gif")); //$NON-NLS-1$
             setDisabledImageDescriptor(ImageUtil
@@ -120,14 +120,14 @@
 
 	private static final int SCALE_INCREMENT = 20;
 
-	// the browser widget that will display the intro content 
+	// the browser widget that will display the intro content
     protected Browser browser = null;
 
     // the HTML generator used to generate dynamic content
     private IntroHTMLGenerator htmlGenerator = null;
-    
+
     private String savedContent = null;
-     
+
     private Action openBrowserAction = new Action() {
 
         {
@@ -143,19 +143,19 @@
 			try {
 				tempFile = File.createTempFile("intro",".html"); //$NON-NLS-1$//$NON-NLS-2$
             	tempFile.deleteOnExit();
-            	BufferedWriter out = new BufferedWriter(new 
+            	BufferedWriter out = new BufferedWriter(new
             			FileWriter(tempFile));
-            	out.write(savedContent);	
+            	out.write(savedContent);
             	out.close();
             	IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
     			IWebBrowser browser =  support.getExternalBrowser();
     			browser.openURL(tempFile.toURI().toURL());
 			} catch (IOException e) {
 			} catch (PartInitException e) {
-			}  
+			}
         }
-    }; 
-    
+    };
+
     private void restartIntro() {
 		IIntroManager manager = PlatformUI.getWorkbench().getIntroManager();
 		IIntroPart part = manager.getIntro();
@@ -255,7 +255,7 @@
             browser.setText(Messages.Browser_invalidConfig);
             return;
         }
-        
+
          // root page is what decides if the model is dynamic or not.
         if (getModel().isDynamic())
             handleDynamicIntro();
@@ -306,7 +306,7 @@
      * Generate dynamic HTML for the provided page, and set it in the browser
      * widget. A cache is used for performance and for having a correct dynamic
      * content life cycle. This method also updates the navigation history.
-     * 
+     *
      * @param page
      *            the page to generate HTML for
      */
@@ -385,7 +385,7 @@
             if (IntroPlugin.DEBUG_TOOLBAR) {
             	savedContent = content;
             }
-            
+
         }
         return success;
     }
@@ -421,7 +421,7 @@
         reinjectDynamicContent(dom, contentProviderElements);
         return content;
     }
-    
+
     private String generateDoctype(boolean strict) {
     	StringWriter swriter = new StringWriter();
     	PrintWriter writer = new PrintWriter(swriter);
@@ -431,7 +431,7 @@
     	}
     	else {
     		writer.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\""); //$NON-NLS-1$
-    		writer.println("\t\t\t\"http://www.w3.org/TR/html4/loose.dtd\">"); //$NON-NLS-1$    		
+    		writer.println("\t\t\t\"http://www.w3.org/TR/html4/loose.dtd\">"); //$NON-NLS-1$
     	}
     	writer.close();
     	return swriter.toString();
@@ -509,7 +509,7 @@
 
     /**
      * Return the cached IntroHTMLGenerator
-     * 
+     *
      * @return
      */
     private IntroHTMLGenerator getHTMLGenerator() {
@@ -538,7 +538,7 @@
         toolBarManager.add(forwardAction);
         toolBarManager.update(true);
         IntroTheme theme = getModel().getTheme();
-        boolean createZoomButtons = theme != null && theme.isScalable() && !resizeActionsAdded 
+        boolean createZoomButtons = theme != null && theme.isScalable() && !resizeActionsAdded
 		    &&FontSelection.FONT_RELATIVE.equals(FontSelection.getFontStyle());
         if (createZoomButtons) {
             toolBarManager.add(new ReduceAction());
@@ -589,7 +589,7 @@
     /**
      * Handle model property changes. Property listeners are only added in the
      * dynamic case.
-     * 
+     *
      * @see org.eclipse.ui.IPropertyListener#propertyChanged(java.lang.Object,
      *      int)
      */
@@ -623,7 +623,7 @@
     }
 
     /**
-     * 
+     *
      * @see org.eclipse.ui.internal.intro.impl.model.AbstractIntroPartImplementation#reflow()
      */
     @Override
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/presentations/FormIntroPartImplementation.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/presentations/FormIntroPartImplementation.java
index 44b1250..30672b6 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/presentations/FormIntroPartImplementation.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/presentations/FormIntroPartImplementation.java
@@ -148,7 +148,7 @@
      * holds the home page, and one that holds all other pages. If the
      * presentation is configured to not show the home page with the Home Page
      * layout, then this page book will only have one page.
-     * 
+     *
      * @param toolkit
      * @param form
      * @return
@@ -230,7 +230,7 @@
      * Handle model property changes. The UI is notified here of a change to the
      * current page in the model. This happens if an intro URL showPage method
      * is executed.
-     * 
+     *
      * @see org.eclipse.ui.IPropertyListener#propertyChanged(java.lang.Object,
      *      int)
      */
@@ -378,7 +378,7 @@
      * form from the correct pagebook that refers to the page we need to
      * refresh. This will force a call to createContents on all content
      * providers the next time this page needs to be displayed.
-     * 
+     *
      * @see org.eclipse.ui.intro.config.IIntroContentProviderSite#reflow(org.eclipse.ui.intro.config.IIntroContentProvider,
      *      boolean)
      */
@@ -392,14 +392,14 @@
             else if (pageFormWithNav.hasPage(page.getId()))
                 pageFormWithNav.reflow();
             else if (mainPageBook.hasPage(page.getId()))
-                mainPageBook.reflow(true);        	
+                mainPageBook.reflow(true);
         }
         else {
         	removeCachedPage(page);
         	showPage(model.getCurrentPage());
         }
     }
-    
+
     @Override
 	public void setFocus() {
         if (model.isDynamic()) {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/presentations/IntroLaunchBar.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/presentations/IntroLaunchBar.java
index 29891fd..6dc3bab 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/presentations/IntroLaunchBar.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/presentations/IntroLaunchBar.java
@@ -3,7 +3,7 @@
  * accompanying materials are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors: IBM Corporation - initial API and implementation
  * Lars Vogel <Lars.Vogel@vogella.com> - Bug 440136
  **************************************************************************************************/
@@ -68,10 +68,10 @@
  * This class is responsible for creating the intro launch bar in the provided parent. It creates
  * 'restore' and 'close' actions, as well as actions for each shortcut element contributed in the
  * extension point.
- * 
+ *
  * Reimplemented as an E4 MToolControl for 4.x. Ideally the intro configuration information would be
  * available from the application IEclipseContext.
- * 
+ *
  * @since 3.1
  */
 public class IntroLaunchBar {
@@ -97,7 +97,7 @@
 	private IntroLaunchBarElement element;
 
 	protected boolean simple;
-	
+
 	@Inject
 	@Optional
 	private IntroTheme theme;
@@ -178,7 +178,7 @@
 
 	/**
 	 * Install the Intro Launch Bar into the provided window.
-	 * 
+	 *
 	 * @param window
 	 *            the window to host the launch bar
 	 * @param modelRoot
@@ -191,7 +191,7 @@
 			IntroLaunchBarElement element) {
 		EModelService modelService = (EModelService) window.getService(EModelService.class);
 		MTrimmedWindow trimmedWindow = (MTrimmedWindow) window.getService(MTrimmedWindow.class);
-		
+
 		MToolControl trimControl = modelService.createModelElement(MToolControl.class);
 		trimControl.setElementId(LAUNCHBAR_ID);
 		trimControl.setContributionURI(BUNDLECLASS_URI);
@@ -212,7 +212,7 @@
 	 * Remove all traces of any launch bars found in the model. Required on startup as the
 	 * {@linkplain IntroLaunchBar} instances may not be have been rendered yet and so are
 	 * disconnected from the {@link IntroPlugin}'s state.
-	 * 
+	 *
 	 * @param workbench
 	 *            the workbench to process
 	 */
@@ -298,11 +298,11 @@
 	/**
 	 * Not supported anymore as of the removal of the presentation API
 	 * TODO remove usage, see Bug 446171
-	 * 
+	 *
 	 * @return
 	 */
 	protected boolean isPlain() {
-		return true; 
+		return true;
 	}
 
 	public void createControl(Composite parent) {
@@ -478,7 +478,7 @@
 			}
 		}
 	}
-	
+
 	private String resolveColor(String value) {
 		if (value.indexOf('$')== -1)
 			return value;
@@ -642,7 +642,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.ui.internal.IWindowTrim#getId()
 	 */
 	public String getId() {
@@ -651,7 +651,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.ui.internal.IWindowTrim#getDisplayName()
 	 */
 	public String getDisplayName() {
@@ -660,7 +660,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.ui.internal.IWindowTrim#isCloseable()
 	 */
 	public boolean isCloseable() {
@@ -669,7 +669,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.ui.internal.IWindowTrim#handleClose()
 	 */
 	public void handleClose() {
@@ -678,7 +678,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.ui.IWindowTrim#getWidthHint()
 	 */
 	public int getWidthHint() {
@@ -687,7 +687,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.ui.IWindowTrim#getHeightHint()
 	 */
 	public int getHeightHint() {
@@ -696,7 +696,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.ui.IWindowTrim#isResizeable()
 	 */
 	public boolean isResizeable() {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageContentForm.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageContentForm.java
index 6e918e1..838fbc9 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageContentForm.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageContentForm.java
@@ -60,7 +60,7 @@
      * Create the form for the root page. Number of columns there is equal to
      * the number of links. Every image link does not cache a model object for
      * data retrieval..
-     * 
+     *
      * @param pageBook
      */
     public void createPartControl(ScrolledPageBook contentPageBook,
@@ -113,11 +113,11 @@
     /**
      * Creates a composite with TableWrapLayout to hold all page children. The
      * default number of columns is 1.
-     * 
+     *
      * @param parent
      * @return
      */
-    static Composite createPageTableComposite(PageWidgetFactory factory, FormToolkit toolkit, 
+    static Composite createPageTableComposite(PageWidgetFactory factory, FormToolkit toolkit,
     		PageStyleManager styleManager, Composite parent) {
         Composite client = toolkit.createComposite(parent);
         TableWrapLayout layout = new TableWrapLayout();
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageForm.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageForm.java
index 4f010fd..5d1d2b3 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageForm.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageForm.java
@@ -79,7 +79,7 @@
     };
 
     /**
-     * 
+     *
      */
     public PageForm(FormToolkit toolkit, IntroModelRoot modelRoot,
             Form parentForm) {
@@ -90,7 +90,7 @@
 
     /**
      * Create a Form for holding pages without navigation.
-     * 
+     *
      * @param pageBook
      */
     public void createPartControl(ScrolledPageBook mainPageBook,
@@ -129,7 +129,7 @@
      * This method is called when the current page changes. It creates the
      * PageContentForm if necessary, and handles showing the page in the Page
      * Book. It creates a model PageContentForm for the current page.
-     * 
+     *
      * @param pageID
      */
     public void showPage(AbstractIntroPage page,
@@ -159,7 +159,7 @@
         // a few methods like 'setFocus()' etc.
         // DG
     }
-    
+
     public void reflow() {
     	categoryPageBook.reflow(true);
     }
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageFormWithNavigation.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageFormWithNavigation.java
index cf7dd3e..1b1a59c 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageFormWithNavigation.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageFormWithNavigation.java
@@ -40,7 +40,7 @@
 
 
     /**
-     * 
+     *
      */
     public PageFormWithNavigation(FormToolkit toolkit,
             IntroModelRoot modelRoot, Form parentForm) {
@@ -49,7 +49,7 @@
 
     /**
      * Extend parent behavior and add navigation.
-     * 
+     *
      * @param pageBook
      */
     @Override
@@ -100,7 +100,7 @@
 
     /**
      * Creates an Image Hyperlink from an IntroLink. Model object is NOT cached.
-     * 
+     *
      * @param body
      * @param link
      */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageStyleManager.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageStyleManager.java
index 8127c2e..f34a813 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageStyleManager.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageStyleManager.java
@@ -49,14 +49,14 @@
      * is retrieved from the page model class. The default properties are
      * assumed to be the presentation shared properties. The inherrited
      * properties are properties that we got from included and extension styles.
-     * 
+     *
      * @param modelRoot
      */
     public PageStyleManager(AbstractIntroPage page, Properties sharedProperties) {
         this.page = page;
         context = new StyleContext();
         context.bundle = page.getBundle();
-        
+
         // honor shared-style.
         if (page.injectSharedStyle())
             properties = new Properties(sharedProperties);
@@ -115,7 +115,7 @@
      * current pages style. If the given key is not found, the pageId is trimmed
      * from the begining of the key, and the key is looked up again. If key does
      * not start with a pageId, lookup only the key as is.
-     * 
+     *
      * @param key
      * @return
      */
@@ -138,11 +138,11 @@
     /**
      * Finds the context from which this key was loaded. If the key is not from
      * an inherited alt style, then use the context corresponding to this page.
-     * 
+     *
      * @param key
      * @return
      */
-   
+
     @Override
 	protected StyleContext getAssociatedContext(String key) {
         Properties aProperties = findPropertyOwner(key);
@@ -167,7 +167,7 @@
     public int getNumberOfColumns(IntroGroup group) {
         return getIntProperty(group, ".layout.ncolumns", 0); //$NON-NLS-1$
     }
-    
+
     public boolean getEqualWidth(IntroGroup group) {
     	return getBooleanProperty(group, ".layout.equalWidth", false); //$NON-NLS-1$
     }
@@ -204,7 +204,7 @@
         String key = buff.append(qualifier).toString();
         return getIntProperty(key, defaultValue);
     }
-    
+
     private boolean getBooleanProperty(AbstractBaseIntroElement element,
             String qualifier, boolean defaultValue) {
         StringBuffer buff = ModelLoaderUtil.createPathToElementKey(element, true);
@@ -227,7 +227,7 @@
         }
         return intValue;
     }
-    
+
     private boolean getBooleanProperty(String key, boolean defaultValue) {
         boolean booleanValue = defaultValue;
         String value = getProperty(key);
@@ -245,9 +245,9 @@
      * element>
      * </p>
      * If not found, use the default description style.
-     * 
+     *
      * Returns null if no default style found, or any id in path is null.
-     * 
+     *
      * @param group
      * @return
      */
@@ -267,9 +267,9 @@
      * <pageId>.description-id= <id of child description Text element>
      * </p>
      * If not found, use the default description style.
-     * 
+     *
      * Returns null if no default style found, or any id in path is null.
-     * 
+     *
      * @param group
      * @return
      */
@@ -302,7 +302,7 @@
      * <pageId>.description-id= <id of child description Text element>
      * </p>
      * If not found, use the default description style.
-     * 
+     *
      * @param group
      * @return
      */
@@ -333,7 +333,7 @@
 
     /**
      * Returns the first direct child text element with the given style-id.
-     * 
+     *
      * @return
      */
     private String findTextFromStyleId(AbstractIntroContainer parent,
@@ -355,7 +355,7 @@
     /**
      * Util method to check model type, and filter model element out if it is of
      * the correct type.
-     * 
+     *
      * @param element
      */
     private AbstractIntroElement makeFiltered(AbstractIntroElement element) {
@@ -398,7 +398,7 @@
         String key = buff.append(".font.fg").toString(); //$NON-NLS-1$
         return getColor(toolkit, key);
     }
-    
+
     public Color getBackgrond(FormToolkit toolkit, AbstractBaseIntroElement element) {
         StringBuffer buff = ModelLoaderUtil.createPathToElementKey(element, true);
         if (buff == null)
@@ -431,7 +431,7 @@
         }
         return false;
     }
-    
+
     private String getPropertyValue(AbstractIntroIdElement element, String suffix) {
         StringBuffer buff = ModelLoaderUtil.createPathToElementKey(element, true);
         if (buff != null) {
@@ -461,7 +461,7 @@
     /**
      * Retrieves an image for a link in a page. If not found, uses the page's
      * default link image. If still not found, uses the passed default.
-     * 
+     *
      * @param link
      * @param qualifier
      * @return
@@ -502,7 +502,7 @@
         buff.append(qualifier);
         return buff.toString();
     }
-    
+
     private String createImageByIdKey(AbstractIntroPage page, IntroLink link,
             String qualifier) {
     	if (link==null || link.getId()==null)
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageWidgetFactory.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageWidgetFactory.java
index 68f6e12..c0bfde6 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageWidgetFactory.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/PageWidgetFactory.java
@@ -174,7 +174,7 @@
             c = createSeparator(parent, sep);
             updateLayoutData(c, element);
             break;
-        	
+
         default:
             break;
         }
@@ -238,7 +238,7 @@
 
     /**
      * Creates an Image Hyperlink from an IntroLink. Model object is NOT cached.
-     * 
+     *
      * @param body
      * @param link
      */
@@ -306,7 +306,7 @@
 
     /**
      * Creates a forms Text or FormattedText.
-     * 
+     *
      * @param body
      * @param link
      */
@@ -366,7 +366,7 @@
         }
         return ilabel;
     }
-    
+
     public Control createContentProvider(Composite parent,
             IntroContentProvider provider) {
         // If we've already loaded the content provider for this element,
@@ -411,7 +411,7 @@
         }
         return container;
     }
-    
+
     protected Control createSeparator(Composite parent, IntroSeparator sep) {
     	String key = sep.getParentPage().getId()+".separator.fg"; //$NON-NLS-1$
         Color fg = styleManager.getColor(toolkit, key);
@@ -462,7 +462,7 @@
 
     /**
      * Will be only called for non formatted text.
-     * 
+     *
      * @param text
      * @return
      */
@@ -481,7 +481,7 @@
     /**
      * Check the filter state of the element. Only base elements have the filter
      * attribute.
-     * 
+     *
      * @param element
      * @return
      */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/RootPageForm.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/RootPageForm.java
index 4915324..18f01b6 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/RootPageForm.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/RootPageForm.java
@@ -155,7 +155,7 @@
     };
 
     /**
-     * 
+     *
      */
     public RootPageForm(FormToolkit toolkit, IntroModelRoot modelRoot,
             Form parentForm) {
@@ -167,7 +167,7 @@
     /**
      * Create the form for the root page. Number of columns there is equal to
      * the number of links.
-     * 
+     *
      * @param pageBook
      */
     public void createPartControl(ScrolledPageBook mainPageBook,
@@ -277,7 +277,7 @@
     /**
      * Creates an Image Hyperlink from an IntroLink. Model object is cached in
      * link.
-     * 
+     *
      * @param body
      * @param link
      */
@@ -318,7 +318,7 @@
     /**
      * Creates a label to display the link description when you hover over a
      * hyperlink.
-     * 
+     *
      * @param body
      */
     private Label createHoverLabel(Composite body) {
@@ -333,7 +333,7 @@
         label.setFont(PageStyleManager.getBannerFont());
         return label;
     }
-    
+
     private void createContentProvider(Composite parent, IntroContentProvider providerElement) {
     	if (factory==null) {
     		factory = new PageWidgetFactory(toolkit, rootPageStyleManager);
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/SharedStyleManager.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/SharedStyleManager.java
index 8bb40f1..9a42551 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/SharedStyleManager.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/swt/SharedStyleManager.java
@@ -30,7 +30,7 @@
 
     protected Properties properties;
     protected StyleContext context;
-    
+
     class StyleContext {
     	IPath path;
     	Bundle bundle;
@@ -44,7 +44,7 @@
     /**
      * Constructor used when shared styles need to be loaded. The bundle is
      * retrieved from the model root.
-     * 
+     *
      * @param modelRoot
      */
     public SharedStyleManager(IntroModelRoot modelRoot) {
@@ -67,7 +67,7 @@
             InputStream is = styleURL.openStream();
             properties.load(is);
             is.close();
-           	context.path = new Path(style).removeLastSegments(1); 
+           	context.path = new Path(style).removeLastSegments(1);
             String t = (String)properties.get("theme"); //$NON-NLS-1$
             if (t!=null && t.trim().equalsIgnoreCase("true")) //$NON-NLS-1$
             	context.inTheme = true;
@@ -79,7 +79,7 @@
 
     /**
      * Get the property from the shared properties.
-     * 
+     *
      * @param key
      * @return
      */
@@ -110,7 +110,7 @@
      * A utility method that creates RGB object from a value encoded in the
      * following format: #rrggbb, where r, g and b are hex color values in the
      * range from 00 to ff.
-     * 
+     *
      * @param value
      * @return
      */
@@ -135,14 +135,14 @@
     /**
      * Finds the bundle from which this key was loaded. This is the bundle from
      * which shared styles where loaded.
-     * 
+     *
      * @param key
      * @return
      */
     protected Bundle getAssociatedBundle(String key) {
         return context.bundle;
     }
-    
+
     protected StyleContext getAssociatedContext(String key) {
     	return context;
     }
@@ -158,8 +158,8 @@
 
 
     /**
-     * 
-     * 
+     *
+     *
      * @param toolkit
      * @param key
      * @return color. May return null.
@@ -179,7 +179,7 @@
 
     /**
      * Retrieve an image from this page's properties, given a key.
-     * 
+     *
      * @param key
      * @param defaultPageKey
      * @param defaultKey
@@ -200,7 +200,7 @@
             if (ccontext.inTheme) {
             	// if 'theme' key is set, load image
             	// relative to the file, not relative to the bundle
-            	ImageUtil.registerImage(currentKey, ccontext.path, value); 
+            	ImageUtil.registerImage(currentKey, ccontext.path, value);
             }
             else {
             	Bundle bundle = ccontext.bundle;
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/ImageUtil.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/ImageUtil.java
index 169befa..30f628c 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/ImageUtil.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/ImageUtil.java
@@ -48,7 +48,7 @@
     public static final String INTRO_MODEL_LEAF = "leaf"; //$NON-NLS-1$
     public static final String INTRO_MODEL_CONTAINER = "container"; //$NON-NLS-1$
     public static final String OPEN_ITNRO_VIEW = "introView"; //$NON-NLS-1$
-    
+
     public static final String CONFIG_EXTENSION = "configExtension";//$NON-NLS-1$
 
     // Image location
@@ -56,7 +56,7 @@
 
     /**
      * Convenience method to create an image descriptor from the Intro plugin.
-     * 
+     *
      * Method assumes that images are under the "icons" directory, so don't
      * append that directory name for "imageName".
      */
@@ -64,10 +64,10 @@
         return createImageDescriptor(Platform
             .getBundle(IIntroConstants.PLUGIN_ID), ICONS_PATH + imageName);
     }
-    
+
     /**
      * Convenience method to create an image descriptor.
-     * 
+     *
      */
     public static ImageDescriptor createImageDescriptor(Bundle bundle,
             String imageName) {
@@ -85,10 +85,10 @@
                 + " in bundle: " + bundle.getSymbolicName()); //$NON-NLS-1$
         return ImageDescriptor.getMissingImageDescriptor();
     }
-    
+
     /**
      * Convenience method to create an image descriptor.
-     * 
+     *
      */
     public static ImageDescriptor createImageDescriptor(IPath base,
             String imageName) {
@@ -108,7 +108,7 @@
 
     /**
      * Convenience method to create an image from the Intro plugin.
-     * 
+     *
      * Method assumes that images are under the "icons" directory, so don't
      * append that directory name for "imageName".
      */
@@ -125,7 +125,7 @@
 
     /**
      * Util method for image re-use in Intro Plugin.
-     * 
+     *
      * @param key
      * @return
      */
@@ -145,7 +145,7 @@
     /**
      * Register an image descriptor in the Intro Plugin image registry. Has no
      * effect if the key has already been registered.
-     * 
+     *
      * @param key
      * @param imageName
      */
@@ -165,7 +165,7 @@
             return;
         registry.put(key, createImageDescriptor(bundle, imageName));
     }
-    
+
     public static void registerImage(String key, IPath base, String imageName) {
         ImageRegistry registry = IntroPlugin.getDefault().getVolatileImageRegistry();
         if (registry.getDescriptor(key) != null)
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/IntroEvaluationContext.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/IntroEvaluationContext.java
index 5dfeaee..b6b5ea3 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/IntroEvaluationContext.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/IntroEvaluationContext.java
@@ -22,9 +22,9 @@
 
 	private static final String VARIABLE_PLATFORM = "platform"; //$NON-NLS-1$
 	private static final String VARIABLE_WORKBENCH = "workbench"; //$NON-NLS-1$
-	
+
 	private static EvaluationContext context;
-	
+
 	/*
 	 * Returns the evaluation context to use in intro documents.
 	 */
@@ -36,7 +36,7 @@
 		}
 		return context;
 	}
-	
+
 	/*
 	 * Not meant to be instantiated.
 	 */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/IntroModelSerializer.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/IntroModelSerializer.java
index f9a51db..9db6968 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/IntroModelSerializer.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/IntroModelSerializer.java
@@ -42,7 +42,7 @@
     public IntroModelSerializer(IntroModelRoot root) {
         this(root, false);
     }
-    
+
     public IntroModelSerializer(IntroModelRoot root, boolean filter) {
         this.buffer = new StringBuffer();
         this.filter = filter;
@@ -73,7 +73,7 @@
         }
         return url;
     }
-    
+
     private void printModelRootInfo(IntroModelRoot model, StringBuffer text) {
         text.append("\nIntro Model Content:"); //$NON-NLS-1$
         text.append("\n======================"); //$NON-NLS-1$
@@ -224,7 +224,7 @@
         text.append(indent + "alt = " + image.getAlt()); //$NON-NLS-1$
         text.append(indent + "style-id = " + image.getStyleId()); //$NON-NLS-1$
     }
-    
+
     private void printSeparator(StringBuffer text, IntroSeparator sep, String indent) {
         text.append(indent + "HR: id = " + sep.getId()); //$NON-NLS-1$
         indent = indent + "\t\t"; //$NON-NLS-1$
@@ -282,7 +282,7 @@
 
     /**
      * Appends a given page's categories to the Text buffer.
-     * 
+     *
      * @param text
      */
     private void printPages(IntroPage[] pages, StringBuffer text) {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/Log.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/Log.java
index f7754c4..4a32fff 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/Log.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/Log.java
@@ -25,7 +25,7 @@
  * mode. Info messages are only logged when the /trace/logInfo debug option is
  * set to true. Performance reports are only logged when /trace/performance is
  * set to true.
- * 
+ *
  */
 public class Log implements IIntroConstants {
 
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/ReopenUtil.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/ReopenUtil.java
index f99665a..1bdd587 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/ReopenUtil.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/ReopenUtil.java
@@ -25,33 +25,33 @@
 import org.eclipse.ui.internal.intro.impl.IntroPlugin;
 
 /**
- * Utility class which manages the pseudo preference which determines whether 
+ * Utility class which manages the pseudo preference which determines whether
  * Intro should always open on startup
  */
 
 public class ReopenUtil {
-	
+
 	private static final String STATE = "state"; //$NON-NLS-1$
 	private static final String REOPEN = "reopen"; //$NON-NLS-1$
 
 	public static boolean isReopenPreferenceInitialized() {
 		return readMemento() != null;
 	}
-	
+
 	public static void setReopenPreference(boolean reopen) {
-		XMLMemento memento = XMLMemento.createWriteRoot(STATE); 
-		memento.putBoolean(REOPEN, reopen); 
+		XMLMemento memento = XMLMemento.createWriteRoot(STATE);
+		memento.putBoolean(REOPEN, reopen);
 		saveMemento(memento);
 	}
-	
+
 	public static boolean isReopenPreference() {
 		XMLMemento memento = readMemento();
 		if (memento == null) {
 			return false;
 		}
-		return memento.getBoolean(REOPEN).booleanValue(); 
+		return memento.getBoolean(REOPEN).booleanValue();
 	}
-	
+
 	private static XMLMemento readMemento() {
 		XMLMemento memento;
 		InputStreamReader reader = null;
@@ -64,7 +64,7 @@
 			reader = new InputStreamReader(input, StandardCharsets.UTF_8);
 			memento = XMLMemento.createReadRoot(reader);
 
-			
+
 		} catch (FileNotFoundException e) {
 			memento = null;
 			// Do nothing, the file will not exist the first time the workbench in used.
@@ -96,7 +96,7 @@
 				if (writer != null)
 					writer.close();
 			} catch (IOException e) {
-				
+
 			}
 		}
 	}
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/StringUtil.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/StringUtil.java
index b1add5d..e0e0d27 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/StringUtil.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/StringUtil.java
@@ -69,16 +69,16 @@
 	public static String decode(String s, String enc) throws UnsupportedEncodingException {
 		try {
 			return URLDecoder.decode(s, enc);
-		} 
+		}
 		catch (Exception ex) {
 			// fall back to original string
 			return s;
 		}
 	}
-	
+
     // Removes leading and trailing whitespace and replaces other
-    // occurrences with a single space. 
-	
+    // occurrences with a single space.
+
 	public static String normalizeWhiteSpace(String input) {
 		if (input == null) {
 			return null;
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/Util.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/Util.java
index 0909345..d93f3a1 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/Util.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/util/Util.java
@@ -72,7 +72,7 @@
     /**
      * Utility method that will add a debug listener to the given control. All
      * common events are added.
-     * 
+     *
      * @param control
      * @return
      */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/CustomizableIntroPart.java b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/CustomizableIntroPart.java
index 1a07fae..aac3053 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/CustomizableIntroPart.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/CustomizableIntroPart.java
@@ -62,12 +62,12 @@
  * creation on load, and leaves restoring state to content part. Same with
  * saving state. The memento is passed shortly before shutdown to enable storing
  * of part specific data.
- * 
+ *
  * Note: This class was made public for re-use, as-is, as a valid class for the
  * <code>org.eclipse.ui.intro</code> extension point. It is not intended to be
  * subclassed or used otherwise.
  * </p>
- * 
+ *
  * @since 3.0
  */
 
@@ -155,7 +155,7 @@
             boolean startAtHomePage = ReopenUtil.isReopenPreference();
 			if (startAtHomePage) {
     			PlatformUI.getPreferenceStore().setValue(
-    	        		IWorkbenchPreferenceConstants.SHOW_INTRO, true);	
+    	        		IWorkbenchPreferenceConstants.SHOW_INTRO, true);
     			memento = null;
     		}
             // we have a valid config contribution, get presentation. Make sure
@@ -186,7 +186,7 @@
 
     /**
      * Creates the UI based on how the InroPart has been configured.
-     * 
+     *
      * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
      */
     @Override
@@ -217,7 +217,7 @@
      * Determine if we need to recreate a standby part. Return true if we have a
      * standby part memento that is not for the empty part AND stangby memento
      * has been tagged for restore, ie: it was open when workbench closed.
-     * 
+     *
      * @param memento
      * @return <code>true</code> if we need to recreate a standby part
      */
@@ -242,7 +242,7 @@
     /*
      * Handled state changes. Recreates the standby part if workbench was shut
      * down with one.
-     * 
+     *
      * @see org.eclipse.ui.IIntroPart#standbyStateChanged(boolean)
      */
     @Override
@@ -282,7 +282,7 @@
      * cases. This basically overrides the workbench behavior of Standby/normal
      * states. The design here is that if the showStandbyPart flag is set, then
      * we always need to show the standby part.
-     * 
+     *
      * @return <code>true</code> if we need to show the standby part
      */
     private boolean isStandbyPartNeeded() {
@@ -368,7 +368,7 @@
 
     /**
      * Returns the primary control associated with this Intro part.
-     * 
+     *
      * @return the SWT control which displays this Intro part's content, or
      *         <code>null</code> if this standby part's controls have not yet
      *         been created.
@@ -413,7 +413,7 @@
 
     /**
      * Support dynamic awarness.
-     * 
+     *
      * @see org.eclipse.core.runtime.IRegistryChangeListener#registryChanged(org.eclipse.core.runtime.IRegistryChangeEvent)
      */
     @Override
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroAction.java b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroAction.java
index 20eed68..4729aa6 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroAction.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroAction.java
@@ -21,7 +21,7 @@
  * <p>
  * http://org.eclipse.ui.intro/runAction?pluginId=x.y.z&class=x.y.z.someClass
  * </p>
- * 
+ *
  * @since 3.0
  */
 public interface IIntroAction {
@@ -29,7 +29,7 @@
     /**
      * Called to run this intro command. The properties represents the key=value
      * pairs extracted from the intro URL query.
-     * 
+     *
      * @param site
      * @param params
      */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroContentProvider.java b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroContentProvider.java
index 507e3ff..aef621e 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroContentProvider.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroContentProvider.java
@@ -25,14 +25,14 @@
  * <ul>
  * <li>a content provider is defined in the Intro content markup file (ie:
  * introContent.xml file) as follows:
- * 
+ *
  * <p>
  * &lt;contentProvider id=&quot;roles&quot;
  * class=&quot;x.y.z.ContentProvider&quot;&gt; <br>
  * &lt;text&gt;Some alternate text for dynamic content&lt;/text&gt; <br>
  * &lt;/contentProvider&gt;
  * </p>
- * 
+ *
  * This defines the content provider as part of the intro content for that page.
  * </li>
  * <li>the content provider class is created when the page that contains this
@@ -58,7 +58,7 @@
  * when the appropriate event happens.
  * <li>finally, when the intro view is closed, dispose will be called on the
  * content provider to give it a chance to dispose of any resources.</li>
- * 
+ *
  * @since 3.0.1
  */
 public interface IIntroContentProvider {
@@ -66,7 +66,7 @@
      * Initializes the content provider. An IIntroContentProviderSite is passed,
      * which will be called on to recompute or layout the content when the
      * content becomes stale.
-     * 
+     *
      * @param site
      *            the site of this IIntroContentProvider
      */
@@ -77,7 +77,7 @@
      * Creates HTML content in the provided PrintWriter. This content will be
      * included in the generated HTML page when embedded HTML widget is used to
      * render intro content.
-     * 
+     *
      * @param id
      *            the unique identifier of the content element. The same content
      *            provider class can be reused for several elements and the id
@@ -90,7 +90,7 @@
     /**
      * Creates SWT content in the provided Composite. This method is called when
      * Eclipse Forms are used to render intro content.
-     * 
+     *
      * @param id
      *            the unique identifier of the content element
      * @param parent
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroContentProviderSite.java b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroContentProviderSite.java
index 3a5326e..833ece4 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroContentProviderSite.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroContentProviderSite.java
@@ -19,7 +19,7 @@
  * reflow.
  * <p>
  * This interface is not intended to be implemented or extended by clients.
- * 
+ *
  * @since 3.0.1
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -30,7 +30,7 @@
      * that its content has become stale. For an HTML presentation, the whole
      * page should be regenerated. An SWT presentation should cause the page's
      * layout to be updated.
-     * 
+     *
      * @param provider
      *            the content provider that requests a reflow
      * @param incremental
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroURL.java b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroURL.java
index e4677a7..84d1fb9 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroURL.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroURL.java
@@ -33,7 +33,7 @@
  * There is a number of supported Intro commands. Check docs for more details.
  * Calling execute runs the command if it is one of the supported commands.
  * </p>
- * 
+ *
  * @see IntroURLFactory
  * @see IIntroAction
  * @since 3.0
@@ -45,7 +45,7 @@
     /**
      * Executes whatever valid Intro command is embedded in this Intro URL.
      * Returns true if action succeeded, and false otherwise.
-     * 
+     *
      */
     public boolean execute();
 
@@ -57,7 +57,7 @@
     /**
      * Return a parameter defined in the Intro URL. Returns null if the
      * parameter is not defined.
-     * 
+     *
      * @param parameterId
      *            the id of the parameter being requested
      * @return the value of the parameter, or <code>null</code> if the
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroXHTMLContentProvider.java b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroXHTMLContentProvider.java
index 6bfe745..343469e 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroXHTMLContentProvider.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IIntroXHTMLContentProvider.java
@@ -16,7 +16,7 @@
  * A content provider for dynamic XHTML Intro content. When an XHTML intro page
  * is parsed and a contentProvider element is detected, it is used to create
  * dynamic XHTML content in the page.
- * 
+ *
  * @since 3.1
  */
 public interface IIntroXHTMLContentProvider extends IIntroContentProvider {
@@ -24,29 +24,29 @@
     /**
      * Create XHTML content in the provided parent DOM Element. A typical usage
      * for this method would be: <br>
-     * 
+     *
      * <br>
      * <code>
      * &lt;contentProvider id=&quot;contentProviderId&quot;
      * class=&quot;xx.yy.IntroContentProvider&quot;
      * pluginId=&quot;xx.yy.id&quot;/&gt; <br></code> <br>
-     * 
+     *
      * A parent DOM Element will be passed to allow for adding dynamic content
      * by manipulating the Java XML DOM for the XHTML file. A div is created
      * with an id equal to the id specified in the contentProvider element, and
      * is passed as the parent. In the above example, the DOM element
      * representing a div with id=myContentProviderDivId would be the parent
      * passed.
-     * 
+     *
      * @param id
      *            the unique identifier of the content element. The same content
      *            provider class can be reused for several elements and the id
      *            can be used to tell them apart.
-     * 
+     *
      * @param parent
      *            the parent xml Element where dynamic content will be added as
      *            children.
-     * 
+     *
      */
     public void createContent(String id, Element parent);
 
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IStandbyContentPart.java b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IStandbyContentPart.java
index 2a74314..717a71d 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IStandbyContentPart.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IStandbyContentPart.java
@@ -28,17 +28,17 @@
  *       		pluginId=&quot;com.x.y.somePluginId&quot;
  *       		class=&quot;com.x.y.someClass&quot;
  *       		id=&quot;com.x.y.someContentPartId&quot;&gt;
- *       	&lt;/standbyPart&gt; 
+ *       	&lt;/standbyPart&gt;
  *         &lt;/extension&gt;
  * </pre>
- * 
+ *
  * </p>
  * Standby content parts have a life cycle that starts with a call to init,
  * shortly after part construction, followed by a call to createPartControl.
  * During these two calls, the part is responsible for creating its content and
  * using the memento to try to recreate its previous state. SetInput is the last
  * method called when trying to create a standby part.
- * 
+ *
  * @since 3.0
  */
 public interface IStandbyContentPart {
@@ -48,7 +48,7 @@
      * <p>
      * Clients should not call this method. The intro framework calls this
      * method when it needs to.
-     * 
+     *
      * @param parent
      *            the parent control
      * @param toolkit
@@ -60,7 +60,7 @@
      * Returns the primary control associated with this standby part. The
      * control is typically set during the createPartControl() call when this
      * part is being created.
-     * 
+     *
      * @return the SWT control which displays this standby part's content, or
      *         <code>null</code> if this standby part's controls have not yet
      *         been created.
@@ -77,7 +77,7 @@
      * construction. It marks the start of this parts' lifecycle. Clients must
      * not call this method.
      * </p>
-     * 
+     *
      * @param introPart
      *            the intro part hosting this stanndby content part.
      * @param memento
@@ -95,7 +95,7 @@
      * an input specified, or when this standby part is being recreated from a
      * previous workbench session. In this case, the standby part is responsible
      * for handling a null input, and recreating itself from a cached IMemento.
-     * 
+     *
      * @param input
      *            the input object to be used by this standby part.
      */
@@ -125,7 +125,7 @@
      * This method is automatically called by the workbench at appropriate
      * times. Clients must not call this method directly.
      * </p>
-     * 
+     *
      * @param memento
      *            a memento to receive the object state
      */
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IntroConfigurer.java b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IntroConfigurer.java
index 3e80f94..5d7dc27 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IntroConfigurer.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IntroConfigurer.java
@@ -3,7 +3,7 @@
  * accompanying materials are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors: IBM Corporation - initial API and implementation
  **************************************************************************************************/
 
@@ -20,7 +20,7 @@
  * Since it is possible for multiple products to use the same intro configuration, this class allows
  * them to customize some aspects of the intro content so that it looks different for different
  * products even though they all share the same intro implementation and content.
- * 
+ *
  * @since 3.2
  */
 
@@ -28,7 +28,7 @@
 
 	/**
 	 * The identifier of the named group where the configurer can contribute local tool bar actions.
-	 * 
+	 *
 	 * @see #init(IIntroSite, Map)
 	 */
 	public static final String TB_ADDITIONS = "additions"; //$NON-NLS-1$
@@ -41,7 +41,7 @@
 	/**
 	 * Provides the opportunity for the configurer to contribute to the action bars and to fetch
 	 * presentation theme properties.
-	 * 
+	 *
 	 * @param site
 	 *            the intro part's site
 	 * @param themeProperties
@@ -57,7 +57,7 @@
 	/**
 	 * Internal method to associate the corresponding intro configuration model. May be called
 	 * independently of {@link #init(IIntroSite, Map)}.
-	 * 
+	 *
 	 * @noreference
 	 */
 	final public void bind(IntroModelRoot model) {
@@ -71,7 +71,7 @@
 
 	/**
 	 * Returns the value of the theme property with a given name.
-	 * 
+	 *
 	 * @param name
 	 *            the theme property name
 	 * @return the value of the property or <code>null</code> if property is not found, the theme
@@ -92,7 +92,7 @@
 	 * content files in attribute names and values of elements. Whenever $variable$ is encountered
 	 * in the content, it is evaluated using this class by passing 'variable' to this method and
 	 * substituting the result in the content.
-	 * 
+	 *
 	 * @param variableName
 	 *            the name of the substitution variable
 	 * @return the value to substitute in place of a variable or <code>null</code> if the variable
@@ -103,7 +103,7 @@
 	/**
 	 * Returns the children of computed groups. Groups marked as computed will be completed at run
 	 * time when the group is asked to provide children.
-	 * 
+	 *
 	 * @param pageId
 	 *            the identifier of the page in which this group appears
 	 * @param groupId
@@ -117,7 +117,7 @@
 	/**
 	 * Returns an array of elements that will be used to build launch bar short cut links. Override
 	 * this method if the intro launch bar has been marked as computed.
-	 * 
+	 *
 	 * @return an array of elements that will be used to dynamically build shortcut links.
 	 */
 	public IntroElement[] getLaunchBarShortcuts() {
@@ -128,7 +128,7 @@
 	 * Resolves an incomplete path in the form "page_id/@" where page_id represents the identifier
 	 * of the target page. The configurator should complete the path according to its internal
 	 * resolution mechanism. The final path must point at an anchor in the referenced page.
-	 * 
+	 *
 	 * @param extensionId
 	 *            the id specified for the config extension
 	 * @param path
@@ -141,7 +141,7 @@
 	/**
 	 * Returns the style value that will be mixed in with the original style of the extension.
 	 * Themes can use this feature to render certain extensions differently.
-	 * 
+	 *
 	 * @param pageId
 	 *            the identifier of the target page that this extension is contributed into
 	 * @param extensionId
@@ -155,7 +155,7 @@
 
 	/**
 	 * Return true if {@code pageId} is the configured start page.
-	 * 
+	 *
 	 * @param pageId
 	 *            the page identifier
 	 * @since 3.5
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IntroElement.java b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IntroElement.java
index feee0b5..b529c8f 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IntroElement.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IntroElement.java
@@ -4,7 +4,7 @@
  * accompanying materials are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors: IBM Corporation - initial API and implementation
  **************************************************************************************************/
 
@@ -20,7 +20,7 @@
  * instances of this class from <code>IntroConfigurer</code> to dynamically complete the intro
  * content. Attribute and element names, as well as content model must match the intro
  * schema.
- * 
+ *
  * @since 3.2
  */
 public class IntroElement {
@@ -32,7 +32,7 @@
 
 	/**
 	 * Creates a new intro element with the provided name.
-	 * 
+	 *
 	 * @param name
 	 *            the name of the new intro element
 	 */
@@ -42,7 +42,7 @@
 
 	/**
 	 * Sets the value of the named attribute.
-	 * 
+	 *
 	 * @param name
 	 *            attribute name
 	 * @param value
@@ -54,7 +54,7 @@
 
 	/**
 	 * Returns the value of the attribute with a given name.
-	 * 
+	 *
 	 * @param name
 	 *            the attribute name
 	 * @return value of the attribute with a given name or <code>null</code> if not set.
@@ -65,7 +65,7 @@
 
 	/**
 	 * Returns the names of all the attributes defined in this element.
-	 * 
+	 *
 	 * @return an enumeration of all the element names
 	 */
 
@@ -75,7 +75,7 @@
 
 	/**
 	 * Returns the name of the element.
-	 * 
+	 *
 	 * @return name of the element
 	 */
 	public String getName() {
@@ -84,7 +84,7 @@
 
 	/**
 	 * Returns the value of the element.
-	 * 
+	 *
 	 * @return value of the element or <code>null</code> if not set.
 	 */
 	public String getValue() {
@@ -93,7 +93,7 @@
 
 	/**
 	 * Sets the value of the element.
-	 * 
+	 *
 	 * @param value
 	 *            the value of this element
 	 */
@@ -103,7 +103,7 @@
 
 	/**
 	 * Adds a child to this element.
-	 * 
+	 *
 	 * @param child
 	 *            the new child of this element
 	 */
@@ -115,7 +115,7 @@
 
 	/**
 	 * Returns the children of this element.
-	 * 
+	 *
 	 * @return an array of child elements or an empty array of there are no children.
 	 */
 	public IntroElement[] getChildren() {
@@ -123,7 +123,7 @@
 			return new IntroElement[0];
 		return (IntroElement[]) children.toArray(new IntroElement[children.size()]);
 	}
-	
+
 	@Override
 	public boolean equals(Object obj) {
 		if (obj instanceof IntroElement) {
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IntroURLFactory.java b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IntroURLFactory.java
index 1d0778c..f91fcaf 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IntroURLFactory.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/config/IntroURLFactory.java
@@ -22,7 +22,7 @@
  * This class provides all its functionality via static members. It is not
  * intended to be instantiated.
  * </p>
- * 
+ *
  * @see IIntroURL
  * @since 3.0
  */
@@ -39,7 +39,7 @@
     /**
      * Parses the given string, and returns an IntroURL if the string is a valid
      * Intro URL. Returns null in all other cases. Example usage:
-     * 
+     *
      * <pre>
      * StringBuffer url = new StringBuffer();
      * url.append(&quot;http://org.eclipse.ui.intro/showStandby?&quot;);
@@ -54,7 +54,7 @@
      *     introURL.execute();
      * }
      * </pre>
-     * 
+     *
      * @param url
      *            the url to construct an IntroURL from
      * @return an IntroURL, or <code>null</code> if the url is invalid
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/contentproviders/AlwaysWelcomeCheckbox.java b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/contentproviders/AlwaysWelcomeCheckbox.java
index 37d9bee..dcba09f 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/contentproviders/AlwaysWelcomeCheckbox.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/contentproviders/AlwaysWelcomeCheckbox.java
@@ -32,43 +32,43 @@
 import org.eclipse.ui.PlatformUI;
 /**
  *
- * Class which contributes a checkbox to an intro page which allows welcome to show 
- * on startup. If the checkbox is checked the home page of intro will be shown the next 
- * time the Eclipse application starts up. This class may be subclassed to override 
+ * Class which contributes a checkbox to an intro page which allows welcome to show
+ * on startup. If the checkbox is checked the home page of intro will be shown the next
+ * time the Eclipse application starts up. This class may be subclassed to override
  * the text for the checkbox label.
- * 
+ *
  * Implements the IIntroContentProvider to create the checkbox ui, and the
  * org.eclipse.ui.intro.config.IIntroAction interface for handling checkbox click events.
- * 
+ *
  * @since 3.3
  */
 public class AlwaysWelcomeCheckbox implements IIntroContentProvider,IIntroAction {
 
 	public final static String ALWAYS_SHOW_INTRO = "alwaysShowIntro"; //$NON-NLS-1$
-	
+
 	private boolean disposed = false;
-	
+
 	/**
 	 * Override this method to change the default text used for the checkbox
-	 * 
-	 * @return String label for the checkbox 
-	 * 
+	 *
+	 * @return String label for the checkbox
+	 *
 	 * @since 3.3
-	 * 
+	 *
 	 */
 	protected String getText()
 	{
 		// Default text
 		return Messages.AlwaysWelcomeCheckbox_Text;
 	}
-	
+
 
 	@Override
 	public void createContent(String id, PrintWriter out) {
 
 		boolean alwaysShowIntro = getAlwaysShowIntroPref();
 
-		// Use an IIntroAction url that points back to this class - 
+		// Use an IIntroAction url that points back to this class -
 		// particularly invoking run().
 		// This url is 'activated' using the onClick event.
 		out.print("<div id=\""+id+"\"><input type=\"checkbox\" "+  	//$NON-NLS-1$//$NON-NLS-2$
@@ -76,15 +76,15 @@
 				"\"http://org.eclipse.ui.intro/runAction?"+ 		//$NON-NLS-1$
 				"pluginId=org.eclipse.ui.intro&"+ 					//$NON-NLS-1$
 				"class="+this.getClass().getName()+"\" ");			//$NON-NLS-1$ //$NON-NLS-2$
-		
+
 		if (alwaysShowIntro)
 		{
 			out.print(" checked=\"checked\""); //$NON-NLS-1$
-			
+
 	        PlatformUI.getPreferenceStore().setValue(
-	        		IWorkbenchPreferenceConstants.SHOW_INTRO, alwaysShowIntro);	
+	        		IWorkbenchPreferenceConstants.SHOW_INTRO, alwaysShowIntro);
 		}
-		
+
 		out.println("/>"+getText()+"</div>");  //$NON-NLS-1$//$NON-NLS-2$
 	}
 
@@ -98,7 +98,7 @@
 
 		Button checkBox = new Button(parent,SWT.CHECK);
 		toolkit.adapt((Control)checkBox,false,false);
-		
+
 		checkBox.setText(getText());
 		checkBox.setSelection(alwaysShowIntro);
 		checkBox.addSelectionListener(new SelectionAdapter(){
@@ -107,7 +107,7 @@
 				reverseShowIntroState();
 			}
 		});
-		
+
 		if (alwaysShowIntro)
 			PlatformUI.getPreferenceStore().setValue(
         		IWorkbenchPreferenceConstants.SHOW_INTRO, alwaysShowIntro);
@@ -130,26 +130,26 @@
 	public void run(IIntroSite site, Properties params) {
 		reverseShowIntroState();
 	}
-	
+
 	/**
 	 * Method reverses preference ALWAYS_SHOW_INTRO due to checkbox selection change
-	 * 
+	 *
 	 */
 	private void reverseShowIntroState()
 	{
 		// Retrieve current state of IUniversalIntroConst.ALWAYS_SHOW_INTRO, change it, and save it back
 		// to both ALWAYS_SHOW_INTRO and SHOW_INTRO
         boolean alwaysShowIntro = !getAlwaysShowIntroPref();
-        
+
         // local preference store
         setAlwaysShowIntroPref(alwaysShowIntro);
-        
+
         // workbench preference store
         PlatformUI.getPreferenceStore().setValue(
-        		IWorkbenchPreferenceConstants.SHOW_INTRO, alwaysShowIntro);	
+        		IWorkbenchPreferenceConstants.SHOW_INTRO, alwaysShowIntro);
 
 	}
-	
+
 	public boolean getAlwaysShowIntroPref()
 	{
 		// If uninitialized, we will default to true (box will be checked)
@@ -158,7 +158,7 @@
 		}
 		return ReopenUtil.isReopenPreference();
 	}
-	
+
 	public void setAlwaysShowIntroPref(boolean val)
 	{
 		ReopenUtil.setReopenPreference(val);
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/contentproviders/EclipseRSSViewer.java b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/contentproviders/EclipseRSSViewer.java
index eaf6314..8975fa6 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/intro/contentproviders/EclipseRSSViewer.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/intro/contentproviders/EclipseRSSViewer.java
@@ -63,18 +63,18 @@
  * The id for the contentProvider tag must consist of the following attributes. Each of these attributes must be separated by '##'.
  * <ul>
  * <TABLE CELLPADDING=6 FRAME=BOX>
- * 
+ *
  * <THEAD>
  * <TR> <TH>Attribute</TH>     <TH>Description</TH>                         </TR>
  * </THEAD>
- * 
+ *
  * <TBODY>
  * <TR> <TD>url</TD>           <TD>RSS news feed url</TD>                   </TR>
  * <TR> <TD>welcome_items</TD> <TD>Number of news feed to be displayed</TD> </TR>
  * <TR> <TD>no_news_url</TD>   <TD>Alternative url for news feed</TD>       </TR>
  * <TR> <TD>no_news_text</TD>  <TD>Text for the alternative url</TD>        </TR>
  * </TBODY>
- * 
+ *
  * </TABLE>
  * </ul>
  * For example:
@@ -87,7 +87,7 @@
  * </ul>
  * &lt;/contentProvider&gt;
  * </p>
- * 
+ *
  * @since 3.4
  */
 
@@ -122,7 +122,7 @@
 	/**
 	 * Initialize the content provider
 	 * @param site an object which allows rcontainer reflows to be requested
-	 */ 
+	 */
 	@Override
 	public void init(IIntroContentProviderSite site) {
 		this.site = site;
@@ -135,16 +135,16 @@
 	 * @param out a writer where the html will be written
 	 */
 	@Override
-	public void createContent(String id, PrintWriter out) {	
+	public void createContent(String id, PrintWriter out) {
 		if (disposed)
 			return;
 		this.id = id;
 		params = setParams(id);
 
-		
+
 		if (items==null)
 			createNewsItems();
-		
+
 		if (items == null || threadRunning) {
 			out.print("<p class=\"status-text\">"); //$NON-NLS-1$
 			out.print(Messages.RSS_Loading);
@@ -200,7 +200,7 @@
 			return;
 		this.id = id;
 		params = setParams(id);
-		
+
 		if (formText == null) {
 			// a one-time pass
 			formText = toolkit.createFormText(parent, true);
@@ -222,11 +222,11 @@
 
 		StringBuffer buffer = new StringBuffer();
 		buffer.append("<form>"); //$NON-NLS-1$
-		
-		
+
+
 		if (items==null)
 			createNewsItems();
-		
+
 		if (items == null || threadRunning) {
 			buffer.append("<p>"); //$NON-NLS-1$
 			buffer.append(Messages.RSS_Loading);
@@ -255,19 +255,19 @@
 		}
 
 		buffer.append("</form>"); //$NON-NLS-1$
-		
+
 		String text = buffer.toString();
 		text = text.replaceAll("&{1}", "&amp;"); //$NON-NLS-1$ //$NON-NLS-2$
 		formText.setText(text, true, false);
 	}
 
-	
+
 	private String createExternalURL(String url) {
 		try {
 			return INTRO_SHOW_IN_BROWSER + URLEncoder.encode(url, "UTF-8"); //$NON-NLS-1$
 		} catch (UnsupportedEncodingException e) {
 			return INTRO_SHOW_IN_BROWSER + url;
-		} 
+		}
 	}
 
 	@Override
@@ -281,28 +281,28 @@
 
 	/**
 	 * Method is responsible for gathering RSS data.
-	 * 
+	 *
 	 * Kicks off 2 threads:
-	 * 
+	 *
 	 * 	The first (ContentThread) is to actually query the feeds URL to find RSS entries.
 	 *  When it finishes, it calls a refresh to display the entires it found (if any).
-	 * 
+	 *
 	 *  [Esc RATLC00319786]
 	 *  The second (TimeoutThread) waits for SOCKET_TIMEOUT ms to see if the content thread
 	 *  has finished reading RSS.  If it has finished, nothing further happens.  If it has
 	 *  not finished, the TimeoutThread sets the threadRunning boolean to false and refreshes
 	 *  the page (basically telling the UI that no content could be found, and removes
 	 *  the 'Loading...' text).
-	 * 
+	 *
 	 */
 	private void createNewsItems() {
-		
+
 		ContentThread contentThread = new ContentThread();
 		contentThread.start();
 		TimeoutThread timeThread = new TimeoutThread();
 		timeThread.start();
 	}
-	
+
 	/**
 	 * Reflows the page using an UI thread.
 	 */
@@ -313,7 +313,7 @@
 	}
 
 	private Image createImage(IPath path) {
-		Bundle bundle = Platform.getBundle(IntroPlugin.PLUGIN_ID); 
+		Bundle bundle = Platform.getBundle(IntroPlugin.PLUGIN_ID);
 		URL url = FileLocator.find(bundle, path, null);
 		try {
 			url = FileLocator.toFileURL(url);
@@ -483,7 +483,7 @@
 	private String getParameter(String name) {
 		return (String) params.get(name);
 	}
-	
+
 	private class ContentThread extends Thread{
 
 		@Override
@@ -506,11 +506,11 @@
 				SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
 				parser.parse(in, new RSSHandler());
 				refresh();
-				
+
 			} catch (Exception e) {
 				IntroPlugin.logError(
 						NLS.bind(
-								Messages.RSS_Malformed_feed, 
+								Messages.RSS_Malformed_feed,
 								getParameter("url"))); //$NON-NLS-1$
 				refresh();
 			} finally {
@@ -533,10 +533,10 @@
 				timeoutMethod.invoke(conn, new Object[] { new Integer(milliseconds)} );
 			} catch (Exception e) {
 			     // If running on a 1.4 JRE an exception is expected, fall through
-			} 
+			}
 		}
 	}
-	
+
 	private class TimeoutThread extends Thread
 	{
 		@Override
