[285346] [model] WSDL editor does not remove removed annotations from Properties/Extensions tab
diff --git a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/BindingFaultImpl.java b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/BindingFaultImpl.java
index 5a15ee4..04e892c 100644
--- a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/BindingFaultImpl.java
+++ b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/BindingFaultImpl.java
@@ -299,14 +299,6 @@
     super.handleUnreconciledElement(child, remainingModelObjects);
   }
 
-  protected void handleReconciliation(Collection remainingModelObjects)
-  {
-    for (Iterator i = remainingModelObjects.iterator(); i.hasNext();)
-    {
-      getEExtensibilityElements().remove(i.next());
-    }
-  }
-
   public Collection getModelObjects(Object component)
   {
     BindingFault bindingFault = (BindingFault)component;
diff --git a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/BindingInputImpl.java b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/BindingInputImpl.java
index 4398d1a..6c1d59b 100644
--- a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/BindingInputImpl.java
+++ b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/BindingInputImpl.java
@@ -302,14 +302,6 @@
     super.handleUnreconciledElement(child, remainingModelObjects);
   }
 
-  protected void handleReconciliation(Collection remainingModelObjects)
-  {
-    for (Iterator i = remainingModelObjects.iterator(); i.hasNext();)
-    {
-      getEExtensibilityElements().remove(i.next());
-    }
-  }
-
   public Collection getModelObjects(Object component)
   {
     BindingInput bindingInput = (BindingInput)component;
diff --git a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/BindingOutputImpl.java b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/BindingOutputImpl.java
index 92d37b2..6f16bcb 100644
--- a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/BindingOutputImpl.java
+++ b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/BindingOutputImpl.java
@@ -302,14 +302,6 @@
     super.handleUnreconciledElement(child, remainingModelObjects);
   }
 
-  protected void handleReconciliation(Collection remainingModelObjects)
-  {
-    for (Iterator i = remainingModelObjects.iterator(); i.hasNext();)
-    {
-      getEExtensibilityElements().remove(i.next());
-    }
-  }
-
   public Collection getModelObjects(Object component)
   {
     BindingOutput bindingOutput = (BindingOutput)component;
diff --git a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/ExtensibleElementImpl.java b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/ExtensibleElementImpl.java
index bbf9bba..c3c05c7 100644
--- a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/ExtensibleElementImpl.java
+++ b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/ExtensibleElementImpl.java
@@ -12,6 +12,7 @@
 
 
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -262,4 +263,22 @@
     return getEnclosingDefinition() == null ? true : ((DefinitionImpl)getEnclosingDefinition()).getUseExtensionFactories();
   }
 
+  /**
+   * Override this method if the remainingModelObjects contain elements that are not only ExtensibilityElement
+   */
+  protected void handleReconciliation(Collection remainingModelObjects)
+  {
+    super.handleReconciliation(remainingModelObjects);
+    Iterator iterator = remainingModelObjects.iterator();
+    List extensibilityElements = getExtensibilityElements();
+    while (iterator.hasNext())
+    {
+      Object modelObject = iterator.next();
+      if (modelObject instanceof ExtensibilityElement) 
+      {
+        extensibilityElements.remove(modelObject);
+      }
+    }
+  }
+
 } //ExtensibleElementImpl
diff --git a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/MessageImpl.java b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/MessageImpl.java
index fa61571..f02876e 100644
--- a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/MessageImpl.java
+++ b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/MessageImpl.java
@@ -31,6 +31,7 @@
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.wst.wsdl.Definition;
+import org.eclipse.wst.wsdl.ExtensibilityElement;
 import org.eclipse.wst.wsdl.Message;
 import org.eclipse.wst.wsdl.Part;
 import org.eclipse.wst.wsdl.WSDLPackage;
