diff --git a/plugins/org.eclipse.bpel.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.bpel.ui/META-INF/MANIFEST.MF
index 499c2bf..2fd10e7 100644
--- a/plugins/org.eclipse.bpel.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.bpel.ui/META-INF/MANIFEST.MF
@@ -25,7 +25,11 @@
  org.wsdl4j,
  org.eclipse.bpel.common.ui,
  org.eclipse.bpel.common.model,
- org.eclipse.bpel.model
+ org.eclipse.bpel.model,
+ org.eclipse.wst.wsdl.ui,
+ org.eclipse.wst.xsd.ui,
+ org.eclipse.wst.xml.core,
+ org.eclipse.wst.common.ui
 Eclipse-LazyStart: true
 Export-Package: org.eclipse.bpel.ui,
  org.eclipse.bpel.ui.actions,
diff --git a/plugins/org.eclipse.bpel.ui/plugin.xml b/plugins/org.eclipse.bpel.ui/plugin.xml
index eec624c..fecd48c 100644
--- a/plugins/org.eclipse.bpel.ui/plugin.xml
+++ b/plugins/org.eclipse.bpel.ui/plugin.xml
@@ -4,8 +4,8 @@
 
    <extension-point id="hoverHelpers" name="%HOVERHELP_HELPER_NAME"/>
    <extension-point id="expressionEditors" name="%EXPRESSION_LANGUAGE_EDITORS_NAME"/>
-   <extension-point id="actions" name="Actions" schema="schema/actions.exsd"/>
-   <extension-point id="modelListener" name="Model Listener" schema="schema/modelListener.exsd"/>
+   <extension-point id="actions" name="Actions" schema="schemas/actions.exsd"/>
+   <extension-point id="modelListener" name="Model Listener" schema="schemas/modelListener.exsd"/>
 
 
    <extension
@@ -196,7 +196,7 @@
               class="org.eclipse.bpel.ui.properties.ActionImplementationSection"
               tab="org.eclipse.bpel.ui.tabs.details"
               id="org.eclipse.bpel.ui.sections.ActionImplementationSection">
-           <input type="org.eclipse.bpel.Empty"/>
+           <input type="org.eclipse.bpel.model.Empty"/>
         </propertySection>
         <propertySection
                tab="org.eclipse.bpel.ui.tabs.description"
@@ -607,5 +607,51 @@
             class="org.eclipse.bpel.ui.uiextensionmodel.UiextensionmodelPackage">
       </package>
    </extension>
+   
+   	<extension
+		point="org.eclipse.wst.xml.core.catalogContributions">
+		<catalogContribution id="default">		
+			<public
+               publicId="http://schemas.xmlsoap.org/ws/2004/03/partner-link/"
+               uri="platform:/plugin/org.eclipse.bpel.ui/schemas/wsbpel_plinkType.xsd">           
+         </public>			
+		</catalogContribution>			
+		<catalogContribution id="default">		
+			<public
+               publicId="http://schemas.xmlsoap.org/ws/2004/03/business-process/"
+               uri="platform:/plugin/org.eclipse.bpel.ui/schemas/wsbpel_msgprop.xsd">           
+         </public>			
+		</catalogContribution>	
+	</extension>
+	
+	<extension
+		point="org.eclipse.wst.wsdl.ui.internalEditorExtensions">
+		<internalEditorExtension
+			class="org.eclipse.bpel.ui.wsdl.extensions.BPELWSDLEditorExtension" />
+	</extension>
+	
+ <extension
+       point="org.eclipse.wst.wsdl.ui.extensibilityItemTreeProviders">
+    <extensibilityItemTreeProvider
+          labelProviderClass="org.eclipse.bpel.ui.wsdl.extensions.BPELWSDLEditorExtension"
+          namespace="http://schemas.xmlsoap.org/ws/2004/03/business-process/"/>
+    <extensibilityItemTreeProvider
+          labelProviderClass="org.eclipse.bpel.ui.wsdl.extensions.BPELWSDLEditorExtension"
+          namespace="http://schemas.xmlsoap.org/ws/2004/03/partner-link/"/>
+ </extension>
+ 
+ <extension
+         point="org.eclipse.wst.wsdl.ui.propertyDescriptorProvider">
+      <propertyDescriptorProvider
+            namespace="http://schemas.xmlsoap.org/ws/2004/03/business-process/"
+            class="org.eclipse.bpel.ui.wsdl.extensions.properties.BPELBusinessProcessPropertyDescriptorProvider"/>
+   </extension>   
+   
+	<extension
+         point="org.eclipse.wst.wsdl.ui.propertyDescriptorProvider">
+      <propertyDescriptorProvider
+            namespace="http://schemas.xmlsoap.org/ws/2004/03/partner-link/"
+            class="org.eclipse.bpel.ui.wsdl.extensions.properties.BPELPartnerLinkPropertyDescriptorProvider"/>
+   </extension>  
 
 </plugin>
