//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.1-661 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2009.07.19 at 09:49:41 PM CDT 
//


package org.apache.ws.scout.model.uddi.v2;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;


/**
 * This object contains factory methods for each 
 * Java content interface and Java element interface 
 * generated in the org.apache.ws.scout.model.uddi.v2 package. 
 * <p>An ObjectFactory allows you to programatically 
 * construct new instances of the Java representation 
 * for XML content. The Java representation of XML 
 * content can consist of schema derived interfaces 
 * and classes representing the binding of schema 
 * type definitions, element declarations and model 
 * groups.  Factory methods for each of these are 
 * provided in this class.
 * 
 */
@XmlRegistry
public class ObjectFactory {

    private final static QName _RelatedBusinessesList_QNAME = new QName("urn:uddi-org:api_v2", "relatedBusinessesList");
    private final static QName _TModelKey_QNAME = new QName("urn:uddi-org:api_v2", "tModelKey");
    private final static QName _GetServiceDetail_QNAME = new QName("urn:uddi-org:api_v2", "get_serviceDetail");
    private final static QName _FindQualifier_QNAME = new QName("urn:uddi-org:api_v2", "findQualifier");
    private final static QName _ToKey_QNAME = new QName("urn:uddi-org:api_v2", "toKey");
    private final static QName _BindingTemplate_QNAME = new QName("urn:uddi-org:api_v2", "bindingTemplate");
    private final static QName _FindService_QNAME = new QName("urn:uddi-org:api_v2", "find_service");
    private final static QName _CategoryBag_QNAME = new QName("urn:uddi-org:api_v2", "categoryBag");
    private final static QName _SaveBusiness_QNAME = new QName("urn:uddi-org:api_v2", "save_business");
    private final static QName _IdentifierBag_QNAME = new QName("urn:uddi-org:api_v2", "identifierBag");
    private final static QName _SaveService_QNAME = new QName("urn:uddi-org:api_v2", "save_service");
    private final static QName _ValidateValues_QNAME = new QName("urn:uddi-org:api_v2", "validate_values");
    private final static QName _Contacts_QNAME = new QName("urn:uddi-org:api_v2", "contacts");
    private final static QName _Phone_QNAME = new QName("urn:uddi-org:api_v2", "phone");
    private final static QName _BusinessEntityExt_QNAME = new QName("urn:uddi-org:api_v2", "businessEntityExt");
    private final static QName _Contact_QNAME = new QName("urn:uddi-org:api_v2", "contact");
    private final static QName _GetAssertionStatusReport_QNAME = new QName("urn:uddi-org:api_v2", "get_assertionStatusReport");
    private final static QName _GetBusinessDetailExt_QNAME = new QName("urn:uddi-org:api_v2", "get_businessDetailExt");
    private final static QName _BindingDetail_QNAME = new QName("urn:uddi-org:api_v2", "bindingDetail");
    private final static QName _TModelDetail_QNAME = new QName("urn:uddi-org:api_v2", "tModelDetail");
    private final static QName _AccessPoint_QNAME = new QName("urn:uddi-org:api_v2", "accessPoint");
    private final static QName _SetPublisherAssertions_QNAME = new QName("urn:uddi-org:api_v2", "set_publisherAssertions");
    private final static QName _SharedRelationships_QNAME = new QName("urn:uddi-org:api_v2", "sharedRelationships");
    private final static QName _GetAuthToken_QNAME = new QName("urn:uddi-org:api_v2", "get_authToken");
    private final static QName _HostingRedirector_QNAME = new QName("urn:uddi-org:api_v2", "hostingRedirector");
    private final static QName _Address_QNAME = new QName("urn:uddi-org:api_v2", "address");
    private final static QName _FindBusiness_QNAME = new QName("urn:uddi-org:api_v2", "find_business");
    private final static QName _BusinessList_QNAME = new QName("urn:uddi-org:api_v2", "businessList");
    private final static QName _FindTModel_QNAME = new QName("urn:uddi-org:api_v2", "find_tModel");
    private final static QName _ServiceInfos_QNAME = new QName("urn:uddi-org:api_v2", "serviceInfos");
    private final static QName _ServiceKey_QNAME = new QName("urn:uddi-org:api_v2", "serviceKey");
    private final static QName _BusinessDetailExt_QNAME = new QName("urn:uddi-org:api_v2", "businessDetailExt");
    private final static QName _RelatedBusinessInfo_QNAME = new QName("urn:uddi-org:api_v2", "relatedBusinessInfo");
    private final static QName _DispositionReport_QNAME = new QName("urn:uddi-org:api_v2", "dispositionReport");
    private final static QName _FindBinding_QNAME = new QName("urn:uddi-org:api_v2", "find_binding");
    private final static QName _ServiceList_QNAME = new QName("urn:uddi-org:api_v2", "serviceList");
    private final static QName _PublisherAssertion_QNAME = new QName("urn:uddi-org:api_v2", "publisherAssertion");
    private final static QName _AuthToken_QNAME = new QName("urn:uddi-org:api_v2", "authToken");
    private final static QName _OverviewURL_QNAME = new QName("urn:uddi-org:api_v2", "overviewURL");
    private final static QName _DeleteService_QNAME = new QName("urn:uddi-org:api_v2", "delete_service");
    private final static QName _FindQualifiers_QNAME = new QName("urn:uddi-org:api_v2", "findQualifiers");
    private final static QName _DiscoveryURLs_QNAME = new QName("urn:uddi-org:api_v2", "discoveryURLs");
    private final static QName _BusinessService_QNAME = new QName("urn:uddi-org:api_v2", "businessService");
    private final static QName _DiscardAuthToken_QNAME = new QName("urn:uddi-org:api_v2", "discard_authToken");
    private final static QName _DeleteBinding_QNAME = new QName("urn:uddi-org:api_v2", "delete_binding");
    private final static QName _TModel_QNAME = new QName("urn:uddi-org:api_v2", "tModel");
    private final static QName _BusinessServices_QNAME = new QName("urn:uddi-org:api_v2", "businessServices");
    private final static QName _TModelInfos_QNAME = new QName("urn:uddi-org:api_v2", "tModelInfos");
    private final static QName _Result_QNAME = new QName("urn:uddi-org:api_v2", "result");
    private final static QName _UploadRegister_QNAME = new QName("urn:uddi-org:api_v2", "uploadRegister");
    private final static QName _GetBusinessDetail_QNAME = new QName("urn:uddi-org:api_v2", "get_businessDetail");
    private final static QName _AddPublisherAssertions_QNAME = new QName("urn:uddi-org:api_v2", "add_publisherAssertions");
    private final static QName _CompletionStatus_QNAME = new QName("urn:uddi-org:api_v2", "completionStatus");
    private final static QName _GetBindingDetail_QNAME = new QName("urn:uddi-org:api_v2", "get_bindingDetail");
    private final static QName _TModelInstanceDetails_QNAME = new QName("urn:uddi-org:api_v2", "tModelInstanceDetails");
    private final static QName _TModelBag_QNAME = new QName("urn:uddi-org:api_v2", "tModelBag");
    private final static QName _TModelList_QNAME = new QName("urn:uddi-org:api_v2", "tModelList");
    private final static QName _KeysOwned_QNAME = new QName("urn:uddi-org:api_v2", "keysOwned");
    private final static QName _DeleteBusiness_QNAME = new QName("urn:uddi-org:api_v2", "delete_business");
    private final static QName _AssertionStatusReport_QNAME = new QName("urn:uddi-org:api_v2", "assertionStatusReport");
    private final static QName _KeyedReference_QNAME = new QName("urn:uddi-org:api_v2", "keyedReference");
    private final static QName _BindingTemplates_QNAME = new QName("urn:uddi-org:api_v2", "bindingTemplates");
    private final static QName _DeleteTModel_QNAME = new QName("urn:uddi-org:api_v2", "delete_tModel");
    private final static QName _Email_QNAME = new QName("urn:uddi-org:api_v2", "email");
    private final static QName _TModelInstanceInfo_QNAME = new QName("urn:uddi-org:api_v2", "tModelInstanceInfo");
    private final static QName _BusinessEntity_QNAME = new QName("urn:uddi-org:api_v2", "businessEntity");
    private final static QName _PublisherAssertions_QNAME = new QName("urn:uddi-org:api_v2", "publisherAssertions");
    private final static QName _GetPublisherAssertions_QNAME = new QName("urn:uddi-org:api_v2", "get_publisherAssertions");
    private final static QName _Description_QNAME = new QName("urn:uddi-org:api_v2", "description");
    private final static QName _FindRelatedBusinesses_QNAME = new QName("urn:uddi-org:api_v2", "find_relatedBusinesses");
    private final static QName _ServiceInfo_QNAME = new QName("urn:uddi-org:api_v2", "serviceInfo");
    private final static QName _FromKey_QNAME = new QName("urn:uddi-org:api_v2", "fromKey");
    private final static QName _BusinessDetail_QNAME = new QName("urn:uddi-org:api_v2", "businessDetail");
    private final static QName _AddressLine_QNAME = new QName("urn:uddi-org:api_v2", "addressLine");
    private final static QName _PersonName_QNAME = new QName("urn:uddi-org:api_v2", "personName");
    private final static QName _AuthInfo_QNAME = new QName("urn:uddi-org:api_v2", "authInfo");
    private final static QName _SaveTModel_QNAME = new QName("urn:uddi-org:api_v2", "save_tModel");
    private final static QName _GetRegisteredInfo_QNAME = new QName("urn:uddi-org:api_v2", "get_registeredInfo");
    private final static QName _GetTModelDetail_QNAME = new QName("urn:uddi-org:api_v2", "get_tModelDetail");
    private final static QName _Name_QNAME = new QName("urn:uddi-org:api_v2", "name");
    private final static QName _BusinessInfo_QNAME = new QName("urn:uddi-org:api_v2", "businessInfo");
    private final static QName _BindingKey_QNAME = new QName("urn:uddi-org:api_v2", "bindingKey");
    private final static QName _DiscoveryURL_QNAME = new QName("urn:uddi-org:api_v2", "discoveryURL");
    private final static QName _BusinessInfos_QNAME = new QName("urn:uddi-org:api_v2", "businessInfos");
    private final static QName _DeletePublisherAssertions_QNAME = new QName("urn:uddi-org:api_v2", "delete_publisherAssertions");
    private final static QName _InstanceParms_QNAME = new QName("urn:uddi-org:api_v2", "instanceParms");
    private final static QName _TModelInfo_QNAME = new QName("urn:uddi-org:api_v2", "tModelInfo");
    private final static QName _RelatedBusinessInfos_QNAME = new QName("urn:uddi-org:api_v2", "relatedBusinessInfos");
    private final static QName _ServiceDetail_QNAME = new QName("urn:uddi-org:api_v2", "serviceDetail");
    private final static QName _InstanceDetails_QNAME = new QName("urn:uddi-org:api_v2", "instanceDetails");
    private final static QName _OverviewDoc_QNAME = new QName("urn:uddi-org:api_v2", "overviewDoc");
    private final static QName _SaveBinding_QNAME = new QName("urn:uddi-org:api_v2", "save_binding");
    private final static QName _BusinessKey_QNAME = new QName("urn:uddi-org:api_v2", "businessKey");
    private final static QName _RegisteredInfo_QNAME = new QName("urn:uddi-org:api_v2", "registeredInfo");
    private final static QName _AssertionStatusItem_QNAME = new QName("urn:uddi-org:api_v2", "assertionStatusItem");
    private final static QName _ErrInfo_QNAME = new QName("urn:uddi-org:api_v2", "errInfo");

    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.apache.ws.scout.model.uddi.v2
     * 
     */
    public ObjectFactory() {
    }