@@ -431,13 +432,28 @@
 
   protected void remove(Object component, Object modelObject)
   {
+    List list = getList(component, modelObject);
+    if (list != null)
+    {
+      list.remove(modelObject);
+    }    
+  }
+  
+  private List getList(Object component, Object modelObject)
+  {
+    List result = null;
     Message message = (Message)component;
     if (modelObject instanceof Part)
     {
-      message.getEParts().remove(modelObject);
-      //      message.getEParts().clear();
+      result = message.getEParts();
     }
-  }
+    else if (modelObject instanceof ExtensibilityElement)
+    {
+      result = getExtensibilityElements();
+    }
+    
+    return result;
+  }  
 
   //
   // For reconciliation: Model -> DOM
diff --git a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/MessageReferenceImpl.java b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/MessageReferenceImpl.java
index 069b0ef..1d400bb 100644
--- a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/MessageReferenceImpl.java
+++ b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/MessageReferenceImpl.java
@@ -267,10 +267,6 @@
     super.handleUnreconciledElement(child, remainingModelObjects);
   }
 
-  protected void handleReconciliation(Collection remainingModelObjects)
-  {
-  }
-
   //
   // For reconciliation: Model -> DOM
   //
diff --git a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/OperationImpl.java b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/OperationImpl.java
index 08afb2a..9ba8b32 100644
--- a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/OperationImpl.java
+++ b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/OperationImpl.java
@@ -33,6 +33,7 @@
 import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.wst.wsdl.Definition;
+import org.eclipse.wst.wsdl.ExtensibilityElement;
 import org.eclipse.wst.wsdl.Fault;
 import org.eclipse.wst.wsdl.Input;
 import org.eclipse.wst.wsdl.Operation;
@@ -913,6 +914,10 @@
     {
       operation.getEFaults().remove(modelObject);
     }
+    else if (modelObject instanceof ExtensibilityElement) 
+    {
+      getExtensibilityElements().remove(modelObject);
+    }
   }
 
   public Collection getModelObjects(Object component)
diff --git a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/PortImpl.java b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/PortImpl.java
index e9be965..015eb62 100644
--- a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/PortImpl.java
+++ b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/PortImpl.java
@@ -298,14 +298,6 @@
     super.handleUnreconciledElement(child, remainingModelObjects);
   }
 
-  protected void handleReconciliation(Collection remainingModelObjects)
-  {
-    for (Iterator i = remainingModelObjects.iterator(); i.hasNext();)
-    {
-      getEExtensibilityElements().remove(i.next());
-    }
-  }
-
   public Collection getModelObjects(Object component)
   {
     Port port = (Port)component;
diff --git a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/PortTypeImpl.java b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/PortTypeImpl.java
index f9484dd..6805bac 100644
--- a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/PortTypeImpl.java
+++ b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/PortTypeImpl.java
@@ -28,6 +28,7 @@
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.wst.wsdl.Definition;
+import org.eclipse.wst.wsdl.ExtensibilityElement;
 import org.eclipse.wst.wsdl.Operation;
 import org.eclipse.wst.wsdl.PortType;
 import org.eclipse.wst.wsdl.WSDLFactory;
@@ -458,6 +459,11 @@
     {
       result = portType.getEOperations();
     }
+    else if (modelObject instanceof ExtensibilityElement)
+    {
+      result = getExtensibilityElements();
+    }
+    
     return result;
   }
 
diff --git a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/TypesImpl.java b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/TypesImpl.java
index 150fa3f..feead2b 100644
--- a/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/TypesImpl.java
+++ b/bundles/org.eclipse.wst.wsdl/src-wsdl/org/eclipse/wst/wsdl/internal/impl/TypesImpl.java
@@ -170,20 +170,10 @@
 
   protected void handleReconciliation(Collection remainingModelObjects)
   {
-    for (Iterator i = remainingModelObjects.iterator(); i.hasNext();)
-    {
-      remove(this, i.next());
-    }
+    super.handleReconciliation(remainingModelObjects);
     ((DefinitionImpl)getEnclosingDefinition()).reconcileReferences(true);
   }
 