diff --git a/plugins/org.eclipse.bpel.ui/schema/actions.exsd b/plugins/org.eclipse.bpel.ui/schemas/actions.exsd
similarity index 100%
rename from plugins/org.eclipse.bpel.ui/schema/actions.exsd
rename to plugins/org.eclipse.bpel.ui/schemas/actions.exsd
diff --git a/plugins/org.eclipse.bpel.ui/schema/modelListener.exsd b/plugins/org.eclipse.bpel.ui/schemas/modelListener.exsd
similarity index 100%
rename from plugins/org.eclipse.bpel.ui/schema/modelListener.exsd
rename to plugins/org.eclipse.bpel.ui/schemas/modelListener.exsd
diff --git a/plugins/org.eclipse.bpel.ui/schemas/wsbpel_msgprop.xsd b/plugins/org.eclipse.bpel.ui/schemas/wsbpel_msgprop.xsd
new file mode 100644
index 0000000..1b9e56c
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/schemas/wsbpel_msgprop.xsd
@@ -0,0 +1,85 @@
+<?xml version='1.0' encoding="UTF-8"?>
+<!-- 
+2005-08-30: YIU-OSS: Alex Yiu: This XSD becomes merged into wsbpel_main.xsd, as a result of Issue 192. This XSD becomes obsolete.
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+	xmlns:tns="http://schemas.xmlsoap.org/ws/2004/03/business-process/"
+	targetNamespace="http://schemas.xmlsoap.org/ws/2004/03/business-process/"
+	elementFormDefault="qualified">
+	
+	<annotation>
+		<documentation>
+			Message Properties Schema
+			2004-03-24: YIU-OSS: Alex Yiu: Extracted from  wsbpel-specification-draft.doc (Rev 1.22 - Modified on 24 March, 2004)
+			2004-03-24: YIU-OSS: Alex Yiu: Updated targetNamespace with "2004/03"
+			2004-03-24: YIU-OSS: Alex Yiu: Adding minOccurs="0" to query element; fix the syntax typo in "propertyAlias" definition (e.g remove complexContent)
+			2004-04-07: YIU-OSS: Alex Yiu: removed unnecessary wsbp xmlns
+			2005-07-25: YIU-OSS: Alex Yiu: Apply Issue 196 by adding anyAttribute to query 
+			2005-08-30: YIU-OSS: Alex Yiu: This XSD becomes merged into wsbpel_main.xsd, as a result of Issue 192. This XSD becomes obsolete.
+
+		</documentation>
+	</annotation>
+	
+	<import namespace="http://www.w3.org/XML/1998/namespace"  schemaLocation="http://www.w3.org/2001/xml.xsd" />
+	<element name="documentation" id="documentation">
+		<complexType mixed="true">
+			<sequence minOccurs="0" maxOccurs="unbounded">
+				<any processContents="lax"/>
+			</sequence>
+			<attribute name="source" type="anyURI"/>
+			<attribute ref="xml:lang"/>
+		</complexType>
+	</element>
+	<complexType name="tExtensibleElements">
+		<annotation>
+			<documentation>
+		This type is extended by other component types
+		to allow elements and attributes from
+		other namespaces to be added.
+	   </documentation>
+		</annotation>
+		<sequence>
+			<element ref="tns:documentation" minOccurs="0" maxOccurs="unbounded" />
+			<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+		<anyAttribute namespace="##other" processContents="lax"/>
+	</complexType>
+
+    <element name="property">
+	    <complexType>
+			<complexContent>
+				<extension base="tns:tExtensibleElements">
+		<attribute name="name" type="NCName" use="required"/>
+		<attribute name="type" type="QName"/>
+		<attribute name="element" type="QName"/>
+				</extension>
+			</complexContent>
+	   </complexType>
+	</element>
+	
+		<complexType name="tQuery" mixed="true">
+		<sequence>
+			<any minOccurs="0" maxOccurs="unbounded"  processContents="lax"/>
+		</sequence>
+		<attribute name="queryLanguage" type="anyURI"/>
+		<anyAttribute namespace="##other" processContents="lax"/>
+	</complexType>
+
+	<element name="propertyAlias">
+		<complexType>
+			<complexContent>
+				<extension base="tns:tExtensibleElements">
+					<sequence>
+						<element name="query" minOccurs="0" type="tns:tQuery" />
+					</sequence>
+					<attribute name="propertyName" type="QName" use="required"/>
+					<attribute name="messageType" type="QName"/>
+					<attribute name="part" type="NCName"/>
+					<attribute name="type" type="QName"/>
+					<attribute name="element" type="QName"/>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+	
+</schema>
diff --git a/plugins/org.eclipse.bpel.ui/schemas/wsbpel_plinkType.xsd b/plugins/org.eclipse.bpel.ui/schemas/wsbpel_plinkType.xsd
new file mode 100644
index 0000000..349a725
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/schemas/wsbpel_plinkType.xsd
@@ -0,0 +1,64 @@
+<?xml version='1.0' encoding="UTF-8"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+	xmlns:tns="http://schemas.xmlsoap.org/ws/2004/03/partner-link/"
+	targetNamespace="http://schemas.xmlsoap.org/ws/2004/03/partner-link/"
+	elementFormDefault="qualified">
+
+	<annotation>
+		<documentation>
+			Partner Link Type Schema
+			2004-03-24: YIU-OSS: Alex Yiu: Extracted from  wsbpel-specification-draft.doc (Rev 1.22 - Modified on 24 March, 2004)
+			2004-03-24: YIU-OSS: Alex Yiu: Updated targetNamespace with "2004/03"
+			2004-10-21: YIU-OSS: Alex Yiu: Applied Issue 129
+			2005-08-30: Rev 1.4: YIU-OSS: Alex Yiu: Applied Issue 192 
+		</documentation>
+	</annotation>
+
+	<import namespace="http://www.w3.org/XML/1998/namespace"  schemaLocation="http://www.w3.org/2001/xml.xsd" />
+	<element name="documentation" id="documentation">
+		<complexType mixed="true">
+			<sequence minOccurs="0" maxOccurs="unbounded">
+				<any processContents="lax"/>
+			</sequence>
+			<attribute name="source" type="anyURI"/>
+			<attribute ref="xml:lang"/>
+		</complexType>
+	</element>
+	<complexType name="tExtensibleElements">
+		<annotation>
+			<documentation>
+		This type is extended by other component types
+		to allow elements and attributes from
+		other namespaces to be added.
+	   </documentation>
+		</annotation>
+		<sequence>
+			<element ref="tns:documentation" minOccurs="0" maxOccurs="unbounded" />
+			<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+		<anyAttribute namespace="##other" processContents="lax"/>
+	</complexType>
+
+	
+	<element name="partnerLinkType" type="tns:tPartnerLinkType"/>
+	
+	<complexType name="tPartnerLinkType">
+		<complexContent>
+			<extension base="tns:tExtensibleElements">
+				<sequence>
+					<element name="role" type="tns:tRole" minOccurs="1" maxOccurs="2"/>
+				</sequence>
+				<attribute name="name" type="NCName" use="required"/>
+			</extension> 
+		</complexContent> 
+	</complexType>
+	
+	<complexType name="tRole">
+		<complexContent>
+			<extension base="tns:tExtensibleElements">
+				<attribute name="name" type="NCName" use="required"/>
+				<attribute name="portType" type="QName" use="required" />
+			</extension>
+		</complexContent> 
+	</complexType>
+</schema>
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/Messages.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/Messages.java
index 1ad939b..eb15aff 100644
--- a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/Messages.java
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/Messages.java
@@ -488,6 +488,18 @@
 	public static String DateTimeSelector_Month_10;
 	public static String DateTimeSelector_Month_11;
 	public static String DateTimeSelector_Month_12;
+	
+	public static String BPELPropertyAliasQuerySection_Query_Language;
+	public static String BPELPropertyAliasQuerySection_Query;
+	
+	public static String BPELPartnerLinkRolesSection_Add;
+	public static String BPELPartnerLinkRolesSection_Remove;
+	public static String BPELPartnerLinkRolesSection_Roles;
+	
+	public static String BPELPartnerLinkRolesSection_Role_Name;
+	public static String BPELPartnerLinkRolesSection_Role_PortType;
+
+	public static String BPELWSDLComponentSelectionDialog;
 
 	public static String ShowPropertiesViewAction_actionText;
 	
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/messages.properties b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/messages.properties
index 11785f3..bfd54ce 100644
--- a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/messages.properties
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/messages.properties
@@ -480,3 +480,14 @@
 DateTimeSelector_Month_12=Dec
 
 ShowPropertiesViewAction_actionText=Show in Properties