    /**
     * Create an instance of {@link PublisherAssertion }
     * 
     */
    public PublisherAssertion createPublisherAssertion() {
        return new PublisherAssertion();
    }

    /**
     * Create an instance of {@link Name }
     * 
     */
    public Name createName() {
        return new Name();
    }

    /**
     * Create an instance of {@link Contacts }
     * 
     */
    public Contacts createContacts() {
        return new Contacts();
    }

    /**
     * Create an instance of {@link OverviewDoc }
     * 
     */
    public OverviewDoc createOverviewDoc() {
        return new OverviewDoc();
    }

    /**
     * Create an instance of {@link DeletePublisherAssertions }
     * 
     */
    public DeletePublisherAssertions createDeletePublisherAssertions() {
        return new DeletePublisherAssertions();
    }

    /**
     * Create an instance of {@link DeleteBusiness }
     * 
     */
    public DeleteBusiness createDeleteBusiness() {
        return new DeleteBusiness();
    }

    /**
     * Create an instance of {@link GetAuthToken }
     * 
     */
    public GetAuthToken createGetAuthToken() {
        return new GetAuthToken();
    }

    /**
     * Create an instance of {@link PublisherAssertions }
     * 
     */
    public PublisherAssertions createPublisherAssertions() {
        return new PublisherAssertions();
    }