-  protected void remove(Object component, Object modelObject)
-  {
-    Types types = (Types)component;
-    List list = types.getEExtensibilityElements();
-    list.remove(modelObject);
-  }
-
   public Collection getModelObjects(Object component)
   {
     Types types = (Types)component;
diff --git a/tests/org.eclipse.wst.wsdl.tests/samples/BugFixes/ReconcilesExtensibleElements/ExtensibleElementSample.wsdl b/tests/org.eclipse.wst.wsdl.tests/samples/BugFixes/ReconcilesExtensibleElements/ExtensibleElementSample.wsdl
new file mode 100644
index 0000000..c936109
--- /dev/null
+++ b/tests/org.eclipse.wst.wsdl.tests/samples/BugFixes/ReconcilesExtensibleElements/ExtensibleElementSample.wsdl
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/BindingFaultSample/"
+	xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="BindingFaultSample"
+	targetNamespace="http://www.example.org/BindingFaultSample/">
+	<xsd:annotation>
+		<xsd:documentation>
+			Annotation
+ 			</xsd:documentation>
+	</xsd:annotation>
+	<wsdl:import namespace="" location="">
+		<xsd:annotation>
+			<xsd:documentation>
+				Annotation
+ 			</xsd:documentation>
+		</xsd:annotation>
+	</wsdl:import>
+	<wsdl:types>
+		<xsd:annotation>
+			<xsd:documentation>
+				Annotation
+ 			</xsd:documentation>
+		</xsd:annotation>
+
+		<xsd:schema targetNamespace="http://www.example.org/BindingFaultSample/"
+			xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+			<xsd:element name="Operation1">
+				<xsd:complexType>
+					<xsd:sequence>
+						<xsd:element name="in" type="xsd:string" />
+					</xsd:sequence>
+				</xsd:complexType>
+			</xsd:element>
+			<xsd:element name="Operation1Response">
+				<xsd:complexType>
+					<xsd:sequence>
+						<xsd:element name="out" type="xsd:string" />
+					</xsd:sequence>
+				</xsd:complexType>
+			</xsd:element>
+			<xsd:element name="Operation1Fault">
+				<xsd:complexType>
+					<xsd:sequence>
+						<xsd:element name="fault" type="xsd:string" />
+					</xsd:sequence>
+				</xsd:complexType>
+			</xsd:element>
+			<xsd:element name="Operation2">
+				<xsd:complexType>
+					<xsd:sequence>
+
+						<xsd:element name="in" type="xsd:string"></xsd:element>
+					</xsd:sequence>
+				</xsd:complexType>
+			</xsd:element>
+			<xsd:element name="Operation2Response">
+				<xsd:complexType>
+					<xsd:sequence>
+						<xsd:element name="out" type="xsd:string"></xsd:element>
+					</xsd:sequence>
+				</xsd:complexType>
+			</xsd:element>
+			<xsd:element name="Operation2Fault1">
+				<xsd:complexType>
+					<xsd:sequence>
+						<xsd:element name="Operation2Fault1" type="xsd:string"></xsd:element>
+					</xsd:sequence>
+				</xsd:complexType>
+			</xsd:element>
+			<xsd:element name="Operation2Fault2">
+				<xsd:complexType>
+					<xsd:sequence>
+						<xsd:element name="Operation2Fault2" type="xsd:string"></xsd:element>
+					</xsd:sequence>
+				</xsd:complexType>
+			</xsd:element>
+			<xsd:element name="Operation1Fault1">
+				<xsd:complexType>
+					<xsd:sequence>
+
+						<xsd:element name="Operation1Fault" type="xsd:string">
+						</xsd:element>
+					</xsd:sequence>
+				</xsd:complexType>
+			</xsd:element>
+		</xsd:schema>
+	</wsdl:types>
+	<wsdl:message name="Operation1Request">
+		<xsd:annotation>
+			<xsd:documentation>
+				Annotation
+ 			</xsd:documentation>
+		</xsd:annotation>
+		<wsdl:part element="tns:Operation1" name="parameters">
+			<xsd:annotation>
+				<xsd:documentation>
+					Annotation
+ 			</xsd:documentation>
+			</xsd:annotation>
+		</wsdl:part>
+	</wsdl:message>
+	<wsdl:message name="Operation1Response">
+		<wsdl:part element="tns:Operation1Response" name="parameters" />
+	</wsdl:message>
+	<wsdl:message name="Operation1Fault">
+		<wsdl:part name="Fault" element="tns:Operation1Fault" />
+	</wsdl:message>
+	<wsdl:message name="Operation2Request">
+		<wsdl:part name="parameters" element="tns:Operation2"></wsdl:part>
+	</wsdl:message>
+	<wsdl:message name="Operation2Response">
+		<wsdl:part name="parameters" element="tns:Operation2Response"></wsdl:part>
+	</wsdl:message>
+	<wsdl:message name="Operation2Fault1">
+		<wsdl:part name="parameters" element="tns:Operation2Fault1"></wsdl:part>
+	</wsdl:message>
+	<wsdl:message name="Operation2Fault2">
+		<wsdl:part name="parameters" element="tns:Operation2Fault2"></wsdl:part>
+	</wsdl:message>
+	<wsdl:message name="Operation1Fault1">
+		<wsdl:part name="parameters" element="tns:Operation1Fault1"></wsdl:part>
+	</wsdl:message>
+	<wsdl:portType name="SamplePort">
+		<xsd:annotation>
+			<xsd:documentation>
+				Annotation
+ 			</xsd:documentation>
+		</xsd:annotation>
+
+		<wsdl:operation name="Operation1">
+			<xsd:annotation>
+				<xsd:documentation>
+					Annotation
+ 			</xsd:documentation>
+			</xsd:annotation>
+			<wsdl:input message="tns:Operation1Request">
+				<xsd:annotation>
+					<xsd:documentation>
+						Annotation
+ 			</xsd:documentation>
+				</xsd:annotation>
+			</wsdl:input>
+			<wsdl:output message="tns:Operation1Response">
+				<xsd:annotation>
+					<xsd:documentation>
+						Annotation
+ 			</xsd:documentation>
+				</xsd:annotation>
+			</wsdl:output>
+			<wsdl:fault name="fault" message="tns:Operation1Fault1">
+				<xsd:annotation>
+					<xsd:documentation>
+						Annotation
+ 			</xsd:documentation>
+				</xsd:annotation>
+			</wsdl:fault>
+		</wsdl:operation>
+	</wsdl:portType>
+	<wsdl:binding name="SamplePortSOAPBinding" type="tns:SamplePort">
+		<xsd:annotation>
+			<xsd:documentation>
+				Annotation
+ 			</xsd:documentation>
+		</xsd:annotation>
+
+		<soap:binding style="document"
+			transport="http://schemas.xmlsoap.org/soap/http" />
+		<wsdl:operation name="Operation1">
+			<xsd:annotation>
+				<xsd:documentation>
+					Annotation
+ 				</xsd:documentation>
+			</xsd:annotation>
+
+			<soap:operation
+				soapAction="http://www.example.org/BindingFaultSample/Operation1" />
+			<wsdl:input>
+				<xsd:annotation>
+					<xsd:documentation>
+						Annotation
+ 					</xsd:documentation>
+				</xsd:annotation>
+
+				<soap:body use="literal" />
+			</wsdl:input>
+			<wsdl:output>
+				<xsd:annotation>
+					<xsd:documentation>
+						Annotation
+ 			</xsd:documentation>
+				</xsd:annotation>
+				<soap:body use="literal" />
+			</wsdl:output>
+			<wsdl:fault name="Operation1Fault">
+				<xsd:annotation>
+					<xsd:documentation>
+						Annotation
+ 					</xsd:documentation>
+				</xsd:annotation>
+
+				<soap:fault name="Operation1Fault" />
+			</wsdl:fault>
+		</wsdl:operation>
+
+	</wsdl:binding>
+	<wsdl:service name="SampleService">
+		<xsd:annotation>
+			<xsd:documentation>
+				Annotation
+ 			</xsd:documentation>
+		</xsd:annotation>
+
+		<wsdl:port binding="tns:SamplePortSOAPBinding" name="SamplePort">
+			<xsd:annotation>
+				<xsd:documentation>
+					Annotation
+ 				</xsd:documentation>
+			</xsd:annotation>
+			<soap:address location="http://www.example.org/" />
+		</wsdl:port>
+	</wsdl:service>
+</wsdl:definitions>
diff --git a/tests/org.eclipse.wst.wsdl.tests/src/org/eclipse/wst/wsdl/tests/BugFixesTest.java b/tests/org.eclipse.wst.wsdl.tests/src/org/eclipse/wst/wsdl/tests/BugFixesTest.java
index b1fedba..d289bf0 100644
--- a/tests/org.eclipse.wst.wsdl.tests/src/org/eclipse/wst/wsdl/tests/BugFixesTest.java
+++ b/tests/org.eclipse.wst.wsdl.tests/src/org/eclipse/wst/wsdl/tests/BugFixesTest.java
@@ -37,6 +37,7 @@
 import org.eclipse.wst.wsdl.BindingFault;
 import org.eclipse.wst.wsdl.BindingInput;
 import org.eclipse.wst.wsdl.BindingOperation;
+import org.eclipse.wst.wsdl.BindingOutput;
 import org.eclipse.wst.wsdl.Definition;
 import org.eclipse.wst.wsdl.ExtensibleElement;
 import org.eclipse.wst.wsdl.Fault;
@@ -49,6 +50,7 @@
 import org.eclipse.wst.wsdl.PortType;
 import org.eclipse.wst.wsdl.Service;
 import org.eclipse.wst.wsdl.Types;
+import org.eclipse.wst.wsdl.UnknownExtensibilityElement;
 import org.eclipse.wst.wsdl.WSDLFactory;
 import org.eclipse.wst.wsdl.WSDLPackage;
 import org.eclipse.wst.wsdl.WSDLPlugin;
@@ -314,7 +316,15 @@
       {
         testReconcilesImportsWithNoLocation();
       }
-    });        
+    }); 
+    
+    suite.addTest(new BugFixesTest("ReconcilesExtensibleElements") //$NON-NLS-1$
+    {
+      protected void runTest()
+      {
+        testReconcilesExtensibleElements();
+      }
+    });
 
     return suite;
   }
