diff --git a/itest/wsdlgen-verify/src/main/java/wsdlgen/verify/DataTypes.java b/itest/wsdlgen-verify/src/main/java/wsdlgen/verify/DataTypes.java
index f3d689e..aa6ffc6 100644
--- a/itest/wsdlgen-verify/src/main/java/wsdlgen/verify/DataTypes.java
+++ b/itest/wsdlgen-verify/src/main/java/wsdlgen/verify/DataTypes.java
@@ -20,6 +20,8 @@
 package wsdlgen.verify;
 
 import java.util.List;
+import javax.jws.WebParam;
+import javax.jws.soap.SOAPBinding;
 import commonj.sdo.DataObject;
 import org.osoa.sca.annotations.Remotable;
 
@@ -30,8 +32,18 @@
 
     void testSimpleArrayInt(int[] simple);
 
+    void testSimpleMultiArrayInt(int[][] simple);
+
+    void testList(List any);
+
     void testSimpleListString(List<String> simple);
 
+    List<String> testReturnSimpleListString();
+
+    void testListByteArray(List<byte[]> byteArrayList);
+
+    void testListWildcard(List<?> wild);
+
     void testComplex(ComplexNumber complex);
 
     void testByteArray(byte[] byteArray);
@@ -39,4 +51,12 @@
     void testException() throws Exception;
 
     DataObject testDynamicSDO();
+
+/*
+    @SOAPBinding(parameterStyle=SOAPBinding.ParameterStyle.BARE)
+    void testWebParam(@WebParam(name="simpleInt") int simple);
+
+    @SOAPBinding(parameterStyle=SOAPBinding.ParameterStyle.BARE)
+    void testWebParamArray(@WebParam(name="arrayInt") int[] array);
+*/
 }
diff --git a/itest/wsdlgen-verify/src/main/java/wsdlgen/verify/impl/DataTypesImpl.java b/itest/wsdlgen-verify/src/main/java/wsdlgen/verify/impl/DataTypesImpl.java
index 71fc96c..5cf85d1 100644
--- a/itest/wsdlgen-verify/src/main/java/wsdlgen/verify/impl/DataTypesImpl.java
+++ b/itest/wsdlgen-verify/src/main/java/wsdlgen/verify/impl/DataTypesImpl.java
@@ -20,6 +20,8 @@
 package wsdlgen.verify.impl;
 
 import java.util.List;
+import javax.jws.WebParam;
+import javax.jws.soap.SOAPBinding;
 import commonj.sdo.DataObject;
 import wsdlgen.verify.ComplexNumber;
 import wsdlgen.verify.DataTypes;
@@ -32,9 +34,25 @@
     public void testSimpleArrayInt(int[] simple) {
     }
 
+    public void testSimpleMultiArrayInt(int[][] simple) {
+    }
+
+    public void testList(List any) {
+    }
+
     public void testSimpleListString(List<String> simple) {
     }
 
+    public List<String> testReturnSimpleListString() {
+        return null;
+    }
+
+    public void testListByteArray(List<byte[]> byteArrayList) {
+    }
+
+    public void testListWildcard(List<?> wild) {
+    }
+
     public void testComplex(ComplexNumber complex) {
     }
 
@@ -47,4 +65,10 @@
     public DataObject testDynamicSDO() {
         return null;
     }
+
+    public void testWebParam(int simple) {
+    }
+
+    public void testWebParamArray(int[] array) {
+    }
 }
diff --git a/itest/wsdlgen-verify/src/main/resources/DataTypes.composite b/itest/wsdlgen-verify/src/main/resources/DataTypes.composite
index a88d276..f42c492 100644
--- a/itest/wsdlgen-verify/src/main/resources/DataTypes.composite
+++ b/itest/wsdlgen-verify/src/main/resources/DataTypes.composite
@@ -28,4 +28,11 @@
         </service>
     </component>
 
+    <component name="DynamicSDO">
+        <implementation.java class="wsdlgen.verify.impl.GetDataServiceWithoutExceptionImpl" />
+        <service name="GetDataServiceWithoutException">
+            <binding.ws uri="http://localhost:8085/GetDataServiceWithoutException" />
+        </service>
+    </component>
+
 </composite>