+
+BPELPropertyAliasQuerySection_Query_Language=&Query language\:
+BPELPropertyAliasQuerySection_Query=&Query\:
+
+BPELPartnerLinkRolesSection_Add=&Add
+BPELPartnerLinkRolesSection_Remove=&Remove
+BPELPartnerLinkRolesSection_Roles=&Roles\:
+BPELPartnerLinkRolesSection_Role_Name=Name
+BPELPartnerLinkRolesSection_Role_PortType=Port Type
+
+BPELWSDLComponentSelectionDialog=Select WSDL Component
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELPartnerLinkRolesSection.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELPartnerLinkRolesSection.java
new file mode 100644
index 0000000..e204a87
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELPartnerLinkRolesSection.java
@@ -0,0 +1,276 @@
+package org.eclipse.bpel.ui.wsdl.extensions;
+
+import org.eclipse.bpel.common.ui.details.IDetailsAreaConstants;
+import org.eclipse.bpel.common.ui.flatui.FlatFormAttachment;
+import org.eclipse.bpel.common.ui.flatui.FlatFormData;
+import org.eclipse.bpel.common.ui.flatui.FlatFormLayout;
+import org.eclipse.bpel.model.partnerlinktype.PartnerLinkType;
+import org.eclipse.bpel.model.partnerlinktype.Role;
+import org.eclipse.bpel.model.partnerlinktype.util.PartnerlinktypeConstants;
+import org.eclipse.bpel.ui.Messages;
+import org.eclipse.bpel.ui.details.providers.AbstractContentProvider;
+import org.eclipse.bpel.ui.details.providers.ColumnTableProvider;
+import org.eclipse.bpel.ui.properties.BPELPropertySection;
+import org.eclipse.bpel.ui.util.BPELUtil;
+import org.eclipse.bpel.ui.util.TableCursor;
+import org.eclipse.bpel.ui.wsdl.extensions.properties.WSDLComponentSelectionDialogPropertyDescriptor;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.internal.provisional.AbstractPropertySection;
+import org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
+import org.eclipse.wst.wsdl.ui.internal.WSDLEditor;
+import org.eclipse.wst.wsdl.ui.internal.actions.AddElementAction;
+import org.eclipse.wst.wsdl.ui.internal.actions.DeleteAction;
+import org.eclipse.wst.wsdl.util.WSDLConstants;
+import org.w3c.dom.Element;
+
+public class BPELPartnerLinkRolesSection extends AbstractPropertySection {
+	
+	protected PartnerLinkType plink;
+	
+	protected Table rolesTable;
+	protected TableViewer rolesViewer;
+	protected ColumnTableProvider tableProvider;
+	protected TableCursor tableCursor = null;
+
+	protected Button addButton;
+	protected Button removeButton;
+	
+	protected WSDLEditor editor;
+	
+	public void aboutToBeHidden() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void aboutToBeShown() {
+		refresh();
+	}
+	
+	public class PortTypeColumn extends ColumnTableProvider.Column implements ILabelProvider, ICellModifier {
+		public String getHeaderText() { return Messages.BPELPartnerLinkRolesSection_Role_PortType; } 
+		public String getProperty() { return PartnerlinktypeConstants.PORT_TYPE_ATTRIBUTE; } //$NON-NLS-1$
+		public int getInitialWeight() { return 10; }
+		
+		public CellEditor createCellEditor(Composite parent) {
+			return WSDLComponentSelectionDialogPropertyDescriptor.createCellEditor(parent, editor, WSDLConstants.PORT_TYPE, null);
+		}
+
+		public String getText(Object element) {
+			if (((Role)element).getElement().hasAttribute(PartnerlinktypeConstants.PORT_TYPE_ATTRIBUTE))
+				return ((Role)element).getElement().getAttribute(PartnerlinktypeConstants.PORT_TYPE_ATTRIBUTE);
+			else 
+				return ""; 
+		}
+		public boolean canModify(Object element, String property) {
+			return true;
+		}
+		public Object getValue(Object element, String property) {
+			return ((Role)element).getElement().getAttribute(PartnerlinktypeConstants.PORT_TYPE_ATTRIBUTE);
+		}
+		public void modify(Object element, String property, Object value) {
+			((Role)element).getElement().setAttribute(PartnerlinktypeConstants.PORT_TYPE_ATTRIBUTE, (String)value);
+			refresh();
+		}
+	}
+
+	public class NameColumn extends ColumnTableProvider.Column implements ILabelProvider, ICellModifier {
+		public String getHeaderText() { return Messages.BPELPartnerLinkRolesSection_Role_Name; } 
+		public String getProperty() { return PartnerlinktypeConstants.NAME_ATTRIBUTE; } //$NON-NLS-1$
+		public int getInitialWeight() { return 10; }
+		
+		public CellEditor createCellEditor(Composite parent) {
+			CellEditor result = new TextCellEditor();
+			result.create(parent);
+			return result;
+		}
+		public String getText(Object element) {
+			return ((Role)element).getName();
+		}
+		public boolean canModify(Object element, String property) {
+			return true;
+		}
+		public Object getValue(Object element, String property) {
+			return ((Role)element).getName();
+		}
+		public void modify(Object element, String property, Object value) {
+			((Role)element).setName((String)value);
+			refresh();
+		}
+	}
+
+	
+	public void createControls(Composite parent, TabbedPropertySheetPage page) {
+		FlatFormData data;
+		Composite composite = page.getWidgetFactory().createFlatFormComposite(parent);
+		FlatFormLayout formLayout = new FlatFormLayout();
+		formLayout.marginWidth = formLayout.marginHeight = 0;
+		composite.setLayout(formLayout);
+		
+		addButton = page.getWidgetFactory().createButton(composite, Messages.BPELPartnerLinkRolesSection_Add, SWT.PUSH); 
+		removeButton = page.getWidgetFactory().createButton(composite, Messages.BPELPartnerLinkRolesSection_Remove, SWT.PUSH); 
+		Label rolesLabel = page.getWidgetFactory().createLabel(composite, Messages.BPELPartnerLinkRolesSection_Roles); 
+		rolesTable = page.getWidgetFactory().createTable(composite, SWT.FULL_SELECTION | SWT.V_SCROLL);
+
+		data = new FlatFormData();
+		data.left = new FlatFormAttachment(0, 0);
+		data.top = new FlatFormAttachment(0, 0);
+		rolesLabel.setLayoutData(data);
+		
+		data = new FlatFormData();
+		data.width = BPELUtil.calculateButtonWidth(addButton, BPELPropertySection.STANDARD_BUTTON_WIDTH);
+		data.right = new FlatFormAttachment(removeButton, -IDetailsAreaConstants.HSPACE);
+		data.top = new FlatFormAttachment(0, 0);
+		addButton.setLayoutData(data);
+		
+		data = new FlatFormData();
+		data.width = BPELUtil.calculateButtonWidth(removeButton, BPELPropertySection.STANDARD_BUTTON_WIDTH);
+		data.right = new FlatFormAttachment(100, 0);
+		data.top = new FlatFormAttachment(0, 0);
+		removeButton.setLayoutData(data);
+		removeButton.setEnabled(false);
+		
+		addButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				Action action = new AddElementAction("Add role",getPartnerLinkType().getElement(),getPartnerLinkType().getElement().getPrefix(),PartnerlinktypeConstants.ROLE_ELEMENT_TAG){
+
+					protected void addAttributes(Element newElement) {
+						newElement.setAttribute(PartnerlinktypeConstants.NAME_ATTRIBUTE, "NCName");												
+					}
+									
+				};
+				action.run();
+				updateButtonEnablement();
+				if (tableCursor != null) 
+					tableCursor.refresh();					
+			}
+			public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); }
+		});
+		Listener removeListener = new Listener() {
+			public void handleEvent(Event e) {
+				if (e.type == SWT.KeyUp && e.character != SWT.DEL)  return;
+				int selectionIndex = rolesTable.getSelectionIndex();
+				IStructuredSelection sel = (IStructuredSelection)rolesViewer.getSelection();
+				Action action = new DeleteAction(((IStructuredSelection)sel).getFirstElement(),null);
+				action.run();
+				// selects the element at the deleted element position
+				int items = rolesTable.getItemCount();
+				if (items > 0) {
+					selectionIndex = (selectionIndex < items) ? selectionIndex : 0;
+					rolesTable.setSelection(selectionIndex);
+				}
+				if (tableCursor != null)
+					tableCursor.refresh();
+				updateButtonEnablement();
+			}
+		};
+		rolesTable.addListener(SWT.KeyUp, removeListener);
+		
+		removeButton.addListener(SWT.Selection, removeListener);
+		removeButton.addListener(SWT.DefaultSelection, removeListener);
+		
+		data = new FlatFormData();
+		data.left = new FlatFormAttachment(0, 0);
+		data.right = new FlatFormAttachment(100, 0);
+		data.top = new FlatFormAttachment(addButton, IDetailsAreaConstants.VSPACE);
+		data.bottom = new FlatFormAttachment(100, 0);
+		rolesTable.setLayoutData(data);
+
+		rolesTable.setLinesVisible(true);
+		rolesTable.setHeaderVisible(true);
+		
+		tableProvider = new ColumnTableProvider();
+		tableProvider.add(new NameColumn());
+		tableProvider.add(new PortTypeColumn());
+		
+		rolesTable.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				removeButton.setEnabled(!rolesViewer.getSelection().isEmpty());
+			}
+			public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); }
+		});
+	
+		rolesViewer = new TableViewer(rolesTable);
+		tableProvider.createTableLayout(rolesTable);
+		rolesViewer.setLabelProvider(tableProvider);
+		rolesViewer.setCellModifier(tableProvider);
+		rolesViewer.setContentProvider(new AbstractContentProvider(){
+
+			public Object[] getElements(Object inputElement) {
+				// TODO Auto-generated method stub
+				return ((PartnerLinkType)inputElement).getRole().toArray();
+			}
+			
+		});
+		// TODO: should this have a sorter?
+		rolesViewer.setColumnProperties(tableProvider.getColumnProperties());
+		rolesViewer.addSelectionChangedListener(new ISelectionChangedListener(){
+			public void selectionChanged(SelectionChangedEvent event) {
+				updateButtonEnablement();
+			}
+		});
+		
+		tableCursor = BPELUtil.createTableCursor(rolesTable, rolesViewer);
+	}
+	
+	protected void updateButtonEnablement(){
+		boolean hasSelection = !rolesViewer.getSelection().isEmpty();
+		removeButton.setEnabled(hasSelection && getPartnerLinkType().getRole().size() == 2);
+		addButton.setEnabled(getPartnerLinkType().getRole().size() < 2);
+	}	
+
+	
+	public void dispose() {
+		// TODO Auto-generated method stub
+		
+	}
+	
+	public void refresh(){
+		rolesViewer.refresh();
+	}
+
+	public int getMinimumHeight() {
+		// TODO Auto-generated method stub
+		return SWT.DEFAULT;
+	}
+
+	public void setInput(IWorkbenchPart arg0, ISelection selection) {
+		Assert.isTrue(selection instanceof IStructuredSelection);
+		plink = (PartnerLinkType)((IStructuredSelection)selection).getFirstElement();		
+		editor = (WSDLEditor)arg0;		
+		rolesViewer.setCellEditors(tableProvider.createCellEditors(rolesTable));	
+		rolesViewer.setInput(plink);
+		updateButtonEnablement();
+	}
+	
+	public PartnerLinkType getPartnerLinkType() {
+		return plink;
+	}
+
+	public boolean shouldUseExtraSpace() {
+		// TODO Auto-generated method stub
+		return true;
+	}
+
+	
+	
+}
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELPartnerLinkTypeSectionDescriptor.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELPartnerLinkTypeSectionDescriptor.java
new file mode 100644
index 0000000..c80c269
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELPartnerLinkTypeSectionDescriptor.java
@@ -0,0 +1,50 @@
+package org.eclipse.bpel.ui.wsdl.extensions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.bpel.model.partnerlinktype.PartnerLinkType;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.internal.provisional.ISection;
+import org.eclipse.wst.wsdl.ui.internal.properties.section.AbstractSectionDescriptor;
+
+public class BPELPartnerLinkTypeSectionDescriptor extends AbstractSectionDescriptor{
+
+	/* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+	   */
+	  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+	  {
+	    if (selection instanceof StructuredSelection)
+	    {
+	      StructuredSelection structuredSelection = (StructuredSelection)selection;	      
+	      return structuredSelection.getFirstElement() instanceof PartnerLinkType;
+	    }
+	    return false;
+	  }
+
+
+	public String getId() {
+		// TODO Auto-generated method stub
+		return "org.eclipse.bpel.ui.section.other.partnerLinkType";
+	}
+
+	public List getInputTypes() {
+		List list = new ArrayList();
+	    list.add(PartnerLinkType.class);	    
+	    return list;
+	}
+
+	public ISection getSectionClass() {
+		// TODO Auto-generated method stub
+		return new BPELPartnerLinkRolesSection();
+	}
+
+	public String getTargetTab() {
+		// TODO Auto-generated method stub
+		return "org.eclipse.wst.xmlwebservices.other";
+	}
+
+}
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELPropertyAliasQuerySection.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELPropertyAliasQuerySection.java
new file mode 100644
index 0000000..404e809
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELPropertyAliasQuerySection.java
@@ -0,0 +1,346 @@
+package org.eclipse.bpel.ui.wsdl.extensions;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.eclipse.bpel.common.ui.details.IDetailsAreaConstants;
+import org.eclipse.bpel.common.ui.details.viewers.CComboViewer;
+import org.eclipse.bpel.common.ui.flatui.FlatFormAttachment;
+import org.eclipse.bpel.common.ui.flatui.FlatFormData;
+import org.eclipse.bpel.common.ui.flatui.FlatFormLayout;
+import org.eclipse.bpel.model.messageproperties.MessagepropertiesFactory;
+import org.eclipse.bpel.model.messageproperties.PropertyAlias;
+import org.eclipse.bpel.model.messageproperties.Query;
+import org.eclipse.bpel.ui.Messages;
+import org.eclipse.bpel.ui.details.providers.ExpressionEditorDescriptorContentProvider;
+import org.eclipse.bpel.ui.details.providers.ExpressionEditorDescriptorLabelProvider;
+import org.eclipse.bpel.ui.details.providers.ModelTreeLabelProvider;
+import org.eclipse.bpel.ui.details.providers.ModelViewerSorter;
+import org.eclipse.bpel.ui.details.tree.ITreeNode;
+import org.eclipse.bpel.ui.extensions.BPELUIRegistry;
+import org.eclipse.bpel.ui.extensions.ExpressionEditorDescriptor;
+import org.eclipse.bpel.ui.properties.BPELPropertySection;
+import org.eclipse.bpel.ui.util.BPELUtil;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.internal.provisional.ISection;
+import org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDNamedComponent;
+
+public class BPELPropertyAliasQuerySection implements ISection,
+		ISelectionChangedListener {
+
+	public void selectionChanged(SelectionChangedEvent event) {
+		if (((IStructuredSelection) queryLanguageViewer.getSelection())
+				.getFirstElement() instanceof ExpressionEditorDescriptor) {
+			editorAreaComposite.setVisible(true);
+			ExpressionEditorDescriptor desc = (ExpressionEditorDescriptor) ((IStructuredSelection) queryLanguageViewer
+					.getSelection()).getFirstElement();
+			if (palias.getQuery() == null) {
+				Query newQuery = MessagepropertiesFactory.eINSTANCE
+						.createQuery();
+				newQuery.setQueryLanguage(desc.getExpressionLanguage());
+				palias.setQuery(newQuery);
+			} else {
+				palias.getQuery()
+						.setQueryLanguage(desc.getExpressionLanguage());
+			}
+
+		} else if (NO_QUERY.equals(((IStructuredSelection) queryLanguageViewer
+				.getSelection()).getFirstElement())) {
+			palias.setQuery(null);
+			editorAreaComposite.setVisible(false);
+			query.setText("");
+			referenceViewer.setSelection(StructuredSelection.EMPTY, false);
+			referenceViewer.collapseAll();			
+		}
+	}
+
+	public void refresh() {
+			}
+
+	protected PropertyAlias palias;
+
+	protected CCombo queryLanguageCCombo;
+
+	protected CComboViewer queryLanguageViewer;
+
+	protected TreeViewer referenceViewer;
+
+	protected Text query;
+
+	protected Composite editorAreaComposite, parentComposite;
+
+	protected TabbedPropertySheetPage page;
+
+	// Pseudo-model object to represent no expression at all (in which case no
+	// editor
+	// is used).
+	protected static final Object NO_QUERY = new Object();
+
+	public void aboutToBeHidden() {
+		// TODO Auto-generated method stub
+
+	}
+
+	public void aboutToBeShown() {
+		refresh();
+	}
+
+	public void createControls(Composite parent, TabbedPropertySheetPage page) {
+		FlatFormData data;
+		this.page = page;
+		parentComposite = page.getWidgetFactory().createFlatFormComposite(
+				parent);
+		FlatFormLayout layout = new FlatFormLayout();
+		layout.marginHeight = layout.marginWidth = 0;
+		parentComposite.setLayout(layout);
+
+		Label queryLanguageLabel = page.getWidgetFactory().createLabel(
+				parentComposite, Messages.BPELPropertyAliasQuerySection_Query_Language);
+		queryLanguageCCombo = page.getWidgetFactory().createCCombo(
+				parentComposite, SWT.FLAT);
+
+		data = new FlatFormData();
+		data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(
+				queryLanguageLabel,
+				BPELPropertySection.STANDARD_LABEL_WIDTH_LRG));
+		data.right = new FlatFormAttachment(100, 0);
+		data.top = new FlatFormAttachment(0, 0);
+		queryLanguageCCombo.setLayoutData(data);
+
+		// Query language combo layout
+		queryLanguageViewer = new CComboViewer(queryLanguageCCombo);
+
+		queryLanguageViewer
+				.setLabelProvider(new ExpressionEditorDescriptorLabelProvider() {
+
+					public String getText(Object element) {
+						if (NO_QUERY.equals(element))
+							return "No query";
+						return super.getText(element);
+					}
+
+				});
+		queryLanguageViewer
+				.setContentProvider(new ExpressionEditorDescriptorContentProvider() {
+
+					public Object[] getElements(Object inputElement) {
+						Object[] elements = super.getElements(inputElement);
+						List newElements = new ArrayList(elements.length + 1);
+						newElements.add(NO_QUERY);
+						for (int i = 0; i < elements.length; i++) {
+							newElements.add(elements[i]);
+						}
+						return newElements.toArray();
+					}
+
+				});
+		queryLanguageViewer.setSorter(ModelViewerSorter.getInstance());
+		queryLanguageViewer.addSelectionChangedListener(this);
+		queryLanguageViewer.setInput(new Object());
+
+		data = new FlatFormData();
+		data.left = new FlatFormAttachment(0, 0);
+		data.right = new FlatFormAttachment(queryLanguageCCombo,
+				-IDetailsAreaConstants.HSPACE);
+		data.top = new FlatFormAttachment(queryLanguageCCombo, 0, SWT.CENTER);
+		queryLanguageLabel.setLayoutData(data);
+
+		editorAreaComposite = page.getWidgetFactory().createFlatFormComposite(
+				parentComposite);
+		layout = new FlatFormLayout();
+		layout.marginHeight = layout.marginWidth = 0;
+		editorAreaComposite.setLayout(layout);
+
+		data = new FlatFormData();
+		data.top = new FlatFormAttachment(queryLanguageCCombo,
+				IDetailsAreaConstants.VSPACE);
+		data.left = new FlatFormAttachment(0, 0);
+		data.right = new FlatFormAttachment(100, 0);
+		data.bottom = new FlatFormAttachment(100, 0);
+		editorAreaComposite.setLayoutData(data);
+
+		Label queryLabel = page.getWidgetFactory().createLabel(
+				editorAreaComposite,
+				Messages.BPELPropertyAliasQuerySection_Query);
+		query = page.getWidgetFactory().createText(editorAreaComposite, "",
+				SWT.READ_ONLY);
+		Tree referenceTree = page.getWidgetFactory().createTree(
+				editorAreaComposite, SWT.BORDER);
+		BPELQueryTreeContentProvider referenceContentProvider = new BPELQueryTreeContentProvider(
+				true);
+		referenceViewer = new TreeViewer(referenceTree);
+		referenceViewer.setContentProvider(referenceContentProvider);
+		referenceViewer.setLabelProvider(new ModelTreeLabelProvider());
+		referenceViewer
+				.addSelectionChangedListener(new ISelectionChangedListener() {
+					public void selectionChanged(SelectionChangedEvent event) {
+						updateQueryFieldFromTreeSelection();
+					}
+				});
+
+		data = new FlatFormData();
+		data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(
+				queryLabel, BPELPropertySection.STANDARD_LABEL_WIDTH_LRG));
+		data.right = new FlatFormAttachment(100, -IDetailsAreaConstants.HSPACE);
+		data.bottom = new FlatFormAttachment(100, 0);
+		data.top = new FlatFormAttachment(100, -query.getLineHeight()
+				- IDetailsAreaConstants.VSPACE);
+		query.setLayoutData(data);
+
+		data = new FlatFormData();
+		data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(
+				queryLabel, BPELPropertySection.STANDARD_LABEL_WIDTH_LRG));
+		data.right = new FlatFormAttachment(100, 0);
+		data.top = new FlatFormAttachment(queryLanguageCCombo,
+				IDetailsAreaConstants.VSPACE, SWT.BOTTOM);
+		data.bottom = new FlatFormAttachment(query,
+				-IDetailsAreaConstants.VSPACE, SWT.TOP);
+		referenceTree.setLayoutData(data);
+
+		data = new FlatFormData();
+		data.left = new FlatFormAttachment(0, 0);
+		data.right = new FlatFormAttachment(referenceTree,
+				-IDetailsAreaConstants.HSPACE);
+		data.top = new FlatFormAttachment(referenceTree, 0, SWT.CENTER);
+		queryLabel.setLayoutData(data);
+	}
+
+	protected void updateQueryFieldFromTreeSelection() {
+		IStructuredSelection sel = (IStructuredSelection) referenceViewer
+				.getSelection();
+		if (palias.getQuery() != null && sel.getFirstElement() != null) {
+			Object[] path = ((BPELQueryTreeContentProvider) referenceViewer
+					.getContentProvider()).getPathToRoot(sel.getFirstElement());
+			String queryText = ""; //$NON-NLS-1$
+			for (int i = 0; i < path.length - 1; i++) {
+				Object modelObject = BPELUtil
+						.resolveXSDObject(((ITreeNode) path[i])
+								.getModelObject());
+				if (modelObject instanceof XSDElementDeclaration
+						|| modelObject instanceof XSDAttributeDeclaration) {
+					String nameSegment = ((XSDNamedComponent) modelObject)
+							.getName();
+					if (nameSegment != null) {
+						if (!queryText.equals("")) { //$NON-NLS-1$
+							queryText = nameSegment + "/" + queryText; //$NON-NLS-1$
+						} else {
+							queryText = nameSegment;
+						}
+					}
+				}
+			}
+			if (queryText.length() > 0) {
+				queryText = "/" + queryText; //$NON-NLS-1$
+				Query newQuery = MessagepropertiesFactory.eINSTANCE
+						.createQuery();
+				newQuery.setQueryLanguage(palias.getQuery().getQueryLanguage());
+				newQuery.setValue(queryText);
+				palias.setQuery(newQuery);
+			} else {
+				Query newQuery = MessagepropertiesFactory.eINSTANCE
+						.createQuery();
+				newQuery.setQueryLanguage(palias.getQuery().getQueryLanguage());
+				palias.setQuery(newQuery);
+			}
+			query.setText(queryText);
+		}
+
+	}
+
+	public void dispose() {
+		// TODO Auto-generated method stub
+
+	}
+
+	public int getMinimumHeight() {
+		// TODO Auto-generated method stub
+		return SWT.DEFAULT;
+	}
+
+	public void setInput(IWorkbenchPart arg0, ISelection selection) {
+		Assert.isTrue(selection instanceof IStructuredSelection);
+		palias = (PropertyAlias) ((IStructuredSelection) selection)
+				.getFirstElement();
+		if (palias != null) {
+			referenceViewer.setInput(palias);
+			Object model = NO_QUERY;
+			if (palias.getQuery() != null) {
+				String language = palias.getQuery().getQueryLanguage();
+				if (language != null) {
+					ExpressionEditorDescriptor descriptor = BPELUIRegistry
+							.getInstance().getExpressionEditorDescriptor(
+									language);
+					if (descriptor != null) {
+						model = descriptor;
+					}
+				}
+				editorAreaComposite.setVisible(true);
+				String queryText = palias.getQuery().getValue();
+				
+				if (queryText != null && queryText.length() > 0){					
+					Object[] items = ((BPELQueryTreeContentProvider) referenceViewer
+							.getContentProvider()).getElements(palias);
+					ITreeNode node = (ITreeNode)items[0];
+					
+					StringTokenizer tokenizer = new StringTokenizer(queryText,"/");
+				
+					while (tokenizer.hasMoreTokens()){
+						String token = tokenizer.nextToken();	
+					
+						Object[] children = ((BPELQueryTreeContentProvider) referenceViewer
+								.getContentProvider()).getChildren(node);
+						
+						for (int  i = 0 ; i < children.length; i++) {
+							Object originalMatch = ((ITreeNode) children[i]).getModelObject();
+							Object match = BPELUtil.resolveXSDObject(originalMatch);
+							if (match instanceof XSDElementDeclaration	|| match instanceof XSDAttributeDeclaration) {								
+								if (token.equals(((XSDNamedComponent) match).getName())) {
+									node = (ITreeNode) children[i];
+									break;
+								}
+							}	
+						}
+					}					
+					referenceViewer.expandToLevel(node, 0);
+					referenceViewer.setSelection(new StructuredSelection(node),
+							true);
+				}
+			} else {
+				editorAreaComposite.setVisible(false);
+				referenceViewer.setSelection(StructuredSelection.EMPTY, false);	
+				referenceViewer.collapseAll();
+			}
+
+			queryLanguageViewer.removeSelectionChangedListener(this);
+			queryLanguageViewer.setSelection(new StructuredSelection(model));
+			queryLanguageViewer.addSelectionChangedListener(this);
+
+			
+		}
+
+		
+	}
+
+	public boolean shouldUseExtraSpace() {
+		// TODO Auto-generated method stub
+		return true;
+	}
+
+}
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELPropertyAliasSectionDescriptor.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELPropertyAliasSectionDescriptor.java
new file mode 100644
index 0000000..8e1e3c4
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELPropertyAliasSectionDescriptor.java
@@ -0,0 +1,49 @@
+package org.eclipse.bpel.ui.wsdl.extensions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.bpel.model.messageproperties.PropertyAlias;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.internal.provisional.ISection;
+import org.eclipse.wst.wsdl.ui.internal.properties.section.AbstractSectionDescriptor;
+
+public class BPELPropertyAliasSectionDescriptor extends AbstractSectionDescriptor{
+
+	/* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+	   */
+	  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+	  {
+	    if (selection instanceof StructuredSelection)
+	    {
+	      StructuredSelection structuredSelection = (StructuredSelection)selection;	      
+	      return structuredSelection.getFirstElement() instanceof PropertyAlias;
+	    }
+	    return false;
+	  }
+
+	public String getId() {
+		// TODO Auto-generated method stub
+		return "org.eclipse.bpel.ui.section.other.propertyAlias";
+	}
+
+	public List getInputTypes() {
+		List list = new ArrayList();
+	    list.add(PropertyAlias.class);	    
+	    return list;
+	}
+
+	public ISection getSectionClass() {
+		// TODO Auto-generated method stub
+		return new BPELPropertyAliasQuerySection();
+	}
+
+	public String getTargetTab() {
+		// TODO Auto-generated method stub
+		return "org.eclipse.wst.xmlwebservices.other";
+	}
+
+}
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELQueryTreeContentProvider.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELQueryTreeContentProvider.java
new file mode 100644
index 0000000..eb2ca5e
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELQueryTreeContentProvider.java
@@ -0,0 +1,44 @@
+package org.eclipse.bpel.ui.wsdl.extensions;
+
+import java.util.Iterator;
+
+import org.eclipse.bpel.model.messageproperties.PropertyAlias;
+import org.eclipse.bpel.ui.details.providers.ModelTreeContentProvider;
+import org.eclipse.bpel.ui.details.tree.PartTreeNode;
+import org.eclipse.bpel.ui.details.tree.XSDElementDeclarationTreeNode;
+import org.eclipse.bpel.ui.details.tree.XSDTypeDefinitionTreeNode;
+import org.eclipse.wst.wsdl.Message;
+import org.eclipse.wst.wsdl.Part;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDTypeDefinition;
+
+public class BPELQueryTreeContentProvider extends ModelTreeContentProvider{
+
+	public BPELQueryTreeContentProvider(boolean isCondensed) {
+		super(isCondensed);
+		// TODO Auto-generated constructor stub
+	}
+	
+	public Object[] primGetElements(Object inputElement) {
+		
+		if (inputElement instanceof PropertyAlias){
+			PropertyAlias palias = (PropertyAlias)inputElement;			
+			if (palias.getMessageType() != null )  {
+				Message msg = (Message)palias.getMessageType();
+				Iterator partsIterator = msg.getEParts().iterator();
+				while (partsIterator.hasNext()) {
+					Part part = (Part)partsIterator.next();
+					if (part.getName().equals(palias.getPart())) {
+						return new Object[]{ new PartTreeNode(part, isCondensed, true)};
+					}
+				}			
+			} else if (palias.getType() != null) {
+				return new Object[]{new XSDTypeDefinitionTreeNode((XSDTypeDefinition)palias.getType(), isCondensed)};
+			} else if (palias.getXSDElement() != null) {
+				return new Object[]{ new XSDElementDeclarationTreeNode((XSDElementDeclaration)palias.getXSDElement(), isCondensed)};			
+			}
+		}
+		throw new IllegalStateException();		
+	}
+
+}
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELWSDLComponentSelectionProvider.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELWSDLComponentSelectionProvider.java
new file mode 100644
index 0000000..83bcad6
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELWSDLComponentSelectionProvider.java
@@ -0,0 +1,56 @@
+package org.eclipse.bpel.ui.wsdl.extensions;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.wst.wsdl.Definition;
+import org.eclipse.wst.wsdl.ui.internal.dialogs.types.WSDLComponentSelectionProvider;
+import org.eclipse.wst.xsd.ui.internal.dialogs.types.common.IComponentList;
+
+public class BPELWSDLComponentSelectionProvider extends WSDLComponentSelectionProvider{
+
+	public static int PROPERTY = 1809;
+	
+	private int kind;
+	
+	public BPELWSDLComponentSelectionProvider(IFile file, Definition definition, int kind, List validExt) {
+		super(file, definition, kind, validExt);
+		this.kind = kind;
+	}
+
+	public BPELWSDLComponentSelectionProvider(IFile file, Definition definition, int kind) {
+		super(file, definition, kind);
+		this.kind = kind;
+	}
+
+	public void getComponents(IComponentList list, boolean quick) {
+		if (PROPERTY == kind){
+			
+		} else {
+			super.getComponents(list, quick);
+		}
+	}
+
+	public ILabelProvider getLabelProvider() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public String getListTitle() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public String getNameFieldTitle() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public String getType(Object component) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+
+}
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELWSDLEditorExtension.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELWSDLEditorExtension.java
new file mode 100644
index 0000000..577f9ab
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/BPELWSDLEditorExtension.java
@@ -0,0 +1,48 @@
+package org.eclipse.bpel.ui.wsdl.extensions;
+
+import org.eclipse.bpel.ui.BPELUIPlugin;
+import org.eclipse.bpel.ui.IBPELUIConstants;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor;
+import org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptorProvider;
+import org.eclipse.wst.wsdl.ui.internal.WSDLEditor;
+import org.eclipse.wst.wsdl.ui.internal.extension.WSDLEditorExtension;
+import org.w3c.dom.Node;
+
+public class BPELWSDLEditorExtension extends LabelProvider implements WSDLEditorExtension {
+
+	public Object createExtensionObject(int type, final WSDLEditor wsdlEditor) {
+		if (type == PROPERTY_SECTION_DESCRIPTOR_PROVIDER){
+			return new ISectionDescriptorProvider(){
+
+				public ISectionDescriptor[] getSectionDescriptors() {
+					// TODO Auto-generated method stub
+					return new ISectionDescriptor[]{new BPELPartnerLinkTypeSectionDescriptor(),new BPELPropertyAliasSectionDescriptor()};
+					
+				}
+				
+			};
+		} 
+		return null;
+	}
+
+	public boolean isApplicable(Object modelObject) {
+		return true;
+	}
+
+	public boolean isExtensionTypeSupported(int type) {
+		return type == PROPERTY_SECTION_DESCRIPTOR_PROVIDER;
+	}
+
+	public Image getImage(Object element) {
+		// TODO Auto-generated method stub
+		return BPELUIPlugin.getPlugin().getImageDescriptor(IBPELUIConstants.ICON_PROCESS_16).createImage();
+	}
+
+	public String getText(Object element) {
+		// TODO Auto-generated method stub
+		return ((Node)element).getNodeName();
+	}
+
+}
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELBusinessProcessPropertyDescriptorProvider.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELBusinessProcessPropertyDescriptorProvider.java
new file mode 100644
index 0000000..21d1bcb
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELBusinessProcessPropertyDescriptorProvider.java
@@ -0,0 +1,33 @@
+package org.eclipse.bpel.ui.wsdl.extensions.properties;
+
+import org.eclipse.bpel.model.messageproperties.util.MessagepropertiesConstants;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.wst.wsdl.ui.internal.WSDLEditor;
+import org.eclipse.wst.wsdl.ui.internal.properties.section.IPropertyDescriptorProvider;
+import org.eclipse.wst.wsdl.ui.internal.util.WSDLEditorUtil;
+import org.eclipse.wst.wsdl.util.WSDLConstants;
+import org.w3c.dom.Element;
+
+public class BPELBusinessProcessPropertyDescriptorProvider implements IPropertyDescriptorProvider{
+
+	public IPropertyDescriptor getPropertyDescriptor(final IEditorPart editor, Element ownerElement, String attributeNamespace, String attributeName) {
+		if (MessagepropertiesConstants.PROPERTY_ALIAS_MESSAGE_TYPE_ATTRIBUTE.equals(attributeName)) {
+			return new WSDLComponentSelectionDialogPropertyDescriptor(MessagepropertiesConstants.PROPERTY_ALIAS_MESSAGE_TYPE_ATTRIBUTE,MessagepropertiesConstants.PROPERTY_ALIAS_MESSAGE_TYPE_ATTRIBUTE,(WSDLEditor)editor,WSDLConstants.MESSAGE, ownerElement);
+		} else if (MessagepropertiesConstants.PROPERTY_ALIAS_XSD_ELEMENT_ATTRIBUTE.equals(attributeName)) {
+			return new WSDLComponentSelectionDialogPropertyDescriptor(MessagepropertiesConstants.PROPERTY_ALIAS_XSD_ELEMENT_ATTRIBUTE,MessagepropertiesConstants.PROPERTY_ALIAS_XSD_ELEMENT_ATTRIBUTE,(WSDLEditor)editor,WSDLEditorUtil.ELEMENT, ownerElement);
+		} else if (MessagepropertiesConstants.PROPERTY_ALIAS_TYPE_ATTRIBUTE.equals(attributeName)) {
+			return new WSDLComponentSelectionDialogPropertyDescriptor(MessagepropertiesConstants.PROPERTY_ALIAS_TYPE_ATTRIBUTE,MessagepropertiesConstants.PROPERTY_ALIAS_TYPE_ATTRIBUTE,(WSDLEditor)editor,WSDLEditorUtil.TYPE, ownerElement);
+		} else if (MessagepropertiesConstants.PROPERTY_ALIAS_PROPERTY_NAME_ATTRIBUTE.equals(attributeName)) {		    
+		    return new BPELPropertyAliasPropertyNamePropertyDescriptor(MessagepropertiesConstants.PROPERTY_ALIAS_PROPERTY_NAME_ATTRIBUTE,MessagepropertiesConstants.PROPERTY_ALIAS_PROPERTY_NAME_ATTRIBUTE, (WSDLEditor)editor);   		    
+		} else if (MessagepropertiesConstants.PROPERTY_ALIAS_PART_ATTRIBUTE.equals(attributeName) && ownerElement.hasAttribute(MessagepropertiesConstants.PROPERTY_ALIAS_MESSAGE_TYPE_ATTRIBUTE)) {
+			return new BPELPropertyAliasPartPropertyDescriptor(MessagepropertiesConstants.PROPERTY_ALIAS_PART_ATTRIBUTE,MessagepropertiesConstants.PROPERTY_ALIAS_PART_ATTRIBUTE,ownerElement.getAttribute(MessagepropertiesConstants.PROPERTY_ALIAS_MESSAGE_TYPE_ATTRIBUTE),(WSDLEditor)editor);
+		} else if (MessagepropertiesConstants.QUERY_QUERYLANGUAGE_ATTRIBUTE.equals(attributeName)) {
+			return new BPELQueryLanguagePropertyDescriptor(MessagepropertiesConstants.QUERY_QUERYLANGUAGE_ATTRIBUTE,MessagepropertiesConstants.QUERY_QUERYLANGUAGE_ATTRIBUTE);
+		} 
+		
+		return null;
+	}
+	
+	  
+}
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELPartnerLinkPropertyDescriptorProvider.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELPartnerLinkPropertyDescriptorProvider.java
new file mode 100644
index 0000000..9945eef
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELPartnerLinkPropertyDescriptorProvider.java
@@ -0,0 +1,22 @@
+package org.eclipse.bpel.ui.wsdl.extensions.properties;
+
+import org.eclipse.bpel.model.partnerlinktype.util.PartnerlinktypeConstants;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.wst.wsdl.ui.internal.WSDLEditor;
+import org.eclipse.wst.wsdl.ui.internal.properties.section.IPropertyDescriptorProvider;
+import org.eclipse.wst.wsdl.util.WSDLConstants;
+import org.w3c.dom.Element;
+
+public class BPELPartnerLinkPropertyDescriptorProvider implements IPropertyDescriptorProvider{
+
+	public IPropertyDescriptor getPropertyDescriptor(final IEditorPart editor, Element ownerElement, String attributeNamespace, String attributeName) {
+		if (PartnerlinktypeConstants.PORT_TYPE_ATTRIBUTE.equals(attributeName)) {
+			return new WSDLComponentSelectionDialogPropertyDescriptor(PartnerlinktypeConstants.PORT_TYPE_ATTRIBUTE,PartnerlinktypeConstants.PORT_TYPE_ATTRIBUTE,(WSDLEditor)editor,WSDLConstants.PORT_TYPE, ownerElement);
+		} 
+		
+		return null;
+	}
+	
+	  
+}
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELPropertyAliasPartPropertyDescriptor.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELPropertyAliasPartPropertyDescriptor.java
new file mode 100644
index 0000000..b7b0287
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELPropertyAliasPartPropertyDescriptor.java
@@ -0,0 +1,85 @@
+package org.eclipse.bpel.ui.wsdl.extensions.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.wst.wsdl.Definition;
+import org.eclipse.wst.wsdl.Message;
+import org.eclipse.wst.wsdl.ui.internal.WSDLEditor;
+
+public class BPELPropertyAliasPartPropertyDescriptor extends PropertyDescriptor {
+	WSDLEditor editor;
+	String message;
+	List parts = new ArrayList();
+	
+	public BPELPropertyAliasPartPropertyDescriptor(Object id, String displayName, String message,WSDLEditor editor) {
+		super(id, displayName);
+		this.editor = editor;
+		this.message = message;
+	}
+
+	public CellEditor createPropertyEditor(Composite parent) {
+		QName messageQName = createQName(((WSDLEditor)editor).getDefinition(), message);
+    	Message newMessage = (messageQName != null) ? (Message) ((WSDLEditor)editor).getDefinition().getMessage(messageQName) : null;
+		parts.addAll(newMessage.getParts().keySet());
+		CellEditor editor = new ComboBoxCellEditor(parent, (String[])parts.toArray(new String[]{}),SWT.READ_ONLY){
+
+			protected Object doGetValue() {							
+				Integer i = (Integer)super.doGetValue();
+				return parts.get(i.intValue());
+			}
+
+			protected void doSetValue(Object value) {
+				if (parts.contains(value)) {
+					super.doSetValue(new Integer(parts.indexOf(value)));
+				} else {
+					super.doSetValue(new Integer(0));
+				}
+			}						
+			
+		};
+        if (getValidator() != null)
+            editor.setValidator(getValidator());
+        return editor;
+	}
+
+	public ILabelProvider getLabelProvider() {					
+		return new LabelProvider(){
+
+			public String getText(Object element) {
+				// TODO Auto-generated method stub
+				return (String)parts.get(((Integer)element).intValue());
+			}
+			
+		};
+	}	
+	
+//	 Some subclasses use this method
+	  protected QName createQName(Definition definition, String prefixedName)
+	  {
+	    QName qname = null;
+	    if (prefixedName != null)
+	    {
+	      int index = prefixedName.indexOf(":");
+	      String prefix = (index == -1) ? "" : prefixedName.substring(0, index);
+	      String namespace = definition.getNamespace(prefix);
+	      if (namespace != null)
+	      {
+	        String localPart = prefixedName.substring(index + 1);
+	        qname = new QName(namespace, localPart);       
+	      }
+	    }
+	    return qname;
+	  }
+
+
+}
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELPropertyAliasPropertyNamePropertyDescriptor.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELPropertyAliasPropertyNamePropertyDescriptor.java
new file mode 100644
index 0000000..a9a7f56
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELPropertyAliasPropertyNamePropertyDescriptor.java
@@ -0,0 +1,98 @@
+package org.eclipse.bpel.ui.wsdl.extensions.properties;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.bpel.model.messageproperties.Property;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.wst.wsdl.Definition;
+import org.eclipse.wst.wsdl.Import;
+import org.eclipse.wst.wsdl.internal.impl.ImportImpl;
+import org.eclipse.wst.wsdl.ui.internal.WSDLEditor;
+
+public class BPELPropertyAliasPropertyNamePropertyDescriptor extends PropertyDescriptor{
+	
+	
+	WSDLEditor editor;
+	List properties = new ArrayList();
+	
+	public BPELPropertyAliasPropertyNamePropertyDescriptor(Object id, String displayName, WSDLEditor editor) {
+		super(id, displayName);
+		this.editor = editor;
+	}
+
+	public CellEditor createPropertyEditor(Composite parent) {
+		Definition d = ((WSDLEditor)editor).getDefinition();
+		createPropertyObjects(properties,d.getExtensibilityElements(),null);
+		
+	    Iterator importsIt = getWSDLFileImports(d.getEImports()).iterator();
+	    while (importsIt.hasNext()) {
+	        Import importItem = (Import) importsIt.next();		        
+	        Definition importDefinition = importItem.getEDefinition();		        		        
+	        createPropertyObjects(properties, importDefinition.getExtensibilityElements(),d.getPrefix(importItem.getNamespaceURI()));
+	    }   
+		CellEditor editor = new ComboBoxCellEditor(parent, (String[])properties.toArray(new String[]{}),SWT.READ_ONLY){
+
+			protected Object doGetValue() {							
+				Integer i = (Integer)super.doGetValue();
+				return properties.get(i.intValue());
+			}
+
+			protected void doSetValue(Object value) {
+				if (properties.contains(value)) {
+					super.doSetValue(new Integer(properties.indexOf(value)));
+				} else {
+					super.doSetValue(new Integer(0));
+				}
+			}						
+			
+		};
+        if (getValidator() != null)
+            editor.setValidator(getValidator());
+        return editor;
+	}
+
+	public ILabelProvider getLabelProvider() {					
+		return new LabelProvider(){
+
+			public String getText(Object element) {
+				// TODO Auto-generated method stub
+				return (String)properties.get(((Integer)element).intValue());
+			}
+			
+		};
+	}	
+	
+	private void createPropertyObjects(List components, List extensibilityElements, String prefix){
+		Iterator i = extensibilityElements.iterator();
+		while (i.hasNext()) {
+			Object ee = i.next();
+			if (ee instanceof Property){				
+				components.add(prefix != null ? prefix+":"+((Property)ee).getName() : ((Property)ee).getName());
+			}
+		}
+	}
+	
+    private List getWSDLFileImports(List wsdlImports) {
+        List list = new ArrayList();
+        Iterator it = wsdlImports.iterator();
+        while (it.hasNext()) {
+            ImportImpl importItem = (ImportImpl) it.next();
+            importItem.importDefinitionOrSchema();          // Load if necessary
+            if (importItem.getESchema() == null) {            	
+                list.add(importItem);
+            }
+        }
+        
+        return list;
+    }
+
+
+}
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELQueryLanguagePropertyDescriptor.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELQueryLanguagePropertyDescriptor.java
new file mode 100644
index 0000000..99a54db
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/BPELQueryLanguagePropertyDescriptor.java
@@ -0,0 +1,52 @@
+package org.eclipse.bpel.ui.wsdl.extensions.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.bpel.ui.extensions.BPELUIRegistry;
+import org.eclipse.bpel.ui.extensions.ExpressionEditorDescriptor;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+public class BPELQueryLanguagePropertyDescriptor extends PropertyDescriptor {
+	List languages = new ArrayList();
+	List uris = new ArrayList();
+	
+	public BPELQueryLanguagePropertyDescriptor(Object id, String displayName) {
+		super(id, displayName);
+		ExpressionEditorDescriptor[] descriptors = BPELUIRegistry.getInstance().getExpressionEditorDescriptors();
+		for (int  i = 0 ; i < descriptors.length; i++){
+			languages.add(descriptors[i].getLabel());
+			uris.add(descriptors[i].getExpressionLanguage());
+		}
+	}
+
+	public CellEditor createPropertyEditor(Composite parent) {
+
+
+		CellEditor editor = new ComboBoxCellEditor(parent, (String[])languages.toArray(new String[]{}),SWT.READ_ONLY){
+
+			protected Object doGetValue() {							
+				Integer i = (Integer)super.doGetValue();
+				return uris.get(i.intValue());
+			}
+
+			protected void doSetValue(Object value) {				
+				if (uris.contains(value)) {
+					super.doSetValue(new Integer(uris.indexOf(value)));
+				} else {
+					super.doSetValue(new Integer(0));
+				}
+			}						
+			
+		};
+        if (getValidator() != null)
+            editor.setValidator(getValidator());
+        return editor;
+	}
+
+	
+}
diff --git a/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/WSDLComponentSelectionDialogPropertyDescriptor.java b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/WSDLComponentSelectionDialogPropertyDescriptor.java
new file mode 100644
index 0000000..2f35aca
--- /dev/null
+++ b/plugins/org.eclipse.bpel.ui/src/org/eclipse/bpel/ui/wsdl/extensions/properties/WSDLComponentSelectionDialogPropertyDescriptor.java
@@ -0,0 +1,124 @@
+package org.eclipse.bpel.ui.wsdl.extensions.properties;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.bpel.ui.Messages;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.DialogCellEditor;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.wst.wsdl.Definition;
+import org.eclipse.wst.wsdl.ui.internal.WSDLEditor;
+import org.eclipse.wst.wsdl.ui.internal.dialogs.types.WSDLComponentSelectionDialog;
+import org.eclipse.wst.wsdl.ui.internal.dialogs.types.WSDLComponentSelectionProvider;
+import org.eclipse.wst.wsdl.ui.internal.util.WSDLEditorUtil;
+import org.eclipse.wst.wsdl.util.WSDLConstants;
+import org.w3c.dom.Element;
+
+public class WSDLComponentSelectionDialogPropertyDescriptor extends PropertyDescriptor {
+	
+	private int kind;
+	private WSDLEditor editor;
+	private Element element;
+	public WSDLComponentSelectionDialogPropertyDescriptor(Object id, String displayName, WSDLEditor editor, int kind, Element element) {
+		super(id, displayName);
+		this.kind = kind;
+		this.editor = editor;
+		this.element = element;
+	}
+	
+	public static CellEditor createCellEditor (Composite parent, final WSDLEditor editor, final int kind, final Element element) {
+		CellEditor celleditor = new DialogCellEditor(parent){			
+			
+			protected Object openDialogBox(Control cellEditorWindow) {
+				WSDLComponentSelectionProvider provider = new WSDLComponentSelectionProvider(((IFileEditorInput) editor.getEditorPart().getEditorInput()).getFile(), editor.getDefinition(), kind);
+				WSDLComponentSelectionDialog dialog = new WSDLComponentSelectionDialog(cellEditorWindow.getShell(), Messages.BPELWSDLComponentSelectionDialog, provider){
+
+					protected TreeViewer createTreeViewer(Composite comp, String title) {
+						final TreeViewer viewer = super.createTreeViewer(comp, title);
+						viewer.addDoubleClickListener(new IDoubleClickListener(){
+
+							public void doubleClick(DoubleClickEvent event) {
+								// TODO Auto-generated method stub
+								if (viewer.getSelection() instanceof IStructuredSelection && !((IStructuredSelection)viewer.getSelection()).isEmpty())
+									okPressed();
+							}
+							
+						});
+						return viewer;
+					}
+											
+				}; 
+		        provider.setDialog(dialog);
+		        dialog.setBlockOnOpen(true);
+		        dialog.create();
+		        
+		        if (dialog.open() == Window.OK){
+		        	Display.getCurrent().asyncExec(new Runnable(){
+
+						public void run() {
+							if (element == null)
+								return;
+							if (kind == WSDLConstants.MESSAGE){			        		
+				        		element.removeAttribute("element");
+				        		element.removeAttribute("type");			    
+				        	} else if (kind == WSDLEditorUtil.ELEMENT) {
+				        		element.removeAttribute("messageType");
+				        		element.removeAttribute("part");
+				        		element.removeAttribute("type");
+				        	} else if (kind == WSDLEditorUtil.TYPE) {
+				        		element.removeAttribute("messageType");
+				        		element.removeAttribute("part");
+				        		element.removeAttribute("element");
+				        	}		
+						}
+		        		
+		        	});
+		        	
+		        	
+		        	String name = (String) dialog.getSelection().getAttributeInfo("name");
+		            List prefixes = getPrefixes(editor.getDefinition(), dialog.getSelection().getTargetNamespace());
+		            if (prefixes.size() > 0) {
+		                name = prefixes.get(0) + ":" + name;
+		            }
+		        	return name;
+		        }
+		        return doGetValue();
+			}
+				
+		};
+        return celleditor;
+	}
+		
+	public CellEditor createPropertyEditor(Composite parent) {
+		CellEditor celleditor = createCellEditor(parent,editor,kind, element);
+        if (getValidator() != null)
+        	celleditor.setValidator(getValidator());
+        return celleditor;
+			
+	}
+	
+    private static List getPrefixes(Definition definition, String namespace) {
+        List list = new ArrayList();
+        Map map = definition.getNamespaces();
+        for (Iterator i = map.keySet().iterator(); i.hasNext();) {
+            String prefix = (String) i.next();
+            String theNamespace = (String) map.get(prefix);
+            if (theNamespace != null && theNamespace.equals(namespace)) {
+                list.add(prefix);
+            }
+        }
+        return list;
+    }
+}