@@ -1764,4 +1774,127 @@
       fail();
     }
   }
+  
+  /**
+   * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=236404
+   */
+  public void testReconcilesExtensibleElements()
+  {
+    Definition definition = null;
+
+    // The sample WSDL already has an <annotation> extensibility element for each extensible element
+    // We will loop through every extensible element and remove the annotation extensibility element
+    // and force the model to update, thus calling the reconciliation code. The expected result is that
+    // the annotation extensibility element will be removed in the model.
+    try
+    {
+      definition = DefinitionLoader.load(PLUGIN_ABSOLUTE_PATH + "samples/BugFixes/ReconcilesExtensibleElements/ExtensibleElementSample.wsdl"); //$NON-NLS-1$
+    }
+    catch (IOException e)
+    {
+      fail(e.getMessage());
+    }
+
+    // Definition
+    ensureExtensibilityElementRemoved(definition, 1);
+    
+    // Import
+    EList imports = definition.getEImports();
+    Import myImport = (Import) imports.get(0);
+    ensureExtensibilityElementRemoved(myImport, 1);
+    
+    // Type: original is two because it has <annotation> and <schema>
+    Types types = definition.getETypes();
+    ensureExtensibilityElementRemoved(types, 2);
+    
+    // Service
+    Service service = (Service)definition.getEServices().get(0);
+    ensureExtensibilityElementRemoved(service, 1);
+    
+    // Port
+    org.eclipse.wst.wsdl.Port port = (org.eclipse.wst.wsdl.Port)service.getEPorts().get(0);
+    ensureExtensibilityElementRemoved(port, 2);
+    
+    // Binding: original is 2 because it has <annotation> and <soap:binding>
+    Binding binding = port.getEBinding();
+    ensureExtensibilityElementRemoved(binding, 2);
+    
+    // Binding Operation: original is 2 because it has <annotation> and <soap:operation>
+    List bindingOperations = binding.getBindingOperations();
+    BindingOperation bindingOperation = (BindingOperation)bindingOperations.get(0);
+    ensureExtensibilityElementRemoved(bindingOperation, 2);    
+    
+    // Binding Input: original is 2 because it has <annotation> and <soap:body>
+    BindingInput bindingInput = bindingOperation.getEBindingInput();
+    ensureExtensibilityElementRemoved(bindingInput, 2);
+    
+    // Binding Output: original is 2 because it has <annotation> and <soap:body>
+    BindingOutput bindingOutput = bindingOperation.getEBindingOutput();
+    ensureExtensibilityElementRemoved(bindingOutput, 2);
+    
+    // Binding Fault: original is 2 because it has <annotation> and <soap:fault>    
+    EList bindingFaults = bindingOperation.getEBindingFaults();
+    BindingFault bindingFault = (BindingFault)bindingFaults.get(0);
+    ensureExtensibilityElementRemoved(bindingFault, 2);
+    
+    // Port Type
+    PortType portType = binding.getEPortType();
+    ensureExtensibilityElementRemoved(portType, 1);
+    
+    // Operation
+    EList operations = portType.getEOperations();
+    Operation operation = (Operation) operations.get(0);
+    ensureExtensibilityElementRemoved(operation, 1);
+    
+    // Output
+    Output output = operation.getEOutput();
+    ensureExtensibilityElementRemoved(output, 1);
+    
+    // Input
+    Input input = operation.getEInput();
+    ensureExtensibilityElementRemoved(input, 1);
+    
+    // fault 
+    EList faults = operation.getEFaults();
+    Fault fault = (Fault) faults.get(0);
+    ensureExtensibilityElementRemoved(fault, 1);
+    
+    // Message
+    Message message = input.getEMessage();
+    ensureExtensibilityElementRemoved(message, 1);
+    
+    // Part
+    EList parts = message.getEParts();
+    Part part = (Part) parts.get(0);
+    ensureExtensibilityElementRemoved(part, 1);
+  }
+  
+  /**
+   * Remove the first UnknownExtensibilityElement. The expected result is original size will decrement by 1
+   */
+  private void ensureExtensibilityElementRemoved(ExtensibleElement extensibleElement, int originalSize) 
+  {
+    List extensibilityElements = extensibleElement.getExtensibilityElements();
+    assertEquals(originalSize, extensibilityElements.size());
+    UnknownExtensibilityElement unknownExtensibilityElement = null;
+    Iterator extensibilityElementsIterator = extensibilityElements.iterator();
+    while (extensibilityElementsIterator.hasNext())
+    {
+      Object object = extensibilityElementsIterator.next();
+      if (object instanceof UnknownExtensibilityElement) 
+      {
+        unknownExtensibilityElement = (UnknownExtensibilityElement) object;
+        break;
+      }
+    }
+
+    if (unknownExtensibilityElement == null) 
+    {
+      fail("Cannot find the UnknownExtensibilityElement.");
+    }
+    Element element = unknownExtensibilityElement.getElement();
+    extensibleElement.getElement().removeChild(element);
+    extensibleElement.elementChanged(extensibleElement.getElement());
+    assertEquals(originalSize - 1, extensibilityElements.size());
+  }
 }