diff --git a/itest/wsdlgen-verify/src/main/resources/dynamic-sdo.composite b/itest/wsdlgen-verify/src/main/resources/dynamic-sdo.composite
deleted file mode 100644
index 4dd25b4..0000000
--- a/itest/wsdlgen-verify/src/main/resources/dynamic-sdo.composite
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.    
--->
-<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
-           targetNamespace="http://verify.wsdlgen/"
-           name="DynamicSDO">
-
-    <component name="DataService">
-        <implementation.java class="wsdlgen.verify.impl.GetDataServiceWithoutExceptionImpl" />
-        <service name="GetDataServiceWithoutException">
-            <binding.ws uri="http://localhost:8085/DataService" />
-        </service>
-    </component>
-
-</composite>
diff --git a/itest/wsdlgen-verify/src/test/java/wsdlgen/verify/BaseFramework.java b/itest/wsdlgen-verify/src/test/java/wsdlgen/verify/BaseFramework.java
new file mode 100644
index 0000000..5c45d93
--- /dev/null
+++ b/itest/wsdlgen-verify/src/test/java/wsdlgen/verify/BaseFramework.java
@@ -0,0 +1,252 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package wsdlgen.verify;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.wsdl.Binding;
+import javax.wsdl.Definition;
+import javax.wsdl.Fault;
+import javax.wsdl.Input;
+import javax.wsdl.Message;
+import javax.wsdl.Operation;
+import javax.wsdl.Output;
+import javax.wsdl.Part;
+import javax.wsdl.Port;
+import javax.wsdl.PortType;
+import javax.wsdl.Service;
+import javax.wsdl.Types;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.schema.Schema;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.xml.WSDLReader;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.tuscany.sca.binding.ws.wsdlgen.WSDLServiceGenerator;
+import static org.junit.Assert.assertNotNull;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+
+/**
+ * Test ?wsdl works and that the returned WSDL is correct
+ *
+ * @version $Rev: 814373 $ $Date: 2009-09-13 19:06:29 +0100 (Sun, 13 Sep 2009) $
+ */
+public class BaseFramework {
+    private static final String SCHEMA_NS = "http://www.w3.org/2001/XMLSchema";
+    private static final String SCHEMA_NAME = "schema";
+    private static final QName SCHEMA_QNAME = new QName(SCHEMA_NS, SCHEMA_NAME);
+
+    private static SCADomain domain;
+    private static Map<String, Element> schemaMap;
+    private static PortType portType;
+
+    private Map<String, String> prefixMap;
+
+    public BaseFramework() {
+        // create a new instance of this for each of the tests
+        prefixMap = new HashMap<String, String>();
+    }
+
+    protected Element parameterElement(String methodName) {
+        Operation op = portType.getOperation(methodName, null, null);
+        Input in = op.getInput();
+        Message msg = in.getMessage();
+        Part part = msg.getPart(msg.getQName().getLocalPart());
+        if (part == null) {
+            // bare parameter style
+            part = msg.getPart("arg0");
+            return bareElement(part.getElementName());
+        } else {
+            return schemaElement(part.getElementName());
+        }
+    }
+
+    protected String parameterType(String methodName) {
+        return parameterElement(methodName).getAttribute("type");
+    }
+
+    protected Element returnElement(String methodName) {
+        Operation op = portType.getOperation(methodName, null, null);
+        Output out = op.getOutput();
+        Message msg = out.getMessage();
+        Part part = msg.getPart(msg.getQName().getLocalPart());
+        QName elementQName = part.getElementName();
+        return schemaElement(elementQName);
+    }
+
+    protected String returnType(String methodName) {
+        return returnElement(methodName).getAttribute("type");
+    }
+
+    protected Element faultElement(String methodName, String faultName) {
+        Operation op = portType.getOperation(methodName, null, null);
+        Fault fault = op.getFault(faultName);
+        Message msg = fault.getMessage();
+        Part part = msg.getPart(msg.getQName().getLocalPart());
+        QName elementQName = part.getElementName();
+        return schemaElement(elementQName);
+    }
+
+    protected String faultType(String methodName, String faultName) {
+        return faultElement(methodName, faultName).getAttribute("type");
+    }
+
+    private Element bareElement(QName elementQName) {
+        // find schema definition for wrapper element
+        Element schema = schemaMap.get(elementQName.getNamespaceURI());
+
+        // find namespace prefixes for this schema definition
+        NamedNodeMap attrNodes = schema.getAttributes();
+        for (int i = 0; i < attrNodes.getLength(); i++) {
+            Attr attr = (Attr)attrNodes.item(i);
+            String attrName = attr.getName();
+            if (attrName.startsWith("xmlns:")) {
+                prefixMap.put(attrName.substring(6), attr.getValue());
+            }
+        }
+
+        // find wrapper element definition in schema
+        String elementName = elementQName.getLocalPart();
+        Element wrapper = null;
+        NodeList childNodes = schema.getElementsByTagNameNS(SCHEMA_NS, "element");
+        for (int i = 0; i < childNodes.getLength(); i++) {
+            Node childNode = childNodes.item(i);
+            if (childNode instanceof Element) {
+                String name = ((Element)childNode).getAttribute("name");
+                if (elementName.equals(name)) {
+                    wrapper = (Element)childNode;
+                    break;
+                }
+            }
+        }
+        return wrapper;
+    }
+
+    private Element schemaElement(QName elementQName) {
+        Element wrapper = bareElement(elementQName);
+
+        // find type definition for wrapper element
+        String typeName = wrapper.getAttribute("type");
+        Element wrapperType = null;
+        if ("".equals(typeName)) {
+            NodeList childNodes = wrapper.getElementsByTagNameNS(SCHEMA_NS, "complexType");
+            wrapperType = (Element)childNodes.item(0);
+        } else {
+            wrapperType = typeDefinition(typeName);
+        }
+
+        return firstChild(wrapperType);
+    }
+
+    protected Element typeDefinition(String typeName) {
+        String typePrefix = typeName.substring(0, typeName.indexOf(":"));
+        String typeLocalName = typeName.substring(typeName.indexOf(":") + 1);
+        Element typeSchema = schemaMap.get(prefixMap.get(typePrefix));
+        Element typeElement = null;
+        NodeList childNodes = typeSchema.getElementsByTagNameNS(SCHEMA_NS, "complexType");
+        for (int i = 0; i < childNodes.getLength(); i++) {
+            Node childNode = childNodes.item(i);
+            if (childNode instanceof Element) {
+                String name = ((Element)childNode).getAttribute("name");
+                if (typeLocalName.equals(name)) {
+                    typeElement = (Element)childNode;
+                    break;
+                }
+            }
+        }
+        return typeElement;
+    }
+
+    protected Element firstChild(Element complexType) {
+        // find xs:sequence child element
+        NodeList childNodes = complexType.getElementsByTagNameNS(SCHEMA_NS, "sequence");
+        Element sequence = (Element)childNodes.item(0);
+
+        // find first xs:element child element
+        childNodes = sequence.getElementsByTagNameNS(SCHEMA_NS, "element");
+        return (Element)childNodes.item(0);
+    }
+
+    private static void readWSDL(String serviceName) throws Exception {
+        WSDLReader wsdlReader = WSDLFactory.newInstance().newWSDLReader();
+        wsdlReader.setFeature("javax.wsdl.verbose",false);
+        wsdlReader.setFeature("javax.wsdl.importDocuments",true);
+
+        Definition definition = wsdlReader.readWSDL("http://localhost:8085/" + serviceName + "?wsdl");
+        assertNotNull(definition);
+
+        // find portType
+        Service service = definition.getService(new QName("http://verify.wsdlgen/", serviceName + "Service"));
+        Port port = service.getPort(serviceName + "Port");
+        Binding binding = port.getBinding();
+        portType = binding.getPortType();
+
+        // find schema definitions
+        Types types = definition.getTypes();
+        schemaMap = new HashMap<String, Element>();
+        for (Object ext : types.getExtensibilityElements()) {
+            ExtensibilityElement extElement = (ExtensibilityElement)ext;
+            if (SCHEMA_QNAME.equals(extElement.getElementType())) {
+                if (extElement instanceof Schema) {
+                    Element schemaElement = ((Schema)extElement).getElement();
+                    schemaMap.put(schemaElement.getAttribute("targetNamespace"), schemaElement);
+                }
+            }
+        }
+    }
+
+    /*
+     * Used for debugging DOM problems
+     */
+    private void printDOM(Node node){
+        try {
+            Transformer transformer = TransformerFactory.newInstance().newTransformer();
+            Source source = new DOMSource(node);
+            Result result = new StreamResult(System.out);
+            transformer.transform(source, result);
+        } catch (Exception ex){
+            ex.printStackTrace();
+        }
+    }
+
+    protected static void start(String serviceName) throws Exception {
+        WSDLServiceGenerator.printWSDL = true;
+        domain = SCADomain.newInstance("DataTypes.composite");
+        readWSDL(serviceName);
+    }
+
+    protected static void stop() throws Exception {
+        domain.close();
+    }
+}
diff --git a/itest/wsdlgen-verify/src/test/java/wsdlgen/verify/DataTypesTestCase.java b/itest/wsdlgen-verify/src/test/java/wsdlgen/verify/DataTypesTestCase.java
index 3ebe408..a30b51f 100644
--- a/itest/wsdlgen-verify/src/test/java/wsdlgen/verify/DataTypesTestCase.java
+++ b/itest/wsdlgen-verify/src/test/java/wsdlgen/verify/DataTypesTestCase.java
@@ -19,72 +19,19 @@
 
 package wsdlgen.verify;
 
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.wsdl.Binding;
-import javax.wsdl.Definition;
-import javax.wsdl.Fault;
-import javax.wsdl.Input;
-import javax.wsdl.Message;
-import javax.wsdl.Operation;
-import javax.wsdl.Output;
-import javax.wsdl.Part;
-import javax.wsdl.Port;
-import javax.wsdl.PortType;
-import javax.wsdl.Service;
-import javax.wsdl.Types;
-import javax.wsdl.extensions.ExtensibilityElement;
-import javax.wsdl.extensions.schema.Schema;
-import javax.wsdl.factory.WSDLFactory;
-import javax.wsdl.xml.WSDLReader;
-import javax.xml.namespace.QName;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.apache.tuscany.sca.host.embedded.SCADomain;
+import static org.junit.Assert.assertEquals;
 
 /**
  * Test ?wsdl works and that the returned WSDL is correct
  *
  * @version $Rev: 814373 $ $Date: 2009-09-13 19:06:29 +0100 (Sun, 13 Sep 2009) $
  */