    /**
     * Create an instance of {@link DeleteBinding }
     * 
     */
    public DeleteBinding createDeleteBinding() {
        return new DeleteBinding();
    }

    /**
     * Create an instance of {@link ErrInfo }
     * 
     */
    public ErrInfo createErrInfo() {
        return new ErrInfo();
    }

    /**
     * Create an instance of {@link ServiceDetail }
     * 
     */
    public ServiceDetail createServiceDetail() {
        return new ServiceDetail();
    }

    /**
     * Create an instance of {@link SetPublisherAssertions }
     * 
     */
    public SetPublisherAssertions createSetPublisherAssertions() {
        return new SetPublisherAssertions();
    }

    /**
     * Create an instance of {@link Address }
     * 
     */
    public Address createAddress() {
        return new Address();
    }

    /**
     * Create an instance of {@link TModelInfo }
     * 
     */
    public TModelInfo createTModelInfo() {
        return new TModelInfo();
    }

    /**
     * Create an instance of {@link BusinessService }
     * 
     */
    public BusinessService createBusinessService() {
        return new BusinessService();
    }

    /**
     * Create an instance of {@link AddressLine }
     * 
     */
    public AddressLine createAddressLine() {
        return new AddressLine();
    }

    /**
     * Create an instance of {@link FindService }
     * 
     */
    public FindService createFindService() {
        return new FindService();
    }

    /**
     * Create an instance of {@link SharedRelationships }
     * 
     */
    public SharedRelationships createSharedRelationships() {
        return new SharedRelationships();
    }

    /**
     * Create an instance of {@link TModelInstanceDetails }
     * 
     */
    public TModelInstanceDetails createTModelInstanceDetails() {
        return new TModelInstanceDetails();
    }

    /**
     * Create an instance of {@link TModelDetail }
     * 
     */
    public TModelDetail createTModelDetail() {
        return new TModelDetail();
    }

    /**
     * Create an instance of {@link AuthToken }
     * 
     */
    public AuthToken createAuthToken() {
        return new AuthToken();
    }

    /**
     * Create an instance of {@link ValidateValues }
     * 
     */
    public ValidateValues createValidateValues() {
        return new ValidateValues();
    }

    /**
     * Create an instance of {@link TModelList }
     * 
     */
    public TModelList createTModelList() {
        return new TModelList();
    }

    /**
     * Create an instance of {@link DeleteTModel }
     * 
     */
    public DeleteTModel createDeleteTModel() {
        return new DeleteTModel();
    }

    /**
     * Create an instance of {@link Contact }
     * 
     */
    public Contact createContact() {
        return new Contact();
    }

    /**
     * Create an instance of {@link BusinessInfo }
     * 
     */
    public BusinessInfo createBusinessInfo() {
        return new BusinessInfo();
    }

    /**
     * Create an instance of {@link KeysOwned }
     * 
     */
    public KeysOwned createKeysOwned() {
        return new KeysOwned();
    }

    /**
     * Create an instance of {@link GetPublisherAssertions }
     * 
     */
    public GetPublisherAssertions createGetPublisherAssertions() {
        return new GetPublisherAssertions();
    }

    /**
     * Create an instance of {@link DiscoveryURL }
     * 
     */
    public DiscoveryURL createDiscoveryURL() {
        return new DiscoveryURL();
    }

    /**
     * Create an instance of {@link RelatedBusinessInfo }
     * 
     */
    public RelatedBusinessInfo createRelatedBusinessInfo() {
        return new RelatedBusinessInfo();
    }

    /**
     * Create an instance of {@link BindingTemplate }
     * 
     */
    public BindingTemplate createBindingTemplate() {
        return new BindingTemplate();
    }

    /**
     * Create an instance of {@link RelatedBusinessInfos }
     * 
     */
    public RelatedBusinessInfos createRelatedBusinessInfos() {
        return new RelatedBusinessInfos();
    }

    /**
     * Create an instance of {@link BindingDetail }
     * 
     */
    public BindingDetail createBindingDetail() {
        return new BindingDetail();
    }

    /**
     * Create an instance of {@link Email }
     * 
     */
    public Email createEmail() {
        return new Email();
    }

    /**
     * Create an instance of {@link BusinessDetailExt }
     * 
     */
    public BusinessDetailExt createBusinessDetailExt() {
        return new BusinessDetailExt();
    }

    /**
     * Create an instance of {@link DeleteService }
     * 
     */
    public DeleteService createDeleteService() {
        return new DeleteService();
    }

