diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/dialogs/TypeSelectorDialog.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/dialogs/TypeSelectorDialog.java
index 786f9bd..ae488ee 100644
--- a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/dialogs/TypeSelectorDialog.java
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/dialogs/TypeSelectorDialog.java
@@ -1,375 +1,376 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2012 IBM Corporation and others.
- * All rights reserved. This program and the 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
- *******************************************************************************/
-package org.eclipse.bpel.ui.dialogs;
-
-
-import java.util.List;
-
-import org.eclipse.bpel.model.util.BPELUtils;
-import org.eclipse.bpel.ui.Messages;
-import org.eclipse.bpel.ui.details.providers.CompositeContentProvider;
-import org.eclipse.bpel.ui.details.providers.MessageTypeContentProvider;
-import org.eclipse.bpel.ui.details.providers.ModelLabelProvider;
-import org.eclipse.bpel.ui.details.providers.VariableTypeTreeContentProvider;
-import org.eclipse.bpel.ui.details.providers.XSDSchemaFromResourceContentProvider;
-import org.eclipse.bpel.ui.details.providers.XSDTypeOrElementContentProvider;
-import org.eclipse.bpel.ui.util.ModelHelper;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.wst.wsdl.Message;
-
-
-/**
- * Browse for data types available and choose that type.
- * 
- * In BPEL, types are just an aggregation of "visible" XML schemas. Visible schemas are
- * schemas imported in the BPEL source file via the import construct and schemas
- * present in WSDL files (which are also imported via the import construct).
- * 
- * When browsing for types, two modes are supported by this dialog.
- * 1) Browsing types which are already imported (constitute the type system of the process)
- * 2) Browsing for available types. This includes XML types visible to designer.
- * 
- * In addition, one can arbitrarily add an import to the process if the XML schema
- * representing the types is somewhere else (URL, outside file, etc).
- * 
- * It should be noted, that currently, no attempt is made to resolve duplicate type entries
- * in the schemas. This is not necessarily a bug.
- * 
- *  @author Michal Chmielewski (michal.chmielewski@oracle.com)  
- * 
- */
-
-public class TypeSelectorDialog extends BrowseSelectorDialog {
-
-	// https://issues.jboss.org/browse/JBIDE-8045
-	// additional filters for constraining XSD & message type selections
-	final public static int INCLUDE_SIMPLE_TYPES = 0x1;
-	final public static int INCLUDE_COMPLEX_TYPES = 0x2;
-	final public static int INCLUDE_ELEMENT_DECLARATIONS = 0x4;
-	final public static int INCLUDE_PRIMITIVES = 0x8;
-	final public static int INCLUDE_MESSAGE_TYPES = 0x10;
-	final public static int INCLUDE_ALL = 0xff;
-	final public static int INCLUDE_XSD_TYPES = INCLUDE_SIMPLE_TYPES | INCLUDE_COMPLEX_TYPES;
-		
-	/* Button id for complex types */
-	protected final static int BID_COMPLEX_TYPES = IDialogConstants.CLIENT_ID + 100;
-	
-	/* Button id for simple types */
-	protected final static int BID_SIMPLE_TYPES = IDialogConstants.CLIENT_ID + 101;
-	
-	/* Button id for element declarations */
-	protected final static int BID_ELEMENT_DECLARATIONS = IDialogConstants.CLIENT_ID + 102;
-	
-	/* Button id for messages */
-	protected final static int BID_MESSAGES = IDialogConstants.CLIENT_ID + 103;
-	
-	/* Button id for primitives */
-	protected final static int BID_XSD_PRIMITIVES = IDialogConstants.CLIENT_ID + 104;
-		
-	/* Whether messages ought to be shown */	
-	protected boolean showMessages = true;
-	
-		
-	protected XSDTypeOrElementContentProvider xsdTypeProvider = new XSDTypeOrElementContentProvider();
-	protected MessageTypeContentProvider messageTypeProvider = new MessageTypeContentProvider();	
-	
-	
-	/* Filter types key */
-	private static final String FILTER_TYPES_KEY = "FilterTypes"; //$NON-NLS-1$
-	
-	/* Show messages key in dialog settings */
-	private static final String SHOW_MESSAGES_KEY = "ShowMessages"; //$NON-NLS-1$
-	
-			
-	/* Which types to filter ? */
-	protected int FILTER_TYPES = XSDTypeOrElementContentProvider.INCLUDE_ALL;
-	
-	// https://issues.jboss.org/browse/JBIDE-8045
-	/* Which types to include as selections (checkboxes) in dialog ? */
-	protected int includeTypes = INCLUDE_ALL;
-	
-	// https://jira.jboss.org/browse/JBIDE-7107
-	// set by caller if a selection from the lower tree (typically message parts or XSD elements)
-	// are required before "OK" button can be enabled.
-	protected boolean requireLowerTreeSelection = false;
-	
-	
-	/**
-	 * Create a brand new shiny Type Selector Dialog.
-	 * 
-	 * @param parent the parent shell
-	 * @param eObj any BPEL model object
-	 */
-	// https://issues.jboss.org/browse/JBIDE-8045
-	// add filter selection parameter
-	public TypeSelectorDialog (Shell parent, EObject eObj, int filter ) {
-		super(parent, new ModelLabelProvider(eObj));
-		
-		this.includeTypes = filter;
-		this.modelObject = eObj;
-					
-		resourceContentProvider = new XSDSchemaFromResourceContentProvider( modelObject.eResource().getResourceSet() );
-		
-		CompositeContentProvider ccp = new CompositeContentProvider();
-		ccp.add( xsdTypeProvider );
-		ccp.add( messageTypeProvider );
-		contentProvider = ccp;
-		
-		treeContentProvider = new VariableTypeTreeContentProvider (true,true);
-		
-		setTitle(Messages.TypeSelectorDialog_4);
-		setMessage(Messages.TypeSelectorDialog_5); 
-		setLowerViewLabel(Messages.TypeSelectorDialog_7);		
-		setBrowseFromLabel( Messages.TypeSelectorDialog_9 );
-		
-		// Restore some dialog settings ...
-		IDialogSettings settings = getDialogSettings();					
-		try {
-			FILTER_TYPES = settings.getInt(FILTER_TYPES_KEY);
-		} catch (Exception ex) {
-			FILTER_TYPES = XSDTypeOrElementContentProvider.INCLUDE_ALL;
-		}		
-				
-		try {
-			showMessages = settings.getBoolean(SHOW_MESSAGES_KEY);
-		} catch (Exception ex) {
-			showMessages = false;
-		}
-	}
-	
-	/** 
-	 * Hook a load on the defaults into this dialog upon create.
-	 * 
-	 */
-	
-	@Override
-	protected Control createContents(Composite parent) {
-		
-		Control control = super.createContents(parent);
-			
-		// Re-Create the state of the providers from the dialog settings.
-		setProviderFilters();
-
-		refresh();		
-
-		return control;
-	}
-
-
-	
-	@Override
-	protected void saveSettings () {
-		super.saveSettings();		
-		IDialogSettings settings = getDialogSettings();		
-		settings.put ( FILTER_TYPES_KEY, FILTER_TYPES );		
-		settings.put ( SHOW_MESSAGES_KEY, showMessages);		
-	}
-	
-	/**
-	 * Handle the check button and radio button callbacks.
-	 * 
-	 * @param id
-	 * @param checked
-	 */
-	
-	@Override
-	protected void buttonPressed (int id, boolean checked, boolean bRefresh) {
-		
-		int bits = 0;
-				
-		switch (id) {
-		case BID_SIMPLE_TYPES :
-			bits = XSDTypeOrElementContentProvider.INCLUDE_SIMPLE_TYPES;
-			break;
-		
-		case BID_COMPLEX_TYPES :
-			bits = XSDTypeOrElementContentProvider.INCLUDE_COMPLEX_TYPES;
-			break;
-
-		case BID_ELEMENT_DECLARATIONS :
-			bits = XSDTypeOrElementContentProvider.INCLUDE_ELEMENT_DECLARATIONS;
-			break;
-
-		case BID_XSD_PRIMITIVES :
-			bits = XSDTypeOrElementContentProvider.INCLUDE_PRIMITIVES;
-			break;
-			
-		case BID_MESSAGES :
-			showMessages = checked;
-			// https://issues.jboss.org/browse/JBIDE-8075
-			// enable/disable selection of Message objects
-			setProviderFilters();
-			bRefresh = true;
-			break;
-							
-		default :
-			// exit the function here
-			super.buttonPressed(id, checked,bRefresh);
-			return;
-		}
-
-		
-		// adjust the filter
-		if (bits != 0) {
-			if (checked) {
-				FILTER_TYPES |= bits;
-			} else {
-				FILTER_TYPES &= ~bits;
-			}
-			setProviderFilters();
-		}
-		
-		if (bRefresh) {
-			refresh();
-		}
-	}
-		
-	@Override
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, 
-				BID_ADD_IMPORT,
-				Messages.TypeSelectorDialog_3, 
-				false);		
-		super.createButtonsForButtonBar(parent);
-	}
-	
-	@Override
-	protected void createBrowseFilterGroupButtons ( Group  group ) {
-        
-        // https://issues.jboss.org/browse/JBIDE-8045
-		if ((includeTypes & INCLUDE_PRIMITIVES) > 0 )
-			createCheckButton(group,Messages.TypeSelectorDialog_14, BID_XSD_PRIMITIVES, 
-				(FILTER_TYPES & XSDTypeOrElementContentProvider.INCLUDE_PRIMITIVES) > 0  );
-		if ((includeTypes & INCLUDE_SIMPLE_TYPES) > 0 )
-			createCheckButton(group,Messages.TypeSelectorDialog_15, BID_SIMPLE_TYPES, 
-				(FILTER_TYPES &  XSDTypeOrElementContentProvider.INCLUDE_SIMPLE_TYPES) > 0   );
-		if ((includeTypes & INCLUDE_COMPLEX_TYPES) > 0 )
-			createCheckButton(group,Messages.TypeSelectorDialog_16, BID_COMPLEX_TYPES, 
-				(FILTER_TYPES &  XSDTypeOrElementContentProvider.INCLUDE_COMPLEX_TYPES ) > 0 );
-		if ((includeTypes & INCLUDE_ELEMENT_DECLARATIONS) > 0 )
-			createCheckButton(group,Messages.TypeSelectorDialog_17, BID_ELEMENT_DECLARATIONS,
-				(FILTER_TYPES &  XSDTypeOrElementContentProvider.INCLUDE_ELEMENT_DECLARATIONS ) > 0 );
-		if ((includeTypes & INCLUDE_MESSAGE_TYPES) > 0 )
-			createCheckButton(group,Messages.TypeSelectorDialog_18, BID_MESSAGES,
-				showMessages);
-		
-		super.createBrowseFilterGroupButtons( group );
-	}
-	
-	
-	
-	@Override
-	protected List collectItemsFromImports() {
-		
-		List list = ModelHelper.getSchemas(modelObject,true);
-		
-		if (showMessages) {
-			list.addAll ( ModelHelper.getDefinitions(modelObject) );
-		}
-		
-		return list;
-	}
-
-	// https://jira.jboss.org/browse/JBIDE-7107
-	@Override
-	protected void updateOkState() {
-		super.updateOkState();
-		
-		boolean enabled = true;
-		computeResult();
-		Object obj = getFirstResult();
-		// We need to check whether namespace prefix has been already defined
-		if (obj instanceof Message) {
-			if (!checkNamespace((Message) obj)){
-				enabled = false;
-			}
-		}
-		if ( getResult().length<2 && this.requireLowerTreeSelection )
-			enabled = false;
-		
-		getOkButton().setEnabled(enabled);
-	}
-
-	@Override
-	protected void okPressed() {
-		computeResult();
-		Object obj = getFirstResult();
-		// We need to check whether namespace prefix has been already defined
-		if (obj instanceof Message) {
-			if (!checkNamespace((Message) obj)){
-				return;
-			}
-		}
-		if ( getResult().length<2 && this.requireLowerTreeSelection )
-			return;
-		super.okPressed();
-	}
-
-	private boolean checkNamespace(Message message) {
-		String targetNamespace = message.getQName().getNamespaceURI();
-		String prefix = BPELUtils.getNamespacePrefix (modelObject, targetNamespace);
-		if (prefix != null) {
-			return true;
-		}
-		// We have to map the namespace to a prefix. 
-		NamespaceMappingDialog dialog = new NamespaceMappingDialog(getShell(),modelObject);
-		dialog.setNamespace( targetNamespace );
-		
-		if (dialog.open() == Window.CANCEL) {
-			return false;
-		}
-		
-		// define the prefix
-		BPELUtils.setPrefix( BPELUtils.getProcess(modelObject), targetNamespace, dialog.getPrefix()); 		
-		return true;
-	}
-			
-	
-	/**
-	 * https://issues.jboss.org/browse/JBIDE-8045
-	 * Enable or disable lower tree selection required flag (see this.requireLowerTreeSelection)
-	 * 
-	 * @param enabled
-	 */
-	public void setRequireLowerTreeSelection(boolean enabled)
-	{
-		this.requireLowerTreeSelection = enabled;
-	}
-	
-	// https://issues.jboss.org/browse/JBIDE-8045
-	public void setIncludeTypes(int includeTypes) {
-		this.includeTypes = includeTypes;
-	}
-	
-	// https://issues.jboss.org/browse/JBIDE-8045
-	// update the provider filters for only those types selected and available
-	private void setProviderFilters() {
-		
-		xsdTypeProvider.setFilter( FILTER_TYPES & includeTypes );
-		
-		// https://issues.jboss.org/browse/JBIDE-8075
-		// enable/disable selection of Message objects
-		if ( (includeTypes & INCLUDE_MESSAGE_TYPES) > 0 ) {
-			messageTypeProvider.setFilter( showMessages ? 1 : 0 );
-		}
-		else {
-			messageTypeProvider.setFilter( 0 );
-		}
-	}
-}
+/*******************************************************************************
+ * Copyright (c) 2005, 2012 IBM Corporation and others.
+ * All rights reserved. This program and the 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
+ *******************************************************************************/
+package org.eclipse.bpel.ui.dialogs;
+
+
+import java.util.List;
+
+import org.eclipse.bpel.model.util.BPELUtils;
+import org.eclipse.bpel.ui.Messages;
+import org.eclipse.bpel.ui.details.providers.CompositeContentProvider;
+import org.eclipse.bpel.ui.details.providers.MessageTypeContentProvider;
+import org.eclipse.bpel.ui.details.providers.ModelLabelProvider;
+import org.eclipse.bpel.ui.details.providers.VariableTypeTreeContentProvider;
+import org.eclipse.bpel.ui.details.providers.XSDSchemaFromResourceContentProvider;
+import org.eclipse.bpel.ui.details.providers.XSDTypeOrElementContentProvider;
+import org.eclipse.bpel.ui.util.ModelHelper;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.SelectionDialog;
+import org.eclipse.wst.wsdl.Message;
+
+
+/**
+ * Browse for data types available and choose that type.
+ * 
+ * In BPEL, types are just an aggregation of "visible" XML schemas. Visible schemas are
+ * schemas imported in the BPEL source file via the import construct and schemas
+ * present in WSDL files (which are also imported via the import construct).
+ * 
+ * When browsing for types, two modes are supported by this dialog.
+ * 1) Browsing types which are already imported (constitute the type system of the process)
+ * 2) Browsing for available types. This includes XML types visible to designer.
+ * 
+ * In addition, one can arbitrarily add an import to the process if the XML schema
+ * representing the types is somewhere else (URL, outside file, etc).
+ * 
+ * It should be noted, that currently, no attempt is made to resolve duplicate type entries
+ * in the schemas. This is not necessarily a bug.
+ * 
+ *  @author Michal Chmielewski (michal.chmielewski@oracle.com)  
+ * 
+ */
+
+public class TypeSelectorDialog extends BrowseSelectorDialog {
+
+	// https://issues.jboss.org/browse/JBIDE-8045
+	// additional filters for constraining XSD & message type selections
+	final public static int INCLUDE_SIMPLE_TYPES = 0x1;
+	final public static int INCLUDE_COMPLEX_TYPES = 0x2;
+	final public static int INCLUDE_ELEMENT_DECLARATIONS = 0x4;
+	final public static int INCLUDE_PRIMITIVES = 0x8;
+	final public static int INCLUDE_MESSAGE_TYPES = 0x10;
+	final public static int INCLUDE_ALL = 0xff;
+	final public static int INCLUDE_XSD_TYPES = INCLUDE_SIMPLE_TYPES | INCLUDE_COMPLEX_TYPES;
+		
+	/* Button id for complex types */
+	protected final static int BID_COMPLEX_TYPES = IDialogConstants.CLIENT_ID + 100;
+	
+	/* Button id for simple types */
+	protected final static int BID_SIMPLE_TYPES = IDialogConstants.CLIENT_ID + 101;
+	
+	/* Button id for element declarations */
+	protected final static int BID_ELEMENT_DECLARATIONS = IDialogConstants.CLIENT_ID + 102;
+	
+	/* Button id for messages */
+	protected final static int BID_MESSAGES = IDialogConstants.CLIENT_ID + 103;
+	
+	/* Button id for primitives */
+	protected final static int BID_XSD_PRIMITIVES = IDialogConstants.CLIENT_ID + 104;
+		
+	/* Whether messages ought to be shown */	
+	protected boolean showMessages = true;
+	
+		
+	protected XSDTypeOrElementContentProvider xsdTypeProvider = new XSDTypeOrElementContentProvider();
+	protected MessageTypeContentProvider messageTypeProvider = new MessageTypeContentProvider();	
+	
+	
+	/* Filter types key */
+	private static final String FILTER_TYPES_KEY = "FilterTypes"; //$NON-NLS-1$
+	
+	/* Show messages key in dialog settings */
+	private static final String SHOW_MESSAGES_KEY = "ShowMessages"; //$NON-NLS-1$
+	
+			
+	/* Which types to filter ? */
+	protected int FILTER_TYPES = XSDTypeOrElementContentProvider.INCLUDE_ALL;
+	
+	// https://issues.jboss.org/browse/JBIDE-8045
+	/* Which types to include as selections (checkboxes) in dialog ? */
+	protected int includeTypes = INCLUDE_ALL;
+	
+	// https://jira.jboss.org/browse/JBIDE-7107
+	// set by caller if a selection from the lower tree (typically message parts or XSD elements)
+	// are required before "OK" button can be enabled.
+	protected boolean requireLowerTreeSelection = false;
+	
+	
+	/**
+	 * Create a brand new shiny Type Selector Dialog.
+	 * 
+	 * @param parent the parent shell
+	 * @param eObj any BPEL model object
+	 */
+	// https://issues.jboss.org/browse/JBIDE-8045
+	// add filter selection parameter
+	public TypeSelectorDialog (Shell parent, EObject eObj, int filter ) {
+		super(parent, new ModelLabelProvider(eObj));
+		
+		this.includeTypes = filter;
+		this.modelObject = eObj;
+					
+		resourceContentProvider = new XSDSchemaFromResourceContentProvider( modelObject.eResource().getResourceSet() );
+		
+		CompositeContentProvider ccp = new CompositeContentProvider();
+		ccp.add( xsdTypeProvider );
+		ccp.add( messageTypeProvider );
+		contentProvider = ccp;
+		
+		treeContentProvider = new VariableTypeTreeContentProvider (true,true);
+		
+		setTitle(Messages.TypeSelectorDialog_4);
+		setMessage(Messages.TypeSelectorDialog_5); 
+		setLowerViewLabel(Messages.TypeSelectorDialog_7);		
+		setBrowseFromLabel( Messages.TypeSelectorDialog_9 );
+		
+		// Restore some dialog settings ...
+		IDialogSettings settings = getDialogSettings();					
+		try {
+			FILTER_TYPES = settings.getInt(FILTER_TYPES_KEY);
+		} catch (Exception ex) {
+			FILTER_TYPES = XSDTypeOrElementContentProvider.INCLUDE_ALL;
+		}		
+				
+		try {
+			showMessages = settings.getBoolean(SHOW_MESSAGES_KEY);
+		} catch (Exception ex) {
+			showMessages = false;
+		}
+	}
+	
+	/** 
+	 * Hook a load on the defaults into this dialog upon create.
+	 * 
+	 */
+	
+	@Override
+	protected Control createContents(Composite parent) {
+		
+		Control control = super.createContents(parent);
+			
+		// Re-Create the state of the providers from the dialog settings.
+		setProviderFilters();
+
+		refresh();		
+
+		return control;
+	}
+
+
+	
+	@Override
+	protected void saveSettings () {
+		super.saveSettings();		
+		IDialogSettings settings = getDialogSettings();		
+		settings.put ( FILTER_TYPES_KEY, FILTER_TYPES );		
+		settings.put ( SHOW_MESSAGES_KEY, showMessages);		
+	}
+	
+	/**
+	 * Handle the check button and radio button callbacks.
+	 * 
+	 * @param id
+	 * @param checked
+	 */
+	
+	@Override
+	protected void buttonPressed (int id, boolean checked, boolean bRefresh) {
+		
+		int bits = 0;
+				
+		switch (id) {
+		case BID_SIMPLE_TYPES :
+			bits = XSDTypeOrElementContentProvider.INCLUDE_SIMPLE_TYPES;
+			break;
+		
+		case BID_COMPLEX_TYPES :
+			bits = XSDTypeOrElementContentProvider.INCLUDE_COMPLEX_TYPES;
+			break;
+
+		case BID_ELEMENT_DECLARATIONS :
+			bits = XSDTypeOrElementContentProvider.INCLUDE_ELEMENT_DECLARATIONS;
+			break;
+
+		case BID_XSD_PRIMITIVES :
+			bits = XSDTypeOrElementContentProvider.INCLUDE_PRIMITIVES;
+			break;
+			
+		case BID_MESSAGES :
+			showMessages = checked;
+			// https://issues.jboss.org/browse/JBIDE-8075
+			// enable/disable selection of Message objects
+			setProviderFilters();
+			bRefresh = true;
+			break;
+							
+		default :
+			// exit the function here
+			super.buttonPressed(id, checked,bRefresh);
+			return;
+		}
+
+		
+		// adjust the filter
+		if (bits != 0) {
+			if (checked) {
+				FILTER_TYPES |= bits;
+			} else {
+				FILTER_TYPES &= ~bits;
+			}
+			setProviderFilters();
+		}
+		
+		if (bRefresh) {
+			refresh();
+		}
+	}
+		
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		createButton(parent, 
+				BID_ADD_IMPORT,
+				Messages.TypeSelectorDialog_3, 
+				false);		
+		super.createButtonsForButtonBar(parent);
+	}
+	
+	@Override
+	protected void createBrowseFilterGroupButtons ( Group  group ) {
+        
+        // https://issues.jboss.org/browse/JBIDE-8045
+		if ((includeTypes & INCLUDE_PRIMITIVES) > 0 )
+			createCheckButton(group,Messages.TypeSelectorDialog_14, BID_XSD_PRIMITIVES, 
+				(FILTER_TYPES & XSDTypeOrElementContentProvider.INCLUDE_PRIMITIVES) > 0  );
+		if ((includeTypes & INCLUDE_SIMPLE_TYPES) > 0 )
+			createCheckButton(group,Messages.TypeSelectorDialog_15, BID_SIMPLE_TYPES, 
+				(FILTER_TYPES &  XSDTypeOrElementContentProvider.INCLUDE_SIMPLE_TYPES) > 0   );
+		if ((includeTypes & INCLUDE_COMPLEX_TYPES) > 0 )
+			createCheckButton(group,Messages.TypeSelectorDialog_16, BID_COMPLEX_TYPES, 
+				(FILTER_TYPES &  XSDTypeOrElementContentProvider.INCLUDE_COMPLEX_TYPES ) > 0 );
+		if ((includeTypes & INCLUDE_ELEMENT_DECLARATIONS) > 0 )
+			createCheckButton(group,Messages.TypeSelectorDialog_17, BID_ELEMENT_DECLARATIONS,
+				(FILTER_TYPES &  XSDTypeOrElementContentProvider.INCLUDE_ELEMENT_DECLARATIONS ) > 0 );
+		if ((includeTypes & INCLUDE_MESSAGE_TYPES) > 0 )
+			createCheckButton(group,Messages.TypeSelectorDialog_18, BID_MESSAGES,
+				showMessages);
+		
+		super.createBrowseFilterGroupButtons( group );
+	}
+	
+	
+	
+	@Override
+	protected List collectItemsFromImports() {
+		
+		List list = ModelHelper.getSchemas(modelObject,true);
+		
+		if (showMessages) {
+			list.addAll ( ModelHelper.getDefinitions(modelObject) );
+		}
+		
+		return list;
+	}
+
+	// https://jira.jboss.org/browse/JBIDE-7107
+	@Override
+	protected void updateOkState() {
+		super.updateOkState();
+		
+		boolean enabled = true;
+		computeResult();
+		Object obj = getFirstResult();
+		// We need to check whether namespace prefix has been already defined
+		if (obj instanceof Message) {
+			if (!checkNamespace((Message) obj)){
+				enabled = false;
+			}
+		}
+		if ( getResult().length<2 && this.requireLowerTreeSelection )
+			enabled = false;
+		
+		if (getOkButton()!=null)
+			getOkButton().setEnabled(enabled);
+	}
+
+	@Override
+	protected void okPressed() {
+		computeResult();
+		Object obj = getFirstResult();
+		// We need to check whether namespace prefix has been already defined
+		if (obj instanceof Message) {
+			if (!checkNamespace((Message) obj)){
+				return;
+			}
+		}
+		if ( getResult().length<2 && this.requireLowerTreeSelection )
+			return;
+		super.okPressed();
+	}
+
+	private boolean checkNamespace(Message message) {
+		String targetNamespace = message.getQName().getNamespaceURI();
+		String prefix = BPELUtils.getNamespacePrefix (modelObject, targetNamespace);
+		if (prefix != null) {
+			return true;
+		}
+		// We have to map the namespace to a prefix. 
+		NamespaceMappingDialog dialog = new NamespaceMappingDialog(getShell(),modelObject);
+		dialog.setNamespace( targetNamespace );
+		
+		if (dialog.open() == Window.CANCEL) {
+			return false;
+		}
+		
+		// define the prefix
+		BPELUtils.setPrefix( BPELUtils.getProcess(modelObject), targetNamespace, dialog.getPrefix()); 		
+		return true;
+	}
+			
+	
+	/**
+	 * https://issues.jboss.org/browse/JBIDE-8045
+	 * Enable or disable lower tree selection required flag (see this.requireLowerTreeSelection)
+	 * 
+	 * @param enabled
+	 */
+	public void setRequireLowerTreeSelection(boolean enabled)
+	{
+		this.requireLowerTreeSelection = enabled;
+	}
+	
+	// https://issues.jboss.org/browse/JBIDE-8045
+	public void setIncludeTypes(int includeTypes) {
+		this.includeTypes = includeTypes;
+	}
+	
+	// https://issues.jboss.org/browse/JBIDE-8045
+	// update the provider filters for only those types selected and available
+	private void setProviderFilters() {
+		
+		xsdTypeProvider.setFilter( FILTER_TYPES & includeTypes );
+		
+		// https://issues.jboss.org/browse/JBIDE-8075
+		// enable/disable selection of Message objects
+		if ( (includeTypes & INCLUDE_MESSAGE_TYPES) > 0 ) {
+			messageTypeProvider.setFilter( showMessages ? 1 : 0 );
+		}
+		else {
+			messageTypeProvider.setFilter( 0 );
+		}
+	}
+}