-public class DataTypesTestCase {
-    private static final String SCHEMA_NS = "http://www.w3.org/2001/XMLSchema";
-    private static final String SCHEMA_NAME = "schema";
-    private static final QName SCHEMA_QNAME = new QName(SCHEMA_NS, SCHEMA_NAME);
-
-    private static SCADomain domain;
-    private static Map<String, Element> schemaMap;
-    private static PortType portType;
-
-    private Map<String, String> prefixMap;
-
-    public DataTypesTestCase() {
-        // create a new instance of this for each of the tests
-        prefixMap = new HashMap<String, String>();
-    }
+public class DataTypesTestCase extends BaseFramework {
 
     @Test
     public void testSimpleInt() throws Exception {
@@ -98,8 +45,23 @@
         assertEquals("unbounded", paramElement.getAttribute("maxOccurs"));
     }
 
+/*
     @Test
-    @Ignore("TUSCANY-3799")
+    public void testSimpleMultiArrayInt() throws Exception {
+        Element paramElement = parameterElement("testSimpleMultiArrayInt");
+        assertEquals("ns1:intArray", paramElement.getAttribute("type"));
+        assertEquals("unbounded", paramElement.getAttribute("maxOccurs"));
+    }
+*/
+
+    @Test
+    public void testList() throws Exception {
+        Element paramElement = parameterElement("testList");
+        assertEquals("xs:anyType", paramElement.getAttribute("type"));
+        assertEquals("unbounded", paramElement.getAttribute("maxOccurs"));
+    }
+
+    @Test
     public void testSimpleListString() throws Exception {
         Element paramElement = parameterElement("testSimpleListString");
         assertEquals("xs:string", paramElement.getAttribute("type"));
@@ -107,6 +69,27 @@
     }
 
     @Test
+    public void testReturnSimpleListString() throws Exception {
+        Element retElement = returnElement("testReturnSimpleListString");
+        assertEquals("xs:string", retElement.getAttribute("type"));
+        assertEquals("unbounded", retElement.getAttribute("maxOccurs"));
+    }
+
+    @Test
+    public void testListByteArray() throws Exception {
+        Element paramElement = parameterElement("testListByteArray");
+        assertEquals("xs:base64Binary", paramElement.getAttribute("type"));
+        assertEquals("unbounded", paramElement.getAttribute("maxOccurs"));
+    }
+
+    @Test
+    public void testListWildcard() throws Exception {
+        Element paramElement = parameterElement("testListWildcard");
+        assertEquals("xs:anyType", paramElement.getAttribute("type"));
+        assertEquals("unbounded", paramElement.getAttribute("maxOccurs"));
+    }
+
+    @Test
     public void testComplex() throws Exception {
         String paramType = parameterType("testComplex");
         assertEquals("tns:complexNumber", paramType);
@@ -128,176 +111,32 @@
         assertEquals("xs:anyType", returnType("testDynamicSDO"));
     }
 
-    private Element parameterElement(String methodName) {
-        Operation op = portType.getOperation(methodName, null, null);
-        Input in = op.getInput();
-        Message msg = in.getMessage();
-        Part part = msg.getPart(msg.getQName().getLocalPart());
-        QName elementQName = part.getElementName();
-        return schemaElement(elementQName);
+/*
+    @Test
+    public void testWebParam() throws Exception {
+        Element paramElement = parameterElement("testWebParam");
+        assertEquals("simpleInt", paramElement.getAttribute("name"));
+        assertEquals("xs:int", paramElement.getAttribute("type"));
     }
 
-    private String parameterType(String methodName) {
-        return parameterElement(methodName).getAttribute("type");
+    @Test
+    @Ignore
+    public void testWebParamArray() throws Exception {
+        Element paramElement = parameterElement("testWebParamArray");
+        assertEquals("arrayInt", paramElement.getAttribute("name"));
+        assertEquals("xs:int", paramElement.getAttribute("type"));
+        assertEquals("unbounded", paramElement.getAttribute("maxOccurs"));
     }
+*/
 
-    private Element returnElement(String methodName) {
-        Operation op = portType.getOperation(methodName, null, null);
-        Output out = op.getOutput();
-        Message msg = out.getMessage();
-        Part part = msg.getPart(msg.getQName().getLocalPart());
-        QName elementQName = part.getElementName();
-        return schemaElement(elementQName);
-    }
-
-    private String returnType(String methodName) {
-        return returnElement(methodName).getAttribute("type");
-    }
-
-    private Element faultElement(String methodName, String faultName) {
-        Operation op = portType.getOperation(methodName, null, null);
-        Fault fault = op.getFault(faultName);
-        Message msg = fault.getMessage();
-        Part part = msg.getPart(msg.getQName().getLocalPart());
-        QName elementQName = part.getElementName();
-        return schemaElement(elementQName);
-    }
-
-    private String faultType(String methodName, String faultName) {
-        return faultElement(methodName, faultName).getAttribute("type");
-    }
-
-    private Element schemaElement(QName elementQName) {
-        // find schema definition for wrapper element
-        Element schema = schemaMap.get(elementQName.getNamespaceURI());
-
-        // find namespace prefixes for this schema definition
-        NamedNodeMap attrNodes = schema.getAttributes();
-        for (int i = 0; i < attrNodes.getLength(); i++) {
-            Attr attr = (Attr)attrNodes.item(i);
-            String attrName = attr.getName();
-            if (attrName.startsWith("xmlns:")) {
-                prefixMap.put(attrName.substring(6), attr.getValue());
-            }
-        }
-
-        // find wrapper element definition in schema
-        String elementName = elementQName.getLocalPart();
-        Element wrapper = null;
-        NodeList childNodes = schema.getElementsByTagNameNS(SCHEMA_NS, "element");
-        for (int i = 0; i < childNodes.getLength(); i++) {
-            Node childNode = childNodes.item(i);
-            if (childNode instanceof Element) {
-                String name = ((Element)childNode).getAttribute("name");
-                if (elementName.equals(name)) {
-                    wrapper = (Element)childNode;
-                    break;
-                }
-            }
-        }
-
-        // find type definition for wrapper element
-        String typeName = wrapper.getAttribute("type");
-        Element wrapperType = null;
-        if ("".equals(typeName)) {
-            childNodes = wrapper.getElementsByTagNameNS(SCHEMA_NS, "complexType");
-            wrapperType = (Element)childNodes.item(0);
-        } else {
-            wrapperType = typeDefinition(typeName);
-        }
-
-        return firstChild(wrapperType);
-    }
-
-    private Element typeDefinition(String typeName) {
-        String typePrefix = typeName.substring(0, typeName.indexOf(":"));
-        String typeLocalName = typeName.substring(typeName.indexOf(":") + 1);
-        Element typeSchema = schemaMap.get(prefixMap.get(typePrefix));
-        Element typeElement = null;
-        NodeList childNodes = typeSchema.getElementsByTagNameNS(SCHEMA_NS, "complexType");
-        for (int i = 0; i < childNodes.getLength(); i++) {
-            Node childNode = childNodes.item(i);
-            if (childNode instanceof Element) {
-                String name = ((Element)childNode).getAttribute("name");
-                if (typeLocalName.equals(name)) {
-                    typeElement = (Element)childNode;
-                    break;
-                }
-            }
-        }
-        return typeElement;
-    }
-
-    private Element firstChild(Element complexType) {
-        // find xs:sequence child element
-        NodeList childNodes = complexType.getElementsByTagNameNS(SCHEMA_NS, "sequence");
-        Element sequence = (Element)childNodes.item(0);
-
-        // find first xs:element child element
-        childNodes = sequence.getElementsByTagNameNS(SCHEMA_NS, "element");
-        return (Element)childNodes.item(0);
-    }
-
-    private static void readWSDL() throws Exception {
-        if (portType == null) {
-            InputStream inp = new URL("http://localhost:8085/DataTypes?wsdl").openStream();
-            BufferedReader br = new BufferedReader(new InputStreamReader(inp));
-            String line;
-            while((line = br.readLine()) != null) {
-                System.out.println(line);
-            }
-            br.close();
-
-            WSDLReader wsdlReader = WSDLFactory.newInstance().newWSDLReader();
-            wsdlReader.setFeature("javax.wsdl.verbose",false);
-            wsdlReader.setFeature("javax.wsdl.importDocuments",true);
-
-            Definition definition = wsdlReader.readWSDL("http://localhost:8085/DataTypes?wsdl");
-            assertNotNull(definition);
-
-            // find portType
-            Service service = definition.getService(new QName("http://verify.wsdlgen/", "DataTypesService"));
-            Port port = service.getPort("DataTypesPort");
-            Binding binding = port.getBinding();
-            portType = binding.getPortType();
-
-            // find schema definitions
-            Types types = definition.getTypes();
-            schemaMap = new HashMap<String, Element>();
-            for (Object ext : types.getExtensibilityElements()) {
-                ExtensibilityElement extElement = (ExtensibilityElement)ext;
-                if (SCHEMA_QNAME.equals(extElement.getElementType())) {
-                    if (extElement instanceof Schema) {
-                        Element schemaElement = ((Schema)extElement).getElement();
-                        schemaMap.put(schemaElement.getAttribute("targetNamespace"), schemaElement);
-                    }
-                }
-            }
-        }
-    }
-
-    /*
-     * Used for debugging DOM problems
-     */
-    private void printDOM(Node node){
-        try {
-            Transformer transformer = TransformerFactory.newInstance().newTransformer();
-            Source source = new DOMSource(node);
-            Result result = new StreamResult(System.out);
-            transformer.transform(source, result);
-        } catch (Exception ex){
-            ex.printStackTrace();
-        }
-    }
 
     @BeforeClass
     public static void setUpBeforeClass() throws Exception {
-        domain = SCADomain.newInstance("DataTypes.composite");
-        readWSDL();
+        BaseFramework.start("DataTypes");
     }
 
     @AfterClass
     public static void tearDownAfterClass() throws Exception {
-        domain.close();
+        BaseFramework.stop();
     }
 }
diff --git a/itest/wsdlgen-verify/src/test/java/wsdlgen/verify/DynamicSDOTestCase.java b/itest/wsdlgen-verify/src/test/java/wsdlgen/verify/DynamicSDOTestCase.java
index 3445d2f..cc2bd46 100644
--- a/itest/wsdlgen-verify/src/test/java/wsdlgen/verify/DynamicSDOTestCase.java
+++ b/itest/wsdlgen-verify/src/test/java/wsdlgen/verify/DynamicSDOTestCase.java
@@ -19,154 +19,63 @@
 
 package wsdlgen.verify;
 
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-
-import javax.wsdl.Binding;
-import javax.wsdl.Definition;
-import javax.wsdl.Message;
-import javax.wsdl.Part;
-import javax.wsdl.Operation;
-import javax.wsdl.Output;
-import javax.wsdl.Port;
-import javax.wsdl.PortType;
-import javax.wsdl.Service;
-import javax.wsdl.Types;
-import javax.wsdl.extensions.ExtensibilityElement;
-import javax.wsdl.extensions.schema.Schema;
-import javax.wsdl.factory.WSDLFactory;
-import javax.wsdl.xml.WSDLReader;
-import javax.xml.namespace.QName;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import junit.framework.TestCase;
-
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
 import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.apache.tuscany.sca.host.embedded.SCADomain;
+import static org.junit.Assert.assertEquals;
 
 /**
- * Test ?wsdl works and that the returned WSDL has the correct endpoint
+ * Test ?wsdl works and that the returned WSDL is correct
  *
  * @version $Rev: 814373 $ $Date: 2009-09-13 19:06:29 +0100 (Sun, 13 Sep 2009) $
  */
-public class DynamicSDOTestCase extends TestCase {
-    private static final String SCHEMA_NS = "http://www.w3.org/2001/XMLSchema";
-    private static final String SCHEMA_NAME = "schema";
-    private static final QName SCHEMA_QNAME = new QName(SCHEMA_NS, SCHEMA_NAME);
+public class DynamicSDOTestCase extends BaseFramework {
 
-    private SCADomain domain;
-
-    /**
-     * Tests ?wsdl works and produces xs:anyType for commonj.sdo.DataObject
-     */
-    public void testDynamicSDO() throws Exception {
-        InputStream inp = new URL("http://localhost:8085/DataService?wsdl").openStream();
-        BufferedReader br = new BufferedReader(new InputStreamReader(inp));
-        String line;
-        while((line = br.readLine()) != null) {
-            System.out.println(line);
-        }
-        br.close();
-
-        WSDLReader wsdlReader = WSDLFactory.newInstance().newWSDLReader();
-        wsdlReader.setFeature("javax.wsdl.verbose",false);
-        wsdlReader.setFeature("javax.wsdl.importDocuments",true);
-
-        Definition definition = wsdlReader.readWSDL("http://localhost:8085/DataService?wsdl");
-        assertNotNull(definition);
-        Service service = definition.getService(new QName("http://verify.wsdlgen/",
-                                                          "GetDataServiceWithoutExceptionService"));
-        Port port = service.getPort("GetDataServiceWithoutExceptionPort");
-        Binding binding = port.getBinding();
-        PortType portType = binding.getPortType();
-
-        // find wrapper element for getMessageSDO return type
-        Operation op = portType.getOperation("getMessageSDO", null, null);
-        Output out = op.getOutput();
-        Message msg = out.getMessage();
-        Part part = msg.getPart(msg.getQName().getLocalPart());
-        QName elementQName = part.getElementName();
-
-        // find schema definition for wrapper element
-        Types types = definition.getTypes();
-        String elementNS = elementQName.getNamespaceURI();
-        Element schema = null;
-        for (Object ext : types.getExtensibilityElements()) {
-            ExtensibilityElement extElement = (ExtensibilityElement)ext;
-            if (SCHEMA_QNAME.equals(extElement.getElementType())) {
-                if (extElement instanceof Schema) {
-                    Element schemaElement = ((Schema)extElement).getElement();
-                    if (elementNS.equals(schemaElement.getAttribute("targetNamespace"))) {
-                        schema = schemaElement;
-                        break;
-                    }
-                }
-            }
-        }
-
-        // find wrapper element definition in schema
-        String elementName = elementQName.getLocalPart();
-        Element wrapper = null;
-        NodeList childNodes = schema.getElementsByTagNameNS(SCHEMA_NS, "element");
-        for (int i = 0; i < childNodes.getLength(); i++) {
-            Node childNode = childNodes.item(i);
-            if (childNode instanceof Element) {
-                String name = ((Element)childNode).getAttribute("name");
-                if (elementName.equals(name)) {
-                    wrapper = (Element)childNode;
-                    break;
-                }
-            }
-        }
-
-        // find xs:complexType child element
-        childNodes = wrapper.getElementsByTagNameNS(SCHEMA_NS, "complexType");
-        Element complexType = (Element)childNodes.item(0);
-
-        // find xs:sequence child element
-        childNodes = complexType.getElementsByTagNameNS(SCHEMA_NS, "sequence");
-        Element sequence = (Element)childNodes.item(0);
-
-        // find xs:element child element
-        childNodes = sequence.getElementsByTagNameNS(SCHEMA_NS, "element");
-        Element returnValue = (Element)childNodes.item(0);
-
-        // verify that return type is xs:anyType
-        assertEquals("xs:anyType", returnValue.getAttribute("type"));
+    @Test
+    public void testGetMessage() throws Exception {
+        assertEquals("xs:base64Binary", returnType("getMessage"));
     }
 
-    /*
-     * Used for debugging DOM problems
-     */
-    private void printDOM(Node node){
-        try {
-            Transformer transformer = TransformerFactory.newInstance().newTransformer();
-            Source source = new DOMSource(node);
-            Result result = new StreamResult(System.out);
-            transformer.transform(source, result);
-        } catch (Exception ex){
-            ex.printStackTrace();
-        }
+    @Test
+    public void testGetMessageList() throws Exception {
+        Element retElement = returnElement("getMessageList");
+        assertEquals("xs:base64Binary", retElement.getAttribute("type"));
+        assertEquals("unbounded", retElement.getAttribute("maxOccurs"));
     }
 
-    @Override
-    protected void setUp() throws Exception {
-        domain = SCADomain.newInstance("dynamic-sdo.composite");
+    @Test
+    public void testGetMessageSDO() throws Exception {
+        assertEquals("xs:anyType", returnType("getMessageSDO"));
     }
 
-    @Override
-    protected void tearDown() throws Exception {
-        domain.close();
+    @Test
+    public void testGetMessageListSDOList() throws Exception {
+        Element retElement = returnElement("getMessageListSDOList");
+        assertEquals("xs:anyType", retElement.getAttribute("type"));
+        assertEquals("unbounded", retElement.getAttribute("maxOccurs"));
     }
 
+    @Test
+    public void testGetMessageListSDOArr() throws Exception {
+        Element retElement = returnElement("getMessageListSDOArr");
+        assertEquals("xs:anyType", retElement.getAttribute("type"));
+        assertEquals("unbounded", retElement.getAttribute("maxOccurs"));
+    }
+
+    @Test
+    public void testGetMessageListSDOinSDO() throws Exception {
+        assertEquals("xs:anyType", returnType("getMessageListSDOinSDO"));
+    }
+
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        BaseFramework.start("GetDataServiceWithoutException");
+    }
+
+    @AfterClass
+    public static void tearDownAfterClass() throws Exception {
+        BaseFramework.stop();
+    }
 }