    /**
     * Create an instance of {@link CategoryBag }
     * 
     */
    public CategoryBag createCategoryBag() {
        return new CategoryBag();
    }

    /**
     * Create an instance of {@link BusinessDetail }
     * 
     */
    public BusinessDetail createBusinessDetail() {
        return new BusinessDetail();
    }

    /**
     * Create an instance of {@link FindQualifiers }
     * 
     */
    public FindQualifiers createFindQualifiers() {
        return new FindQualifiers();
    }

    /**
     * Create an instance of {@link AddPublisherAssertions }
     * 
     */
    public AddPublisherAssertions createAddPublisherAssertions() {
        return new AddPublisherAssertions();
    }

    /**
     * Create an instance of {@link Description }
     * 
     */
    public Description createDescription() {
        return new Description();
    }

    /**
     * Create an instance of {@link AssertionStatusItem }
     * 
     */
    public AssertionStatusItem createAssertionStatusItem() {
        return new AssertionStatusItem();
    }

    /**
     * Create an instance of {@link FindTModel }
     * 
     */
    public FindTModel createFindTModel() {
        return new FindTModel();
    }

    /**
     * Create an instance of {@link AssertionStatusReport }
     * 
     */
    public AssertionStatusReport createAssertionStatusReport() {
        return new AssertionStatusReport();
    }

    /**
     * Create an instance of {@link SaveBinding }
     * 
     */
    public SaveBinding createSaveBinding() {
        return new SaveBinding();
    }

    /**
     * Create an instance of {@link IdentifierBag }
     * 
     */
    public IdentifierBag createIdentifierBag() {
        return new IdentifierBag();
    }

    /**
     * Create an instance of {@link GetBusinessDetail }
     * 
     */
    public GetBusinessDetail createGetBusinessDetail() {
        return new GetBusinessDetail();
    }

    /**
     * Create an instance of {@link Phone }
     * 
     */
    public Phone createPhone() {
        return new Phone();
    }

    /**
     * Create an instance of {@link TModel }
     * 
     */
    public TModel createTModel() {
        return new TModel();
    }

    /**
     * Create an instance of {@link BusinessEntity }
     * 
     */
    public BusinessEntity createBusinessEntity() {
        return new BusinessEntity();
    }

    /**
     * Create an instance of {@link RelatedBusinessesList }
     * 
     */
    public RelatedBusinessesList createRelatedBusinessesList() {
        return new RelatedBusinessesList();
    }

    /**
     * Create an instance of {@link DiscardAuthToken }
     * 
     */
    public DiscardAuthToken createDiscardAuthToken() {
        return new DiscardAuthToken();
    }

    /**
     * Create an instance of {@link BusinessList }
     * 
     */
    public BusinessList createBusinessList() {
        return new BusinessList();
    }

    /**
     * Create an instance of {@link BusinessEntityExt }
     * 
     */
    public BusinessEntityExt createBusinessEntityExt() {
        return new BusinessEntityExt();
    }

    /**
     * Create an instance of {@link SaveBusiness }
     * 
     */
    public SaveBusiness createSaveBusiness() {
        return new SaveBusiness();
    }

    /**
     * Create an instance of {@link ServiceInfos }
     * 
     */
    public ServiceInfos createServiceInfos() {
        return new ServiceInfos();
    }

    /**
     * Create an instance of {@link SaveTModel }
     * 
     */
    public SaveTModel createSaveTModel() {
        return new SaveTModel();
    }

    /**
     * Create an instance of {@link ServiceList }
     * 
     */
    public ServiceList createServiceList() {
        return new ServiceList();
    }

    /**
     * Create an instance of {@link SaveService }
     * 
     */
    public SaveService createSaveService() {
        return new SaveService();
    }

    /**
     * Create an instance of {@link BusinessInfos }
     * 
     */
    public BusinessInfos createBusinessInfos() {
        return new BusinessInfos();
    }

    /**
     * Create an instance of {@link TModelInfos }
     * 
     */
    public TModelInfos createTModelInfos() {
        return new TModelInfos();
    }

    /**
     * Create an instance of {@link GetBindingDetail }
     * 
     */
    public GetBindingDetail createGetBindingDetail() {
        return new GetBindingDetail();
    }

    /**
     * Create an instance of {@link GetBusinessDetailExt }
     * 
     */
    public GetBusinessDetailExt createGetBusinessDetailExt() {
        return new GetBusinessDetailExt();
    }

    /**
     * Create an instance of {@link GetRegisteredInfo }
     * 
     */
    public GetRegisteredInfo createGetRegisteredInfo() {
        return new GetRegisteredInfo();
    }

    /**
     * Create an instance of {@link HostingRedirector }
     * 
     */
    public HostingRedirector createHostingRedirector() {
        return new HostingRedirector();
    }

    /**
     * Create an instance of {@link FindRelatedBusinesses }
     * 
     */
    public FindRelatedBusinesses createFindRelatedBusinesses() {
        return new FindRelatedBusinesses();
    }

    /**
     * Create an instance of {@link BindingTemplates }
     * 
     */
    public BindingTemplates createBindingTemplates() {
        return new BindingTemplates();
    }

    /**
     * Create an instance of {@link InstanceDetails }
     * 
     */
    public InstanceDetails createInstanceDetails() {
        return new InstanceDetails();
    }

    /**
     * Create an instance of {@link TModelBag }
     * 
     */
    public TModelBag createTModelBag() {
        return new TModelBag();
    }

    /**
     * Create an instance of {@link FindBinding }
     * 
     */
    public FindBinding createFindBinding() {
        return new FindBinding();
    }

    /**
     * Create an instance of {@link DiscoveryURLs }
     * 
     */
    public DiscoveryURLs createDiscoveryURLs() {
        return new DiscoveryURLs();
    }

    /**
     * Create an instance of {@link GetTModelDetail }
     * 
     */
    public GetTModelDetail createGetTModelDetail() {
        return new GetTModelDetail();
    }

    /**
     * Create an instance of {@link GetServiceDetail }
     * 
     */
    public GetServiceDetail createGetServiceDetail() {
        return new GetServiceDetail();
    }

    /**
     * Create an instance of {@link KeyedReference }
     * 
     */
    public KeyedReference createKeyedReference() {
        return new KeyedReference();
    }

    /**
     * Create an instance of {@link Result }
     * 
     */
    public Result createResult() {
        return new Result();
    }

    /**
     * Create an instance of {@link ServiceInfo }
     * 
     */
    public ServiceInfo createServiceInfo() {
        return new ServiceInfo();
    }

    /**
     * Create an instance of {@link FindBusiness }
     * 
     */
    public FindBusiness createFindBusiness() {
        return new FindBusiness();
    }

    /**
     * Create an instance of {@link GetAssertionStatusReport }
     * 
     */
    public GetAssertionStatusReport createGetAssertionStatusReport() {
        return new GetAssertionStatusReport();
    }

    /**
     * Create an instance of {@link TModelInstanceInfo }
     * 
     */
    public TModelInstanceInfo createTModelInstanceInfo() {
        return new TModelInstanceInfo();
    }

    /**
     * Create an instance of {@link BusinessServices }
     * 
     */
    public BusinessServices createBusinessServices() {
        return new BusinessServices();
    }

    /**
     * Create an instance of {@link AccessPoint }
     * 
     */
    public AccessPoint createAccessPoint() {
        return new AccessPoint();
    }

    /**
     * Create an instance of {@link RegisteredInfo }
     * 
     */
    public RegisteredInfo createRegisteredInfo() {
        return new RegisteredInfo();
    }

    /**
     * Create an instance of {@link DispositionReport }
     * 
     */
    public DispositionReport createDispositionReport() {
        return new DispositionReport();
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link RelatedBusinessesList }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "relatedBusinessesList")
    public JAXBElement<RelatedBusinessesList> createRelatedBusinessesList(RelatedBusinessesList value) {
        return new JAXBElement<RelatedBusinessesList>(_RelatedBusinessesList_QNAME, RelatedBusinessesList.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "tModelKey")
    public JAXBElement<String> createTModelKey(String value) {
        return new JAXBElement<String>(_TModelKey_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link GetServiceDetail }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "get_serviceDetail")
    public JAXBElement<GetServiceDetail> createGetServiceDetail(GetServiceDetail value) {
        return new JAXBElement<GetServiceDetail>(_GetServiceDetail_QNAME, GetServiceDetail.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "findQualifier")
    public JAXBElement<String> createFindQualifier(String value) {
        return new JAXBElement<String>(_FindQualifier_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "toKey")
    public JAXBElement<String> createToKey(String value) {
        return new JAXBElement<String>(_ToKey_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BindingTemplate }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "bindingTemplate")
    public JAXBElement<BindingTemplate> createBindingTemplate(BindingTemplate value) {
        return new JAXBElement<BindingTemplate>(_BindingTemplate_QNAME, BindingTemplate.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link FindService }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "find_service")
    public JAXBElement<FindService> createFindService(FindService value) {
        return new JAXBElement<FindService>(_FindService_QNAME, FindService.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CategoryBag }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "categoryBag")
    public JAXBElement<CategoryBag> createCategoryBag(CategoryBag value) {
        return new JAXBElement<CategoryBag>(_CategoryBag_QNAME, CategoryBag.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link SaveBusiness }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "save_business")
    public JAXBElement<SaveBusiness> createSaveBusiness(SaveBusiness value) {
        return new JAXBElement<SaveBusiness>(_SaveBusiness_QNAME, SaveBusiness.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link IdentifierBag }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "identifierBag")
    public JAXBElement<IdentifierBag> createIdentifierBag(IdentifierBag value) {
        return new JAXBElement<IdentifierBag>(_IdentifierBag_QNAME, IdentifierBag.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link SaveService }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "save_service")
    public JAXBElement<SaveService> createSaveService(SaveService value) {
        return new JAXBElement<SaveService>(_SaveService_QNAME, SaveService.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ValidateValues }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "validate_values")
    public JAXBElement<ValidateValues> createValidateValues(ValidateValues value) {
        return new JAXBElement<ValidateValues>(_ValidateValues_QNAME, ValidateValues.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link Contacts }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "contacts")
    public JAXBElement<Contacts> createContacts(Contacts value) {
        return new JAXBElement<Contacts>(_Contacts_QNAME, Contacts.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link Phone }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "phone")
    public JAXBElement<Phone> createPhone(Phone value) {
        return new JAXBElement<Phone>(_Phone_QNAME, Phone.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BusinessEntityExt }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "businessEntityExt")
    public JAXBElement<BusinessEntityExt> createBusinessEntityExt(BusinessEntityExt value) {
        return new JAXBElement<BusinessEntityExt>(_BusinessEntityExt_QNAME, BusinessEntityExt.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link Contact }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "contact")
    public JAXBElement<Contact> createContact(Contact value) {
        return new JAXBElement<Contact>(_Contact_QNAME, Contact.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link GetAssertionStatusReport }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "get_assertionStatusReport")
    public JAXBElement<GetAssertionStatusReport> createGetAssertionStatusReport(GetAssertionStatusReport value) {
        return new JAXBElement<GetAssertionStatusReport>(_GetAssertionStatusReport_QNAME, GetAssertionStatusReport.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link GetBusinessDetailExt }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "get_businessDetailExt")
    public JAXBElement<GetBusinessDetailExt> createGetBusinessDetailExt(GetBusinessDetailExt value) {
        return new JAXBElement<GetBusinessDetailExt>(_GetBusinessDetailExt_QNAME, GetBusinessDetailExt.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BindingDetail }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "bindingDetail")
    public JAXBElement<BindingDetail> createBindingDetail(BindingDetail value) {
        return new JAXBElement<BindingDetail>(_BindingDetail_QNAME, BindingDetail.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TModelDetail }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "tModelDetail")
    public JAXBElement<TModelDetail> createTModelDetail(TModelDetail value) {
        return new JAXBElement<TModelDetail>(_TModelDetail_QNAME, TModelDetail.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AccessPoint }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "accessPoint")
    public JAXBElement<AccessPoint> createAccessPoint(AccessPoint value) {
        return new JAXBElement<AccessPoint>(_AccessPoint_QNAME, AccessPoint.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link SetPublisherAssertions }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "set_publisherAssertions")
    public JAXBElement<SetPublisherAssertions> createSetPublisherAssertions(SetPublisherAssertions value) {
        return new JAXBElement<SetPublisherAssertions>(_SetPublisherAssertions_QNAME, SetPublisherAssertions.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link SharedRelationships }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "sharedRelationships")
    public JAXBElement<SharedRelationships> createSharedRelationships(SharedRelationships value) {
        return new JAXBElement<SharedRelationships>(_SharedRelationships_QNAME, SharedRelationships.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link GetAuthToken }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "get_authToken")
    public JAXBElement<GetAuthToken> createGetAuthToken(GetAuthToken value) {
        return new JAXBElement<GetAuthToken>(_GetAuthToken_QNAME, GetAuthToken.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link HostingRedirector }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "hostingRedirector")
    public JAXBElement<HostingRedirector> createHostingRedirector(HostingRedirector value) {
        return new JAXBElement<HostingRedirector>(_HostingRedirector_QNAME, HostingRedirector.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link Address }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "address")
    public JAXBElement<Address> createAddress(Address value) {
        return new JAXBElement<Address>(_Address_QNAME, Address.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link FindBusiness }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "find_business")
    public JAXBElement<FindBusiness> createFindBusiness(FindBusiness value) {
        return new JAXBElement<FindBusiness>(_FindBusiness_QNAME, FindBusiness.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BusinessList }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "businessList")
    public JAXBElement<BusinessList> createBusinessList(BusinessList value) {
        return new JAXBElement<BusinessList>(_BusinessList_QNAME, BusinessList.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link FindTModel }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "find_tModel")
    public JAXBElement<FindTModel> createFindTModel(FindTModel value) {
        return new JAXBElement<FindTModel>(_FindTModel_QNAME, FindTModel.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ServiceInfos }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "serviceInfos")
    public JAXBElement<ServiceInfos> createServiceInfos(ServiceInfos value) {
        return new JAXBElement<ServiceInfos>(_ServiceInfos_QNAME, ServiceInfos.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "serviceKey")
    public JAXBElement<String> createServiceKey(String value) {
        return new JAXBElement<String>(_ServiceKey_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BusinessDetailExt }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "businessDetailExt")
    public JAXBElement<BusinessDetailExt> createBusinessDetailExt(BusinessDetailExt value) {
        return new JAXBElement<BusinessDetailExt>(_BusinessDetailExt_QNAME, BusinessDetailExt.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link RelatedBusinessInfo }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "relatedBusinessInfo")
    public JAXBElement<RelatedBusinessInfo> createRelatedBusinessInfo(RelatedBusinessInfo value) {
        return new JAXBElement<RelatedBusinessInfo>(_RelatedBusinessInfo_QNAME, RelatedBusinessInfo.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DispositionReport }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "dispositionReport")
    public JAXBElement<DispositionReport> createDispositionReport(DispositionReport value) {
        return new JAXBElement<DispositionReport>(_DispositionReport_QNAME, DispositionReport.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link FindBinding }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "find_binding")
    public JAXBElement<FindBinding> createFindBinding(FindBinding value) {
        return new JAXBElement<FindBinding>(_FindBinding_QNAME, FindBinding.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ServiceList }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "serviceList")
    public JAXBElement<ServiceList> createServiceList(ServiceList value) {
        return new JAXBElement<ServiceList>(_ServiceList_QNAME, ServiceList.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PublisherAssertion }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "publisherAssertion")
    public JAXBElement<PublisherAssertion> createPublisherAssertion(PublisherAssertion value) {
        return new JAXBElement<PublisherAssertion>(_PublisherAssertion_QNAME, PublisherAssertion.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AuthToken }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "authToken")
    public JAXBElement<AuthToken> createAuthToken(AuthToken value) {
        return new JAXBElement<AuthToken>(_AuthToken_QNAME, AuthToken.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "overviewURL")
    public JAXBElement<String> createOverviewURL(String value) {
        return new JAXBElement<String>(_OverviewURL_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DeleteService }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "delete_service")
    public JAXBElement<DeleteService> createDeleteService(DeleteService value) {
        return new JAXBElement<DeleteService>(_DeleteService_QNAME, DeleteService.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link FindQualifiers }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "findQualifiers")
    public JAXBElement<FindQualifiers> createFindQualifiers(FindQualifiers value) {
        return new JAXBElement<FindQualifiers>(_FindQualifiers_QNAME, FindQualifiers.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DiscoveryURLs }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "discoveryURLs")
    public JAXBElement<DiscoveryURLs> createDiscoveryURLs(DiscoveryURLs value) {
        return new JAXBElement<DiscoveryURLs>(_DiscoveryURLs_QNAME, DiscoveryURLs.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BusinessService }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "businessService")
    public JAXBElement<BusinessService> createBusinessService(BusinessService value) {
        return new JAXBElement<BusinessService>(_BusinessService_QNAME, BusinessService.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DiscardAuthToken }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "discard_authToken")
    public JAXBElement<DiscardAuthToken> createDiscardAuthToken(DiscardAuthToken value) {
        return new JAXBElement<DiscardAuthToken>(_DiscardAuthToken_QNAME, DiscardAuthToken.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DeleteBinding }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "delete_binding")
    public JAXBElement<DeleteBinding> createDeleteBinding(DeleteBinding value) {
        return new JAXBElement<DeleteBinding>(_DeleteBinding_QNAME, DeleteBinding.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TModel }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "tModel")
    public JAXBElement<TModel> createTModel(TModel value) {
        return new JAXBElement<TModel>(_TModel_QNAME, TModel.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BusinessServices }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "businessServices")
    public JAXBElement<BusinessServices> createBusinessServices(BusinessServices value) {
        return new JAXBElement<BusinessServices>(_BusinessServices_QNAME, BusinessServices.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TModelInfos }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "tModelInfos")
    public JAXBElement<TModelInfos> createTModelInfos(TModelInfos value) {
        return new JAXBElement<TModelInfos>(_TModelInfos_QNAME, TModelInfos.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link Result }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "result")
    public JAXBElement<Result> createResult(Result value) {
        return new JAXBElement<Result>(_Result_QNAME, Result.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "uploadRegister")
    public JAXBElement<String> createUploadRegister(String value) {
        return new JAXBElement<String>(_UploadRegister_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link GetBusinessDetail }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "get_businessDetail")
    public JAXBElement<GetBusinessDetail> createGetBusinessDetail(GetBusinessDetail value) {
        return new JAXBElement<GetBusinessDetail>(_GetBusinessDetail_QNAME, GetBusinessDetail.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AddPublisherAssertions }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "add_publisherAssertions")
    public JAXBElement<AddPublisherAssertions> createAddPublisherAssertions(AddPublisherAssertions value) {
        return new JAXBElement<AddPublisherAssertions>(_AddPublisherAssertions_QNAME, AddPublisherAssertions.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "completionStatus")
    public JAXBElement<String> createCompletionStatus(String value) {
        return new JAXBElement<String>(_CompletionStatus_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link GetBindingDetail }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "get_bindingDetail")
    public JAXBElement<GetBindingDetail> createGetBindingDetail(GetBindingDetail value) {
        return new JAXBElement<GetBindingDetail>(_GetBindingDetail_QNAME, GetBindingDetail.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TModelInstanceDetails }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "tModelInstanceDetails")
    public JAXBElement<TModelInstanceDetails> createTModelInstanceDetails(TModelInstanceDetails value) {
        return new JAXBElement<TModelInstanceDetails>(_TModelInstanceDetails_QNAME, TModelInstanceDetails.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TModelBag }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "tModelBag")
    public JAXBElement<TModelBag> createTModelBag(TModelBag value) {
        return new JAXBElement<TModelBag>(_TModelBag_QNAME, TModelBag.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TModelList }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "tModelList")
    public JAXBElement<TModelList> createTModelList(TModelList value) {
        return new JAXBElement<TModelList>(_TModelList_QNAME, TModelList.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link KeysOwned }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "keysOwned")
    public JAXBElement<KeysOwned> createKeysOwned(KeysOwned value) {
        return new JAXBElement<KeysOwned>(_KeysOwned_QNAME, KeysOwned.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DeleteBusiness }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "delete_business")
    public JAXBElement<DeleteBusiness> createDeleteBusiness(DeleteBusiness value) {
        return new JAXBElement<DeleteBusiness>(_DeleteBusiness_QNAME, DeleteBusiness.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AssertionStatusReport }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "assertionStatusReport")
    public JAXBElement<AssertionStatusReport> createAssertionStatusReport(AssertionStatusReport value) {
        return new JAXBElement<AssertionStatusReport>(_AssertionStatusReport_QNAME, AssertionStatusReport.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link KeyedReference }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "keyedReference")
    public JAXBElement<KeyedReference> createKeyedReference(KeyedReference value) {
        return new JAXBElement<KeyedReference>(_KeyedReference_QNAME, KeyedReference.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BindingTemplates }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "bindingTemplates")
    public JAXBElement<BindingTemplates> createBindingTemplates(BindingTemplates value) {
        return new JAXBElement<BindingTemplates>(_BindingTemplates_QNAME, BindingTemplates.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DeleteTModel }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "delete_tModel")
    public JAXBElement<DeleteTModel> createDeleteTModel(DeleteTModel value) {
        return new JAXBElement<DeleteTModel>(_DeleteTModel_QNAME, DeleteTModel.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link Email }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "email")
    public JAXBElement<Email> createEmail(Email value) {
        return new JAXBElement<Email>(_Email_QNAME, Email.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TModelInstanceInfo }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "tModelInstanceInfo")
    public JAXBElement<TModelInstanceInfo> createTModelInstanceInfo(TModelInstanceInfo value) {
        return new JAXBElement<TModelInstanceInfo>(_TModelInstanceInfo_QNAME, TModelInstanceInfo.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BusinessEntity }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "businessEntity")
    public JAXBElement<BusinessEntity> createBusinessEntity(BusinessEntity value) {
        return new JAXBElement<BusinessEntity>(_BusinessEntity_QNAME, BusinessEntity.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PublisherAssertions }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "publisherAssertions")
    public JAXBElement<PublisherAssertions> createPublisherAssertions(PublisherAssertions value) {
        return new JAXBElement<PublisherAssertions>(_PublisherAssertions_QNAME, PublisherAssertions.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link GetPublisherAssertions }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "get_publisherAssertions")
    public JAXBElement<GetPublisherAssertions> createGetPublisherAssertions(GetPublisherAssertions value) {
        return new JAXBElement<GetPublisherAssertions>(_GetPublisherAssertions_QNAME, GetPublisherAssertions.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link Description }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "description")
    public JAXBElement<Description> createDescription(Description value) {
        return new JAXBElement<Description>(_Description_QNAME, Description.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link FindRelatedBusinesses }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "find_relatedBusinesses")
    public JAXBElement<FindRelatedBusinesses> createFindRelatedBusinesses(FindRelatedBusinesses value) {
        return new JAXBElement<FindRelatedBusinesses>(_FindRelatedBusinesses_QNAME, FindRelatedBusinesses.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ServiceInfo }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "serviceInfo")
    public JAXBElement<ServiceInfo> createServiceInfo(ServiceInfo value) {
        return new JAXBElement<ServiceInfo>(_ServiceInfo_QNAME, ServiceInfo.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "fromKey")
    public JAXBElement<String> createFromKey(String value) {
        return new JAXBElement<String>(_FromKey_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BusinessDetail }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "businessDetail")
    public JAXBElement<BusinessDetail> createBusinessDetail(BusinessDetail value) {
        return new JAXBElement<BusinessDetail>(_BusinessDetail_QNAME, BusinessDetail.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AddressLine }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "addressLine")
    public JAXBElement<AddressLine> createAddressLine(AddressLine value) {
        return new JAXBElement<AddressLine>(_AddressLine_QNAME, AddressLine.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "personName")
    public JAXBElement<String> createPersonName(String value) {
        return new JAXBElement<String>(_PersonName_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "authInfo")
    public JAXBElement<String> createAuthInfo(String value) {
        return new JAXBElement<String>(_AuthInfo_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link SaveTModel }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "save_tModel")
    public JAXBElement<SaveTModel> createSaveTModel(SaveTModel value) {
        return new JAXBElement<SaveTModel>(_SaveTModel_QNAME, SaveTModel.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link GetRegisteredInfo }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "get_registeredInfo")
    public JAXBElement<GetRegisteredInfo> createGetRegisteredInfo(GetRegisteredInfo value) {
        return new JAXBElement<GetRegisteredInfo>(_GetRegisteredInfo_QNAME, GetRegisteredInfo.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link GetTModelDetail }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "get_tModelDetail")
    public JAXBElement<GetTModelDetail> createGetTModelDetail(GetTModelDetail value) {
        return new JAXBElement<GetTModelDetail>(_GetTModelDetail_QNAME, GetTModelDetail.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link Name }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "name")
    public JAXBElement<Name> createName(Name value) {
        return new JAXBElement<Name>(_Name_QNAME, Name.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BusinessInfo }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "businessInfo")
    public JAXBElement<BusinessInfo> createBusinessInfo(BusinessInfo value) {
        return new JAXBElement<BusinessInfo>(_BusinessInfo_QNAME, BusinessInfo.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "bindingKey")
    public JAXBElement<String> createBindingKey(String value) {
        return new JAXBElement<String>(_BindingKey_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DiscoveryURL }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "discoveryURL")
    public JAXBElement<DiscoveryURL> createDiscoveryURL(DiscoveryURL value) {
        return new JAXBElement<DiscoveryURL>(_DiscoveryURL_QNAME, DiscoveryURL.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BusinessInfos }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "businessInfos")
    public JAXBElement<BusinessInfos> createBusinessInfos(BusinessInfos value) {
        return new JAXBElement<BusinessInfos>(_BusinessInfos_QNAME, BusinessInfos.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DeletePublisherAssertions }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "delete_publisherAssertions")
    public JAXBElement<DeletePublisherAssertions> createDeletePublisherAssertions(DeletePublisherAssertions value) {
        return new JAXBElement<DeletePublisherAssertions>(_DeletePublisherAssertions_QNAME, DeletePublisherAssertions.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "instanceParms")
    public JAXBElement<String> createInstanceParms(String value) {
        return new JAXBElement<String>(_InstanceParms_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TModelInfo }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "tModelInfo")
    public JAXBElement<TModelInfo> createTModelInfo(TModelInfo value) {
        return new JAXBElement<TModelInfo>(_TModelInfo_QNAME, TModelInfo.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link RelatedBusinessInfos }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "relatedBusinessInfos")
    public JAXBElement<RelatedBusinessInfos> createRelatedBusinessInfos(RelatedBusinessInfos value) {
        return new JAXBElement<RelatedBusinessInfos>(_RelatedBusinessInfos_QNAME, RelatedBusinessInfos.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ServiceDetail }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "serviceDetail")
    public JAXBElement<ServiceDetail> createServiceDetail(ServiceDetail value) {
        return new JAXBElement<ServiceDetail>(_ServiceDetail_QNAME, ServiceDetail.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link InstanceDetails }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "instanceDetails")
    public JAXBElement<InstanceDetails> createInstanceDetails(InstanceDetails value) {
        return new JAXBElement<InstanceDetails>(_InstanceDetails_QNAME, InstanceDetails.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link OverviewDoc }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "overviewDoc")
    public JAXBElement<OverviewDoc> createOverviewDoc(OverviewDoc value) {
        return new JAXBElement<OverviewDoc>(_OverviewDoc_QNAME, OverviewDoc.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link SaveBinding }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "save_binding")
    public JAXBElement<SaveBinding> createSaveBinding(SaveBinding value) {
        return new JAXBElement<SaveBinding>(_SaveBinding_QNAME, SaveBinding.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "businessKey")
    public JAXBElement<String> createBusinessKey(String value) {
        return new JAXBElement<String>(_BusinessKey_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link RegisteredInfo }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "registeredInfo")
    public JAXBElement<RegisteredInfo> createRegisteredInfo(RegisteredInfo value) {
        return new JAXBElement<RegisteredInfo>(_RegisteredInfo_QNAME, RegisteredInfo.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AssertionStatusItem }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "assertionStatusItem")
    public JAXBElement<AssertionStatusItem> createAssertionStatusItem(AssertionStatusItem value) {
        return new JAXBElement<AssertionStatusItem>(_AssertionStatusItem_QNAME, AssertionStatusItem.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ErrInfo }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:uddi-org:api_v2", name = "errInfo")
    public JAXBElement<ErrInfo> createErrInfo(ErrInfo value) {
        return new JAXBElement<ErrInfo>(_ErrInfo_QNAME, ErrInfo.class, null, value);
    }

}
