diff --git a/modules/adb-codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate-bean.xsl b/modules/adb-codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate-bean.xsl
index 9f9d564..1dd0412 100644
--- a/modules/adb-codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate-bean.xsl
+++ b/modules/adb-codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate-bean.xsl
@@ -1458,7 +1458,7 @@
                                        javax.xml.stream.XMLStreamWriter xmlWriter) throws javax.xml.stream.XMLStreamException {
             java.lang.String writerPrefix = xmlWriter.getPrefix(namespace);
             if (writerPrefix != null) {
-                xmlWriter.writeStartElement(namespace, localPart);
+                xmlWriter.writeStartElement(writerPrefix, localPart, namespace);
             } else {
                 if (namespace.length() == 0) {
                     prefix = "";
@@ -1477,11 +1477,14 @@
          */
         private void writeAttribute(java.lang.String prefix,java.lang.String namespace,java.lang.String attName,
                                     java.lang.String attValue,javax.xml.stream.XMLStreamWriter xmlWriter) throws javax.xml.stream.XMLStreamException{
-            if (xmlWriter.getPrefix(namespace) == null) {
+            java.lang.String writerPrefix = xmlWriter.getPrefix(namespace);
+            if (writerPrefix != null) {
+                xmlWriter.writeAttribute(writerPrefix, namespace,attName,attValue);
+            } else {
                 xmlWriter.writeNamespace(prefix, namespace);
                 xmlWriter.setPrefix(prefix, namespace);
+                xmlWriter.writeAttribute(prefix, namespace,attName,attValue);
             }
-            xmlWriter.writeAttribute(namespace,attName,attValue);
         }
 
         /**
@@ -1492,8 +1495,7 @@
             if (namespace.equals("")) {
                 xmlWriter.writeAttribute(attName,attValue);
             } else {
-                registerPrefix(xmlWriter, namespace);
-                xmlWriter.writeAttribute(namespace,attName,attValue);
+                xmlWriter.writeAttribute(registerPrefix(xmlWriter, namespace), namespace,attName,attValue);
             }
         }
 
@@ -1520,7 +1522,7 @@
                     xmlWriter.writeAttribute(attName, attributeValue);
                 } else {
                     registerPrefix(xmlWriter, namespace);
-                    xmlWriter.writeAttribute(namespace, attName, attributeValue);
+                    xmlWriter.writeAttribute(attributePrefix, namespace, attName, attributeValue);
                 }
             }
         /**
diff --git a/modules/adb-codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate-helpermode.xsl b/modules/adb-codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate-helpermode.xsl
index 22961a1..cf31d7e 100644
--- a/modules/adb-codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate-helpermode.xsl
+++ b/modules/adb-codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate-helpermode.xsl
@@ -1051,7 +1051,7 @@
                                        javax.xml.stream.XMLStreamWriter xmlWriter) throws javax.xml.stream.XMLStreamException {
             java.lang.String writerPrefix = xmlWriter.getPrefix(namespace);
             if (writerPrefix != null) {
-                xmlWriter.writeStartElement(namespace, localPart);
+                xmlWriter.writeStartElement(writerPrefix, localPart, namespace);
             } else {
                 if (namespace.length() == 0) {
                     prefix = "";
@@ -1070,11 +1070,14 @@
          */
         private void writeAttribute(java.lang.String prefix,java.lang.String namespace,java.lang.String attName,
                                     java.lang.String attValue,javax.xml.stream.XMLStreamWriter xmlWriter) throws javax.xml.stream.XMLStreamException{
-            if (xmlWriter.getPrefix(namespace) == null) {
+            java.lang.String writerPrefix = xmlWriter.getPrefix(namespace);
+            if (writerPrefix != null) {
+                xmlWriter.writeAttribute(writerPrefix, namespace,attName,attValue);
+            } else {
                 xmlWriter.writeNamespace(prefix, namespace);
                 xmlWriter.setPrefix(prefix, namespace);
+                xmlWriter.writeAttribute(prefix, namespace,attName,attValue);
             }
-            xmlWriter.writeAttribute(namespace,attName,attValue);
         }
 
         /**
@@ -1085,8 +1088,7 @@
             if (namespace.equals("")) {
                 xmlWriter.writeAttribute(attName,attValue);
             } else {
-                registerPrefix(xmlWriter, namespace);
-                xmlWriter.writeAttribute(namespace,attName,attValue);
+                xmlWriter.writeAttribute(registerPrefix(xmlWriter, namespace), namespace,attName,attValue);
             }
         }
 
diff --git a/modules/adb/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java b/modules/adb/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java
index d6616f8..c453724 100644
--- a/modules/adb/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java
+++ b/modules/adb/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java
@@ -31,7 +31,7 @@
 import org.apache.axis2.description.Parameter;
 import org.apache.axis2.description.WSDL2Constants;
 import org.apache.axis2.description.java2wsdl.Java2WSDLConstants;
-import org.apache.axis2.receivers.AbstractInOutAsyncMessageReceiver;
+import org.apache.axis2.receivers.AbstractInMessageReceiver;
 import org.apache.axis2.wsdl.WSDLConstants;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -39,7 +39,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
-public class RPCInOutAsyncMessageReceiver extends AbstractInOutAsyncMessageReceiver {
+public class RPCInOutAsyncMessageReceiver extends AbstractInMessageReceiver {
 
     private static Log log = LogFactory.getLog(RPCInOnlyMessageReceiver.class);
 
@@ -67,7 +67,7 @@
             // get the implementation class for the Web Service
             Object obj = getTheImplementationObject(inMessage);
 
-            Class ImplClass = obj.getClass();
+            Class<?> ImplClass = obj.getClass();
 
             AxisOperation op = inMessage.getOperationContext().getAxisOperation();
             AxisService service = inMessage.getAxisService();
@@ -137,7 +137,7 @@
             if (cause != null) {
                 msg = cause.getMessage();
             }
-            if (msg == null) {
+            if (msg == null && method != null) {
                 msg = "Exception occurred while trying to invoke service method " +
                         method.getName();
             }
@@ -147,10 +147,20 @@
             }
             throw new AxisFault(msg);
         } catch (Exception e) {
-            String msg = "Exception occurred while trying to invoke service method " +
-                    method.getName();
-            log.error(msg, e);
-            throw new AxisFault(msg, e);
+            if(method != null){
+                String msg = "Exception occurred while trying to invoke service method " +
+                method.getName(); 
+                log.error(msg, e);
+                throw new AxisFault(msg, e);
+            }            
+            
         }
     }
+    
+    @Override
+    protected void invokeBusinessLogic(MessageContext messageCtx) throws AxisFault {
+        messageCtx.setProperty(DO_ASYNC, Boolean.TRUE);
+        super.receive(messageCtx);
+        
+    }
 }
diff --git a/modules/corba/src/org/apache/axis2/corba/receivers/CorbaInOutAsyncMessageReceiver.java b/modules/corba/src/org/apache/axis2/corba/receivers/CorbaInOutAsyncMessageReceiver.java
deleted file mode 100644
index 968e3b8..0000000
--- a/modules/corba/src/org/apache/axis2/corba/receivers/CorbaInOutAsyncMessageReceiver.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * 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 org.apache.axis2.corba.receivers;
-
-import org.apache.axiom.om.OMElement;
-import org.apache.axiom.om.OMNamespace;
-import org.apache.axiom.soap.SOAPFactory;
-import org.apache.axis2.AxisFault;
-import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.corba.deployer.CorbaConstants;
-import org.apache.axis2.corba.deployer.SchemaToIDLMapping;
-import org.apache.axis2.corba.exceptions.CorbaInvocationException;
-import org.apache.axis2.corba.idl.types.IDL;
-import org.apache.axis2.corba.idl.types.Member;
-import org.apache.axis2.description.AxisMessage;
-import org.apache.axis2.description.AxisOperation;
-import org.apache.axis2.description.AxisService;
-import org.apache.axis2.description.Parameter;
-import org.apache.axis2.receivers.AbstractInOutAsyncMessageReceiver;
-import org.apache.axis2.wsdl.WSDLConstants;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.omg.CORBA_2_3.ORB;
-
-import javax.xml.namespace.QName;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * This is takes care of the IN-OUT sync MEP in the server side
- *
- * @deprecated no longer needed, going away after 1.3
- */
-public class CorbaInOutAsyncMessageReceiver extends AbstractInOutAsyncMessageReceiver implements CorbaConstants {
-
-    private static Log log = LogFactory.getLog(CorbaInOutAsyncMessageReceiver.class);
-    private ORB orb = null;
-    private Map invokerCache = new HashMap();
-
-    public void invokeBusinessLogic(MessageContext inMessage, MessageContext outMessage) throws AxisFault {
-        try{
-            invoke(inMessage, outMessage);
-        } catch (org.omg.CORBA.TRANSIENT e) {
-            log.info("org.omg.CORBA.TRANSIENT exception thrown.");
-            /*
-            * If cannot connect to the corba server
-            * try again after clearing the cache
-            * (eg. if the Corba server is restarted)
-            */
-            invokerCache.clear();
-            invoke(inMessage, outMessage);
-        }
-    }
-
-    private void invoke(MessageContext inMessage, MessageContext outMessage) throws AxisFault {
-        String methodName = null;
-        try {
-            AxisOperation op = inMessage.getOperationContext().getAxisOperation();
-            AxisService service = inMessage.getAxisService();
-            OMElement methodElement = inMessage.getEnvelope().getBody().getFirstElement();
-
-            AxisMessage inAxisMessage = op.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
-            String messageNameSpace = null;
-            QName elementQName;
-            methodName = op.getName().getLocalPart();
-
-            Invoker invoker = (Invoker) invokerCache.get(methodName);
-            if (invoker==null) {
-                if (orb==null) {
-                    Parameter orbParam = service.getParameter(ORB_LITERAL);
-                    orb = orbParam != null ? (ORB) orbParam.getValue() : CorbaUtil.getORB(service);
-                }
-                org.omg.CORBA.Object obj = CorbaUtil.resolveObject(service, orb);
-                Parameter idlParameter = service.getParameter(IDL_LITERAL);
-                if (idlParameter==null)
-                    throw new CorbaInvocationException("IDL not found");
-                IDL idl = (IDL) idlParameter.getValue();
-                invoker = CorbaUtil.getInvoker(service, obj, idl, methodName);
-                invokerCache.put(methodName, invoker);
-            }
-
-            Object resObject = null;
-            Member[] params = null;
-            Object[] outParamValues = null;
-            if (inAxisMessage != null) {
-                if (inAxisMessage.getElementQName()!=null) {
-                    elementQName = inAxisMessage.getElementQName();
-                    messageNameSpace = elementQName.getNamespaceURI();
-                    OMNamespace namespace = methodElement.getNamespace();
-                    if (messageNameSpace != null) {
-                        if (namespace == null || !messageNameSpace.equals(namespace.getNamespaceURI())) {
-                            throw new AxisFault("namespace mismatch require " +
-                                    messageNameSpace +
-                                    " found " + methodElement.getNamespace().getNamespaceURI());
-                        }
-                    } else if (namespace != null) {
-                        throw new AxisFault("namespace mismatch. Axis Oepration expects non-namespace " +
-                                "qualified element. But received a namespace qualified element");
-                    }
-
-                    SchemaToIDLMapping mapping = (SchemaToIDLMapping) service.getParameterValue(SCHEMA_TO_IDL_MAPPING_LITERAL);
-                    Object[] objectArray = CorbaUtil.extractParameters(methodElement, invoker.getParameterMembers(), mapping);
-                    invoker.setParameters(objectArray);
-                    params = invoker.getParameterMembers();
-                    outParamValues = invoker.getOutParameterValuess();
-                }
-                resObject = invoker.invoke();
-            }
-            SOAPFactory fac = getSOAPFactory(inMessage);
-
-            AxisMessage outaxisMessage = op.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
-            if (messageNameSpace == null) {
-                QName qname = outaxisMessage.getElementQName();
-                if (qname != null) {
-                    messageNameSpace = qname.getNamespaceURI();
-                }
-            }
-            // Handling the response
-            CorbaUtil.processResponse(resObject, params, outParamValues, invoker.getReturnType(), service, methodName, fac,
-                    messageNameSpace, outMessage);
-        } catch (CorbaInvocationException e) {
-            String msg;
-            Throwable cause = e.getCause();
-            if (cause != null) {
-                msg = cause.getMessage();
-                if (msg == null) {
-                    msg = "Exception occurred while trying to invoke service method " + methodName;
-                }
-                //log.error(msg, e);
-                if (cause instanceof AxisFault) {
-                    throw (AxisFault) cause;
-                }
-            } else {
-                msg = e.getMessage();
-            }
-            throw new AxisFault(msg);
-        }
-    }
-}
diff --git a/modules/integration/test/org/apache/axis2/async/AsyncMessageReceiver.java b/modules/integration/test/org/apache/axis2/async/AsyncMessageReceiver.java
index 3748d90..ea551c6 100644
--- a/modules/integration/test/org/apache/axis2/async/AsyncMessageReceiver.java
+++ b/modules/integration/test/org/apache/axis2/async/AsyncMessageReceiver.java
@@ -27,11 +27,11 @@
 import org.apache.axis2.description.AxisOperation;
 import org.apache.axis2.description.AxisService;
 import org.apache.axis2.i18n.Messages;
-import org.apache.axis2.receivers.AbstractInOutAsyncMessageReceiver;
+import org.apache.axis2.receivers.AbstractInOutMessageReceiver;
 
 import java.lang.reflect.Method;
 
-public class AsyncMessageReceiver extends AbstractInOutAsyncMessageReceiver {
+public class AsyncMessageReceiver extends AbstractInOutMessageReceiver {
 
     public void invokeBusinessLogic(MessageContext msgContext,
                                     MessageContext newmsgContext) throws AxisFault {
@@ -40,13 +40,13 @@
             Object obj = getTheImplementationObject(msgContext);
 
             // find the WebService method
-            Class ImplClass = obj.getClass();
+            Class<?> ImplClass = obj.getClass();
 
             AxisOperation opDesc = msgContext.getOperationContext().getAxisOperation();
             Method method = findOperation(opDesc, ImplClass);
 
             if (method != null) {
-                Class[]  parameters = method.getParameterTypes();
+                Class<?>[]  parameters = method.getParameterTypes();
                 Object[] args;
 
                 if ((parameters == null) || (parameters.length == 0)) {
@@ -84,7 +84,7 @@
         }
     }
 
-    public Method findOperation(AxisOperation op, Class ImplClass) {
+    public Method findOperation(AxisOperation op, Class<?> ImplClass) {
         Method method = null;
         String methodName = op.getName().getLocalPart();
         Method[] methods = ImplClass.getMethods();
diff --git a/modules/integration/test/org/apache/axis2/engine/EngineWithoutPhaseResolvingTest.java b/modules/integration/test/org/apache/axis2/engine/EngineWithoutPhaseResolvingTest.java
index c21092e..4bed0ae 100644
--- a/modules/integration/test/org/apache/axis2/engine/EngineWithoutPhaseResolvingTest.java
+++ b/modules/integration/test/org/apache/axis2/engine/EngineWithoutPhaseResolvingTest.java
@@ -22,7 +22,7 @@
 import org.apache.axiom.om.OMAbstractFactory;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axis2.AxisFault;
-import org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver;
+import org.apache.axis2.receivers.AbstractInOutMessageReceiver;
 import org.apache.axis2.addressing.EndpointReference;
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.context.MessageContext;
@@ -104,7 +104,7 @@
         AxisEngine.receive(mc);
     }
 
-    public class NullMessageReceiver extends AbstractInOutSyncMessageReceiver {
+    public class NullMessageReceiver extends AbstractInOutMessageReceiver {
 
         public void invokeBusinessLogic(MessageContext inMessage,
                                         MessageContext outMessage)
diff --git a/modules/integration/test/org/apache/axis2/engine/MessageWithServerTest.java b/modules/integration/test/org/apache/axis2/engine/MessageWithServerTest.java
index 6456e5f..9ddc657 100644
--- a/modules/integration/test/org/apache/axis2/engine/MessageWithServerTest.java
+++ b/modules/integration/test/org/apache/axis2/engine/MessageWithServerTest.java
@@ -23,6 +23,9 @@
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.description.AxisModule;
 import org.apache.axis2.description.AxisOperation;
 import org.apache.axis2.description.AxisService;
@@ -32,6 +35,7 @@
 import org.apache.axis2.dispatchers.RequestURIBasedDispatcher;
 import org.apache.axis2.dispatchers.SOAPActionBasedDispatcher;
 import org.apache.axis2.dispatchers.SOAPMessageBodyBasedDispatcher;
+import org.apache.axis2.handlers.AbstractHandler;
 import org.apache.axis2.integration.UtilServer;
 import org.apache.axis2.integration.UtilServerBasedTestCase;
 import org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver;
@@ -156,4 +160,12 @@
         rReader.close();
         socket.close();
     }
+    
+    class InstanceDispatcher extends AbstractHandler {
+        
+        public InvocationResponse invoke(MessageContext msgContext) throws AxisFault {
+            return InvocationResponse.CONTINUE;
+        }
+    }
+
 }
diff --git a/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java b/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
index c16c04e..fe6eaec 100644
--- a/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
+++ b/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
@@ -20,7 +20,6 @@
 
 package org.apache.axis2.deployment;
 
-import org.apache.axiom.om.OMElement;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
 import org.apache.axis2.classloader.JarFileClassLoader;
@@ -28,8 +27,6 @@
 import org.apache.axis2.deployment.repository.util.ArchiveReader;
 import org.apache.axis2.deployment.repository.util.DeploymentFileData;
 import org.apache.axis2.deployment.repository.util.WSInfo;
-import org.apache.axis2.deployment.resolver.AARBasedWSDLLocator;
-import org.apache.axis2.deployment.resolver.AARFileBasedURIResolver;
 import org.apache.axis2.deployment.scheduler.DeploymentIterator;
 import org.apache.axis2.deployment.scheduler.Scheduler;
 import org.apache.axis2.deployment.scheduler.SchedulerTask;
@@ -40,10 +37,7 @@
 import org.apache.axis2.description.AxisServiceGroup;
 import org.apache.axis2.description.Flow;
 import org.apache.axis2.description.Parameter;
-import org.apache.axis2.description.WSDL11ToAxisServiceBuilder;
-import org.apache.axis2.description.WSDL2Constants;
 import org.apache.axis2.engine.AxisConfiguration;
-import org.apache.axis2.engine.MessageReceiver;
 import org.apache.axis2.i18n.Messages;
 import org.apache.axis2.util.FaultyServiceData;
 import org.apache.axis2.util.JavaUtils;
@@ -105,12 +99,12 @@
     /**
      * Stores all the web Services to deploy.
      */
-    protected List wsToDeploy = new ArrayList();
+    protected List<DeploymentFileData> wsToDeploy = new ArrayList<DeploymentFileData>();
 
     /**
      * Stores all the web Services to undeploy.
      */
-    protected List wsToUnDeploy = new ArrayList();
+    protected List<WSInfo> wsToUnDeploy = new ArrayList<WSInfo>();
 
     /**
      * to keep a ref to engine register
@@ -205,7 +199,7 @@
 
                 URL servicesDir = new URL(repoURL, directory);
                 URL filelisturl = new URL(servicesDir, listName);
-                ArrayList files = getFileList(filelisturl);
+                List<String> files = getFileList(filelisturl);
                 for (Object file : files) {
                     String fileName = (String) file;
                     String extension = getExtension(fileName);
@@ -216,7 +210,7 @@
                     URL servicesURL = new URL(servicesDir, fileName);
 
                     // We are calling reflection code here , to avoid changes to the interface
-                    Class classToLoad = deployer.getClass();
+                    Class<?> classToLoad = deployer.getClass();
                     // We can not call classToLoad.getDeclaredMethed() , since there
                     //  can be insatnce where mutiple services extends using one class
                     // just for init and other reflection methods
@@ -264,38 +258,27 @@
             }
             URL servicesDir = new URL(repoURL, path);
             URL filelisturl = new URL(servicesDir, "services.list");
-            ArrayList files = getFileList(filelisturl);
-
+            ArrayList<String> files = getFileList(filelisturl);
+            repoListener = new RepositoryListener(this, false);
             for (Object file : files) {
                 String fileUrl = (String) file;
                 if (fileUrl.endsWith(".aar")) {
-                    AxisServiceGroup serviceGroup = new AxisServiceGroup();
                     URL servicesURL = new URL(servicesDir, fileUrl);
-                    ArrayList servicelist =
-                            populateService(serviceGroup,
-                                    servicesURL,
-                                    fileUrl.substring(0, fileUrl.indexOf(".aar")));
-                    addServiceGroup(serviceGroup, servicelist, servicesURL, null, axisConfig);
-                    // let the system have hidden services
-                    if (!JavaUtils.isTrueExplicitly(serviceGroup.getParameterValue(
-                            Constants.HIDDEN_SERVICE_PARAM_NAME))) {
-                        log.info(Messages.getMessage(DeploymentErrorMsgs.DEPLOYING_WS,
-                                serviceGroup.getServiceGroupName(),
-                                servicesURL.toString()));
-                    }
+                    repoListener.addURLToDeploy(servicesURL, getServiceDeployer(),
+                            WSInfo.TYPE_SERVICE);
                 }
             }
+            repoListener.update();
             //Loading other type of services such as custom deployers
             loadCustomServices(repoURL);
         } catch (MalformedURLException e) {
             log.error(e.getMessage(), e);
-        } catch (IOException e) {
-            log.error(e.getMessage(), e);
-        }
+        } 
     }
 
     public void loadRepositoryFromURL(URL repoURL) throws DeploymentException {
         try {
+            setDeploymentFeatures();
             String path = modulesPath == null ? DeploymentConstants.MODULE_PATH : modulesPath;
             if (!path.endsWith("/")) {
                 path = path + "/";
@@ -307,34 +290,19 @@
             }
             URL moduleDir = new URL(repoURL, path);
             URL filelisturl = new URL(moduleDir, "modules.list");
-            ArrayList files = getFileList(filelisturl);
-            Iterator fileIterator = files.iterator();
+            Iterator<String> fileIterator = getFileList(filelisturl).iterator();
+            axisConfig.setRepository(repoURL);
+            repoListener = new RepositoryListener(this, false);
             while (fileIterator.hasNext()) {
                 String fileUrl = (String) fileIterator.next();
                 if (fileUrl.endsWith(".mar")) {
                     URL moduleurl = new URL(moduleDir, fileUrl);
-                    ClassLoader deploymentClassLoader =
-                            Utils.createClassLoader(
-                                    new URL[]{moduleurl},
-                                    axisConfig.getModuleClassLoader(),
-                                    true,
-                                    (File) axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
-                                    axisConfig.isChildFirstClassLoading());
-                    AxisModule module = new AxisModule();
-                    module.setModuleClassLoader(deploymentClassLoader);
-                    module.setParent(axisConfig);
-                    String moduleFile = fileUrl.substring(0, fileUrl.indexOf(".mar"));
-                    module.setArchiveName(moduleFile);
-                    populateModule(module, moduleurl);
-                    module.setFileName(moduleurl);
-                    addNewModule(module, axisConfig);
-                    log.info(Messages.getMessage(DeploymentErrorMsgs.DEPLOYING_MODULE,
-                            module.getArchiveName(),
-                            moduleurl.toString()));
+                    repoListener.addURLToDeploy(moduleurl, getModuleDeployer(), WSInfo.TYPE_MODULE);
                 }
             }
-            org.apache.axis2.util.Utils.
-                    calculateDefaultModuleVersion(axisConfig.getModules(), axisConfig);
+            repoListener.update();
+            org.apache.axis2.util.Utils.calculateDefaultModuleVersion(axisConfig.getModules(),
+                    axisConfig);
             axisConfig.validateSystemPredefinedPhases();
         } catch (MalformedURLException e) {
             throw new DeploymentException(e);
@@ -343,202 +311,6 @@
         }
     }
 
-    private void populateModule(AxisModule module, URL moduleUrl) throws DeploymentException {
-        try {
-            ClassLoader classLoader = module.getModuleClassLoader();
-            InputStream moduleStream = classLoader.getResourceAsStream("META-INF/module.xml");
-            if (moduleStream == null) {
-                moduleStream = classLoader.getResourceAsStream("meta-inf/module.xml");
-            }
-            if (moduleStream == null) {
-                throw new DeploymentException(
-                        Messages.getMessage(
-                                DeploymentErrorMsgs.MODULE_XML_MISSING, moduleUrl.toString()));
-            }
-            ModuleBuilder moduleBuilder = new ModuleBuilder(moduleStream, module, axisConfig);
-            moduleBuilder.populateModule();
-        } catch (IOException e) {
-            throw new DeploymentException(e);
-        }
-    }
-
-    protected ArrayList populateService(AxisServiceGroup serviceGroup,
-                                        URL servicesURL,
-                                        String serviceName) throws DeploymentException {
-        try {
-            serviceGroup.setServiceGroupName(serviceName);
-            ClassLoader serviceClassLoader = Utils.createClassLoader(
-                    new URL[]{servicesURL},
-                    axisConfig.getServiceClassLoader(),
-                    true,
-                    (File) axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
-                    axisConfig.isChildFirstClassLoading());
-            String metainf = "meta-inf";
-            serviceGroup.setServiceGroupClassLoader(serviceClassLoader);
-            //processing wsdl.list
-            InputStream wsdlfilesStream =
-                    serviceClassLoader.getResourceAsStream("meta-inf/wsdl.list");
-            if (wsdlfilesStream == null) {
-                wsdlfilesStream = serviceClassLoader.getResourceAsStream("META-INF/wsdl.list");
-                if (wsdlfilesStream != null) {
-                    metainf = "META-INF";
-                }
-            }
-            HashMap servicesMap = new HashMap();
-            if (wsdlfilesStream != null) {
-                ArchiveReader reader = new ArchiveReader();
-                BufferedReader input = new BufferedReader(new InputStreamReader(wsdlfilesStream));
-                String line;
-                while ((line = input.readLine()) != null) {
-                    line = line.trim();
-                    if (line.length() > 0 && line.charAt(0) != '#') {
-                        line = metainf + "/" + line;
-                        try {
-                            List services = reader.getAxisServiceFromWsdl(
-                                    serviceClassLoader.getResourceAsStream(line),
-                                    serviceClassLoader, line);
-                            if (services != null) {
-                                for (Object service : services) {
-                                    AxisService axisService = (AxisService) service;
-                                    servicesMap.put(axisService.getName(), axisService);
-                                }
-                            }
-
-                        } catch (Exception e) {
-                            throw new DeploymentException(e);
-                        }
-                    }
-                }
-            }
-            InputStream servicexmlStream =
-                    serviceClassLoader.getResourceAsStream("META-INF/services.xml");
-            if (servicexmlStream == null) {
-                servicexmlStream = serviceClassLoader.getResourceAsStream("meta-inf/services.xml");
-            } else {
-                metainf = "META-INF";
-            }
-            if (servicexmlStream == null) {
-                throw new DeploymentException(
-                        Messages.getMessage(DeploymentErrorMsgs.SERVICE_XML_NOT_FOUND,
-                                servicesURL.toString()));
-            }
-            DescriptionBuilder builder = new DescriptionBuilder(servicexmlStream, configContext);
-            OMElement rootElement = builder.buildOM();
-            String elementName = rootElement.getLocalName();
-
-            if (TAG_SERVICE.equals(elementName)) {
-                AxisService axisService = null;
-                String wsdlLocation = "META-INF/service.wsdl";
-                InputStream wsdlStream =
-                        serviceClassLoader.getResourceAsStream(wsdlLocation);
-                URL wsdlURL = serviceClassLoader.getResource(metainf + "/service.wsdl");
-                if (wsdlStream == null) {
-                    wsdlLocation = "META-INF/" + serviceName + ".wsdl";
-                    wsdlStream = serviceClassLoader
-                            .getResourceAsStream(wsdlLocation);
-                    wsdlURL = serviceClassLoader.getResource(wsdlLocation);
-                }
-                if (wsdlStream != null) {
-                    WSDL11ToAxisServiceBuilder wsdl2AxisServiceBuilder =
-                            new WSDL11ToAxisServiceBuilder(wsdlStream, null, null);
-                    File file = Utils.toFile(servicesURL);
-                    if (file != null && file.exists()) {
-                        wsdl2AxisServiceBuilder.setCustomWSDLResolver(
-                                new AARBasedWSDLLocator(wsdlLocation, file, wsdlStream));
-                        wsdl2AxisServiceBuilder.setCustomResolver(
-                                new AARFileBasedURIResolver(file));
-                    }
-                    if (wsdlURL != null) {
-                        wsdl2AxisServiceBuilder.setDocumentBaseUri(wsdlURL.toString());
-                    }
-                    axisService = wsdl2AxisServiceBuilder.populateService();
-                    axisService.setWsdlFound(true);
-                    axisService.setCustomWsdl(true);
-                    axisService.setName(serviceName);
-                }
-                if (axisService == null) {
-                    axisService = new AxisService(serviceName);
-                }
-
-                axisService.setParent(serviceGroup);
-                axisService.setClassLoader(serviceClassLoader);
-
-                ServiceBuilder serviceBuilder = new ServiceBuilder(configContext, axisService);
-                AxisService service = serviceBuilder.populateService(rootElement);
-
-                ArrayList serviceList = new ArrayList();
-                serviceList.add(service);
-                return serviceList;
-            } else if (TAG_SERVICE_GROUP.equals(elementName)) {
-                ServiceGroupBuilder groupBuilder = new ServiceGroupBuilder(rootElement, servicesMap,
-                        configContext);
-                ArrayList servicList = groupBuilder.populateServiceGroup(serviceGroup);
-                Iterator serviceIterator = servicList.iterator();
-                while (serviceIterator.hasNext()) {
-                    AxisService axisService = (AxisService) serviceIterator.next();
-                    String wsdlLocation = "META-INF/service.wsdl";
-                    InputStream wsdlStream =
-                            serviceClassLoader.getResourceAsStream(wsdlLocation);
-                    URL wsdlURL = serviceClassLoader.getResource(wsdlLocation);
-                    if (wsdlStream == null) {
-                        wsdlLocation = "META-INF/" + serviceName + ".wsdl";
-                        wsdlStream = serviceClassLoader
-                                .getResourceAsStream(wsdlLocation);
-                        wsdlURL =
-                                serviceClassLoader.getResource(wsdlLocation);
-                    }
-                    if (wsdlStream != null) {
-                        WSDL11ToAxisServiceBuilder wsdl2AxisServiceBuilder =
-                                new WSDL11ToAxisServiceBuilder(wsdlStream, axisService);
-                        File file = Utils.toFile(servicesURL);
-                        if (file != null && file.exists()) {
-                            wsdl2AxisServiceBuilder.setCustomWSDLResolver(
-                                    new AARBasedWSDLLocator(wsdlLocation, file, wsdlStream));
-                            wsdl2AxisServiceBuilder.setCustomResolver(
-                                    new AARFileBasedURIResolver(file));
-                        }
-                        if (wsdlURL != null) {
-                            wsdl2AxisServiceBuilder.setDocumentBaseUri(wsdlURL.toString());
-                        }
-                        axisService = wsdl2AxisServiceBuilder.populateService();
-                        axisService.setWsdlFound(true);
-                        axisService.setCustomWsdl(true);
-                        // Set the default message receiver for the operations that were
-                        // not listed in the services.xml
-                        Iterator operations = axisService.getOperations();
-                        while (operations.hasNext()) {
-                            AxisOperation operation = (AxisOperation) operations.next();
-                            if (operation.getMessageReceiver() == null) {
-                                operation.setMessageReceiver(loadDefaultMessageReceiver(
-                                        operation.getMessageExchangePattern(), axisService));
-                            }
-                        }
-                    }
-                }
-                return servicList;
-            }
-        } catch (IOException e) {
-            throw new DeploymentException(e);
-        } catch (XMLStreamException e) {
-            throw new DeploymentException(e);
-        }
-        return null;
-    }
-
-    protected MessageReceiver loadDefaultMessageReceiver(String mepURL, AxisService service) {
-        MessageReceiver messageReceiver;
-        if (mepURL == null) {
-            mepURL = WSDL2Constants.MEP_URI_IN_OUT;
-        }
-        if (service != null) {
-            messageReceiver = service.getMessageReceiver(mepURL);
-            if (messageReceiver != null) {
-                return messageReceiver;
-            }
-        }
-        return axisConfig.getMessageReceiver(mepURL);
-    }
-
     public static void addNewModule(AxisModule modulemetadata,
                                     AxisConfiguration axisConfiguration) throws AxisFault {
 
@@ -597,7 +369,7 @@
     }
 
     public static void addServiceGroup(AxisServiceGroup serviceGroup,
-                                       ArrayList serviceList,
+                                       ArrayList<AxisService> serviceList,
                                        URL serviceLocation,
                                        DeploymentFileData currentDeploymentFile,
                                        AxisConfiguration axisConfiguration) throws AxisFault {
@@ -642,14 +414,14 @@
      * @throws AxisFault
      */
     protected static boolean isServiceGroupReadyToDeploy(AxisServiceGroup serviceGroup,
-                                                         ArrayList serviceList,
+                                                         ArrayList<AxisService> serviceList,
                                                          URL serviceLocation,
                                                          DeploymentFileData currentDeploymentFile,
                                                          AxisConfiguration axisConfig)
             throws AxisFault {
         synchronized (axisConfig.getFaultyServicesDuetoModules()) {
             String moduleName;
-            ArrayList groupModules = serviceGroup.getModuleRefs();
+            ArrayList<String> groupModules = serviceGroup.getModuleRefs();
             for (Object groupModule : groupModules) {
                 moduleName = (String) groupModule;
                 AxisModule module = axisConfig.getModule(moduleName);
@@ -672,7 +444,7 @@
                 AxisService axisService = (AxisService) aServiceList;
 
                 // modules from <service>
-                ArrayList list = axisService.getModules();
+                ArrayList<String> list = axisService.getModules();
 
                 for (Object aList : list) {
                     moduleName = (String) aList;
@@ -692,9 +464,9 @@
                     }
                 }
 
-                for (Iterator iterator = axisService.getOperations(); iterator.hasNext();) {
+                for (Iterator<AxisOperation> iterator = axisService.getOperations(); iterator.hasNext();) {
                     AxisOperation opDesc = (AxisOperation) iterator.next();
-                    ArrayList modules = opDesc.getModuleRefs();
+                    ArrayList<String> modules = opDesc.getModuleRefs();
 
                     for (Object module1 : modules) {
                         moduleName = (String) module1;
@@ -721,12 +493,12 @@
     }
 
     protected static void fillServiceGroup(AxisServiceGroup serviceGroup,
-                                           ArrayList serviceList,
+                                           ArrayList<AxisService> serviceList,
                                            URL serviceLocation,
                                            AxisConfiguration axisConfig) throws AxisFault {
 //        serviceGroup.setParent(axisConfig);
         // module from services.xml at serviceGroup level
-        ArrayList groupModules = serviceGroup.getModuleRefs();
+        ArrayList<String> groupModules = serviceGroup.getModuleRefs();
         serviceGroup.setParent(axisConfig);
         for (Object groupModule : groupModules) {
             String moduleName = (String) groupModule;
@@ -742,7 +514,7 @@
             }
         }
 
-        Iterator services = serviceList.iterator();
+        Iterator<AxisService> services = serviceList.iterator();
 
         while (services.hasNext()) {
             AxisService axisService = (AxisService) services.next();
@@ -752,7 +524,7 @@
             serviceGroup.addService(axisService);
 
             // modules from <service>
-            ArrayList list = axisService.getModules();
+            ArrayList<String> list = axisService.getModules();
 
             for (Object aList : list) {
                 AxisModule module = axisConfig.getModule((String) aList);
@@ -768,9 +540,9 @@
                 axisService.engageModule(module);
             }
 
-            for (Iterator iterator = axisService.getOperations(); iterator.hasNext();) {
+            for (Iterator<AxisOperation> iterator = axisService.getOperations(); iterator.hasNext();) {
                 AxisOperation opDesc = (AxisOperation) iterator.next();
-                ArrayList modules = opDesc.getModuleRefs();
+                ArrayList<String> modules = opDesc.getModuleRefs();
 
                 for (Object module1 : modules) {
                     String moduleName = (String) module1;
@@ -1118,8 +890,8 @@
         }
     }
 
-    protected ArrayList getFileList(URL fileListUrl) {
-        ArrayList fileList = new ArrayList();
+    protected ArrayList<String> getFileList(URL fileListUrl) {
+        ArrayList<String> fileList = new ArrayList<String>();
         InputStream in;
         try {
             in = fileListUrl.openStream();
@@ -1278,7 +1050,7 @@
                                                      String serviceGroupName,
                                                      ConfigurationContext configCtx,
                                                      ArchiveReader archiveReader,
-                                                     HashMap wsdlServices) throws AxisFault {
+                                                     HashMap<String, AxisService> wsdlServices) throws AxisFault {
         DeploymentFileData currentDeploymentFile = new DeploymentFileData(null, null);
         currentDeploymentFile.setClassLoader(classLoader);
         AxisServiceGroup serviceGroup = new AxisServiceGroup();
@@ -1286,7 +1058,7 @@
         serviceGroup.setServiceGroupName(serviceGroupName);
         AxisConfiguration axisConfig = configCtx.getAxisConfiguration();
         try {
-            ArrayList serviceList = archiveReader.buildServiceGroup(servicesxml,
+            ArrayList<AxisService> serviceList = archiveReader.buildServiceGroup(servicesxml,
                     currentDeploymentFile,
                     serviceGroup,
                     wsdlServices, configCtx);
@@ -1315,9 +1087,9 @@
             AxisConfiguration axisConfig = configCtx.getAxisConfiguration();
 
             ArchiveReader archiveReader = new ArchiveReader();
-            HashMap wsdlServices = archiveReader.processWSDLs(currentDeploymentFile);
+            HashMap<String, AxisService> wsdlServices = archiveReader.processWSDLs(currentDeploymentFile);
             InputStream serviceXml = classLoader.getResourceAsStream("META-INF/services.xml");
-            ArrayList serviceList = archiveReader.buildServiceGroup(serviceXml,
+            ArrayList<AxisService> serviceList = archiveReader.buildServiceGroup(serviceXml,
                     currentDeploymentFile,
                     serviceGroup,
                     wsdlServices, configCtx);
diff --git a/modules/kernel/src/org/apache/axis2/deployment/ModuleDeployer.java b/modules/kernel/src/org/apache/axis2/deployment/ModuleDeployer.java
index 1d44f8b..075a3c0 100644
--- a/modules/kernel/src/org/apache/axis2/deployment/ModuleDeployer.java
+++ b/modules/kernel/src/org/apache/axis2/deployment/ModuleDeployer.java
@@ -24,6 +24,7 @@
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.deployment.repository.util.ArchiveReader;
 import org.apache.axis2.deployment.repository.util.DeploymentFileData;
+import org.apache.axis2.deployment.util.Utils;
 import org.apache.axis2.description.AxisModule;
 import org.apache.axis2.engine.AxisConfiguration;
 import org.apache.axis2.i18n.Messages;
@@ -31,11 +32,56 @@
 import org.apache.commons.logging.LogFactory;
 
 import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.net.MalformedURLException;
 import java.net.URL;
 
+/**
+ * Standard Axis2 Module Deployer which use module.xml file to deploy
+ * Modules. ModuleDeployer can be used with Axis2 Module archive (.mar) or exploded
+ * directory structure. Some of the example formats given below.
+ * 
+ * Examples :
+ * 
+ *          repository/modules/LogModule.mar/meta-inf/module.xml
+ *          repository/modules/LogModule/meta-inf/module.xml
+ *          WEB-INF/modules/LogModule.mar/meta-inf/module.xml
+ *          WEB-INF/modules/LogModule/meta-inf/module.xml
+ * 
+ * Further ServiceDeployer can be used to deploy Modules from a remote
+ * repository or within a JAR file. In this case module files accessed through URLs.
+ * To deploy Modules from a remote repository or JAR file it is expected to
+ * present modules/modules.list file which contains names of Modules.
+ * 
+ * Examples : jar:file:/home/resources/repo.jar!/repo/modules/modules.list may contains following
+ * list of service.
+ * 
+ *          LogModule.mar 
+ *          Addressing.mar
+ * 
+ * There are several approaches available to set repository URL to Axis2 run
+ * time. As an example one can provide repository URL as a init-param of
+ * AxisServlet. Some of the examples given below.
+ * 
+ * Example -1 : 
+ *                 <init-param> 
+ *                      <param-name>axis2.repository.url</param-name>
+ *                      <param-value>http://localhost/repo/</param-value> 
+ *                 </init-param>
+ * 
+ * Example -2 : 
+ *                 <init-param> 
+ *                      <param-name>axis2.repository.url</param-name>
+ *                      <param-value>jar:file:/home/resources/repo.jar!/repo/</param-value> </init-param>
+ * 
+ * NOTE - It is discouraged to use above modules.list based deployment approach
+ * because it does not support some of the important deployment features of Axis2 runtime. 
+ * 
+ */
+
 public class ModuleDeployer extends AbstractDeployer {
 
     private static final Log log = LogFactory.getLog(ModuleDeployer.class);
@@ -57,6 +103,11 @@
 
     public void deploy(DeploymentFileData deploymentFileData) {
         File deploymentFile = deploymentFileData.getFile();
+        // deploymentFile == null indicate this can be a URL, try to deploy using a URL.
+        if(deploymentFile == null){
+            deoloyFromUrl(deploymentFileData);
+            return;
+        }
         boolean isDirectory = deploymentFile.isDirectory();
         if (isDirectory && deploymentFileData.getName().startsWith(".")) {  // Ignore special meta directories starting with .
             return;
@@ -124,6 +175,71 @@
             }
         }
     }
+    
+    public void deoloyFromUrl(DeploymentFileData deploymentFileData) {
+        URL fileUrl = deploymentFileData.getUrl();
+        StringWriter errorWriter = new StringWriter();
+        String moduleStatus = "";
+        if (fileUrl == null) {
+            return;
+        }
+
+        try {
+            ClassLoader deploymentClassLoader = Utils.createClassLoader(new URL[] { fileUrl },
+                    axisConfig.getModuleClassLoader(), true,
+                    (File) axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
+                    axisConfig.isChildFirstClassLoading());
+            AxisModule module = new AxisModule();
+            module.setModuleClassLoader(deploymentClassLoader);
+            module.setParent(axisConfig);
+            int index = fileUrl.getPath().lastIndexOf(File.separator);
+            String moduleFile;
+            if(index > 0){
+                moduleFile = fileUrl.getPath().substring(index);                
+            } else {
+                moduleFile = fileUrl.getPath();                
+            }            
+            module.setArchiveName(moduleFile);
+            populateModule(module, fileUrl);
+            module.setFileName(fileUrl);
+            DeploymentEngine.addNewModule(module, axisConfig);
+            log.info(Messages.getMessage(DeploymentErrorMsgs.DEPLOYING_MODULE, module.getArchiveName(),
+                    fileUrl.toString()));
+
+        } catch (DeploymentException e) {
+            log.error(
+                    Messages.getMessage(DeploymentErrorMsgs.INVALID_MODULE,
+                            deploymentFileData.getName(), e.getMessage()), e);
+            PrintWriter error_ptintWriter = new PrintWriter(errorWriter);
+            e.printStackTrace(error_ptintWriter);
+            moduleStatus = "Error:\n" + errorWriter.toString();
+        } catch (AxisFault axisFault) {
+            log.error(
+                    Messages.getMessage(DeploymentErrorMsgs.INVALID_MODULE,
+                            deploymentFileData.getName(), axisFault.getMessage()), axisFault);
+            PrintWriter error_ptintWriter = new PrintWriter(errorWriter);
+            axisFault.printStackTrace(error_ptintWriter);
+            moduleStatus = "Error:\n" + errorWriter.toString();
+        } catch (Throwable t) {
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            t.printStackTrace(pw);
+            log.error(
+                    Messages.getMessage(DeploymentErrorMsgs.INVALID_MODULE,
+                            deploymentFileData.getName(), t.getMessage()), t);
+            PrintWriter error_ptintWriter = new PrintWriter(errorWriter);
+            t.printStackTrace(error_ptintWriter);
+            moduleStatus = "Error:\n" + errorWriter.toString();
+        } finally {
+            if (moduleStatus.startsWith("Error:")) {
+                axisConfig.getFaultyModules().put(
+                        DeploymentEngine.getAxisServiceName(deploymentFileData.getName()),
+                        moduleStatus);
+            }
+        }
+       
+
+    }
 
     public void setDirectory(String directory) {
     }
@@ -134,4 +250,23 @@
     public void undeploy(String fileName) throws DeploymentException {
         super.undeploy(fileName);
     }
+    
+    private void populateModule(AxisModule module, URL moduleUrl) throws DeploymentException {
+        try {
+            ClassLoader classLoader = module.getModuleClassLoader();
+            InputStream moduleStream = classLoader.getResourceAsStream("META-INF/module.xml");
+            if (moduleStream == null) {
+                moduleStream = classLoader.getResourceAsStream("meta-inf/module.xml");
+            }
+            if (moduleStream == null) {
+                throw new DeploymentException(
+                        Messages.getMessage(
+                                DeploymentErrorMsgs.MODULE_XML_MISSING, moduleUrl.toString()));
+            }
+            ModuleBuilder moduleBuilder = new ModuleBuilder(moduleStream, module, axisConfig);
+            moduleBuilder.populateModule();
+        } catch (IOException e) {
+            throw new DeploymentException(e);
+        }
+    }
 }
diff --git a/modules/kernel/src/org/apache/axis2/deployment/RepositoryListener.java b/modules/kernel/src/org/apache/axis2/deployment/RepositoryListener.java
index 1cd3209..800d99a 100644
--- a/modules/kernel/src/org/apache/axis2/deployment/RepositoryListener.java
+++ b/modules/kernel/src/org/apache/axis2/deployment/RepositoryListener.java
@@ -74,7 +74,10 @@
     /** Finds a list of modules in the folder and adds to wsInfoList. */
     public void checkModules() {
         File root = deploymentEngine.getModulesDir();
-        File[] files = root.listFiles();
+        File[] files = null;
+        if(root != null){
+            files = root.listFiles();
+        }
 
         if (files != null) {
             for (int i = 0; i < files.length; i++) {
@@ -385,4 +388,8 @@
     public void addFileToDeploy(File file, Deployer deployer, int type) {
         wsInfoList.addWSInfoItem(file, deployer, type);
     }
+    
+    public void addURLToDeploy(URL url, Deployer deployer, int type) {
+        wsInfoList.addWSInfoItem(url, deployer, type);
+    }
 }
diff --git a/modules/kernel/src/org/apache/axis2/deployment/ServiceDeployer.java b/modules/kernel/src/org/apache/axis2/deployment/ServiceDeployer.java
index ca4615b..8119929 100644
--- a/modules/kernel/src/org/apache/axis2/deployment/ServiceDeployer.java
+++ b/modules/kernel/src/org/apache/axis2/deployment/ServiceDeployer.java
@@ -19,29 +19,87 @@
 
 package org.apache.axis2.deployment;
 
+import org.apache.axiom.om.OMElement;
+
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.deployment.repository.util.ArchiveReader;
 import org.apache.axis2.deployment.repository.util.DeploymentFileData;
+import org.apache.axis2.deployment.resolver.AARBasedWSDLLocator;
+import org.apache.axis2.deployment.resolver.AARFileBasedURIResolver;
 import org.apache.axis2.deployment.util.Utils;
 import org.apache.axis2.description.AxisOperation;
 import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.AxisServiceGroup;
+import org.apache.axis2.description.WSDL11ToAxisServiceBuilder;
+import org.apache.axis2.description.WSDL2Constants;
 import org.apache.axis2.engine.AxisConfiguration;
+import org.apache.axis2.engine.MessageReceiver;
 import org.apache.axis2.engine.ServiceLifeCycle;
 import org.apache.axis2.i18n.Messages;
+import org.apache.axis2.util.JavaUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 
+import javax.xml.stream.XMLStreamException;
+
+/**
+ * Standard Axis2 service Deployer which use services.xml file to build
+ * services. ServiceDeployer can be used with Axis2 archive (.aar) or exploded
+ * directory structure. Some of the example formats given below.
+ * 
+ * Examples :
+ * 
+ *          repository/services/SimpleService.aar/meta-inf/services.xml
+ *          repository/services/SimpleService/meta-inf/services.xml
+ *          WEB-INF/services/SimpleService.aar/meta-inf/services.xml
+ *          WEB-INF/services/SimpleService/meta-inf/services.xml
+ * 
+ * Further ServiceDeployer can be used to deploy services from a remote
+ * repository or within a JAR file. In this case service files accessed through URLs.
+ * To deploy services from a remote repository or JAR file it is expected to
+ * present service/services.list file which contains names of services.
+ * 
+ * Examples : jar:file:/home/resources/repo.jar!/repo/services/services.list may contains following
+ * list of service.
+ * 
+ *          StudentService.aar 
+ *          SimpleService.aar
+ * 
+ * There are several approaches available to set repository URL to Axis2 run
+ * time. As an example one can provide repository URL as a init-param of
+ * AxisServlet. Some of the examples given below.
+ * 
+ * Example -1 : 
+ *                 <init-param> 
+ *                      <param-name>axis2.repository.url</param-name>
+ *                      <param-value>http://localhost/repo/</param-value> 
+ *                 </init-param>
+ * 
+ * Example -2 : 
+ *                 <init-param> 
+ *                      <param-name>axis2.repository.url</param-name>
+ *                      <param-value>jar:file:/home/resources/repo.jar!/repo/</param-value> </init-param>
+ * 
+ * NOTE - It is discouraged to use above services.list based deployment approach
+ * because it does not support hot-deployment, hot-update and some of other
+ * important deployment features as well. 
+ * 
+ */
 public class ServiceDeployer extends AbstractDeployer {
     private static final Log log = LogFactory.getLog(ServiceDeployer.class);
     private AxisConfiguration axisConfig;
@@ -57,7 +115,13 @@
     //Will process the file and add that to axisConfig
 
     public void deploy(DeploymentFileData deploymentFileData) throws DeploymentException {
-        boolean isDirectory = deploymentFileData.getFile().isDirectory();
+        File deploymentFile = deploymentFileData.getFile();
+        if(deploymentFile == null){
+            //This can be a URL
+            deployFromUrl(deploymentFileData);
+            return;
+        }
+        boolean isDirectory = deploymentFile.isDirectory();
         ArchiveReader archiveReader;
         StringWriter errorWriter = new StringWriter();
         archiveReader = new ArchiveReader();
@@ -166,6 +230,231 @@
             }
         }
     }
+    
+    public void deployFromUrl(DeploymentFileData deploymentFileData) throws DeploymentException {
+        URL servicesURL = deploymentFileData.getUrl();
+        if (servicesURL == null) {
+            return;
+        }
+        AxisServiceGroup serviceGroup = new AxisServiceGroup();
+        StringWriter errorWriter = new StringWriter();
+        int index = servicesURL.getPath().lastIndexOf(File.separator);
+         String serviceFile;
+         if(index > 0){
+             serviceFile = servicesURL.getPath().substring(index);
+         } else {
+             serviceFile = servicesURL.getPath();
+         }
+         ArrayList<AxisService> servicelist =
+         populateService(serviceGroup,
+         servicesURL,
+         serviceFile.substring(0, serviceFile.indexOf(".aar")));
+         try {
+            DeploymentEngine.addServiceGroup(serviceGroup, servicelist, servicesURL, null,
+             axisConfig);
+            // let the system have hidden services
+            if (!JavaUtils.isTrueExplicitly(serviceGroup.getParameterValue(
+                    Constants.HIDDEN_SERVICE_PARAM_NAME))) {
+                    log.info(Messages.getMessage(DeploymentErrorMsgs.DEPLOYING_WS,
+                    serviceGroup.getServiceGroupName(),
+                    servicesURL.toString()));
+            }
+        } catch (AxisFault axisFault) {
+            log.error(
+                    Messages.getMessage(DeploymentErrorMsgs.INVALID_SERVICE,
+                            deploymentFileData.getName(), axisFault.getMessage()), axisFault);
+            PrintWriter error_ptintWriter = new PrintWriter(errorWriter);
+            axisFault.printStackTrace(error_ptintWriter);
+            throw new DeploymentException(axisFault);
+        }
+    
+
+    }
+    
+    /*
+     * TODO - This need to be implemented to support
+     * DeploymentEngine#loadCustomServices method.
+     */
+    public void deployFromUrl(Deployer deployer, URL servicesURL) throws DeploymentException {
+        throw new DeploymentException(
+                "Not support for this operation - deployFromUrl(Deployer deployer, URL servicesURL)");
+    }
+    
+
+   
+    /*
+     * TODO - This method is used by deployFromUrl() method and this should be
+     * refactored to reduce code complexity.
+     */
+    protected ArrayList<AxisService> populateService(AxisServiceGroup serviceGroup,
+            URL servicesURL, String serviceName) throws DeploymentException {
+        try {
+            serviceGroup.setServiceGroupName(serviceName);
+            ClassLoader serviceClassLoader = Utils
+                    .createClassLoader(new URL[] { servicesURL }, axisConfig
+                            .getServiceClassLoader(), true, (File) axisConfig
+                            .getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
+                            axisConfig.isChildFirstClassLoading());
+            String metainf = "meta-inf";
+            serviceGroup.setServiceGroupClassLoader(serviceClassLoader);
+            // processing wsdl.list
+            InputStream wsdlfilesStream = serviceClassLoader
+                    .getResourceAsStream("meta-inf/wsdl.list");
+            if (wsdlfilesStream == null) {
+                wsdlfilesStream = serviceClassLoader.getResourceAsStream("META-INF/wsdl.list");
+                if (wsdlfilesStream != null) {
+                    metainf = "META-INF";
+                }
+            }
+            HashMap<String, AxisService> servicesMap = new HashMap<String, AxisService>();
+            if (wsdlfilesStream != null) {
+                ArchiveReader reader = new ArchiveReader();
+                BufferedReader input = new BufferedReader(new InputStreamReader(wsdlfilesStream));
+                String line;
+                while ((line = input.readLine()) != null) {
+                    line = line.trim();
+                    if (line.length() > 0 && line.charAt(0) != '#') {
+                        line = metainf + "/" + line;
+                        try {
+                            List<AxisService> services = reader.getAxisServiceFromWsdl(
+                                    serviceClassLoader.getResourceAsStream(line),
+                                    serviceClassLoader, line);
+                            if (services != null) {
+                                for (Object service : services) {
+                                    AxisService axisService = (AxisService) service;
+                                    servicesMap.put(axisService.getName(), axisService);
+                                }
+                            }
+
+                        } catch (Exception e) {
+                            throw new DeploymentException(e);
+                        }
+                    }
+                }
+            }
+            InputStream servicexmlStream = serviceClassLoader
+                    .getResourceAsStream("META-INF/services.xml");
+            if (servicexmlStream == null) {
+                servicexmlStream = serviceClassLoader.getResourceAsStream("meta-inf/services.xml");
+            } else {
+                metainf = "META-INF";
+            }
+            if (servicexmlStream == null) {
+                throw new DeploymentException(Messages.getMessage(
+                        DeploymentErrorMsgs.SERVICE_XML_NOT_FOUND, servicesURL.toString()));
+            }
+            DescriptionBuilder builder = new DescriptionBuilder(servicexmlStream, configCtx);
+            OMElement rootElement = builder.buildOM();
+            String elementName = rootElement.getLocalName();
+
+            if (DeploymentConstants.TAG_SERVICE.equals(elementName)) {
+                AxisService axisService = null;
+                String wsdlLocation = "META-INF/service.wsdl";
+                InputStream wsdlStream = serviceClassLoader.getResourceAsStream(wsdlLocation);
+                URL wsdlURL = serviceClassLoader.getResource(metainf + "/service.wsdl");
+                if (wsdlStream == null) {
+                    wsdlLocation = "META-INF/" + serviceName + ".wsdl";
+                    wsdlStream = serviceClassLoader.getResourceAsStream(wsdlLocation);
+                    wsdlURL = serviceClassLoader.getResource(wsdlLocation);
+                }
+                if (wsdlStream != null) {
+                    WSDL11ToAxisServiceBuilder wsdl2AxisServiceBuilder = new WSDL11ToAxisServiceBuilder(
+                            wsdlStream, null, null);
+                    File file = Utils.toFile(servicesURL);
+                    if (file != null && file.exists()) {
+                        wsdl2AxisServiceBuilder.setCustomWSDLResolver(new AARBasedWSDLLocator(
+                                wsdlLocation, file, wsdlStream));
+                        wsdl2AxisServiceBuilder
+                                .setCustomResolver(new AARFileBasedURIResolver(file));
+                    }
+                    if (wsdlURL != null) {
+                        wsdl2AxisServiceBuilder.setDocumentBaseUri(wsdlURL.toString());
+                    }
+                    axisService = wsdl2AxisServiceBuilder.populateService();
+                    axisService.setWsdlFound(true);
+                    axisService.setCustomWsdl(true);
+                    axisService.setName(serviceName);
+                }
+                if (axisService == null) {
+                    axisService = new AxisService(serviceName);
+                }
+
+                axisService.setParent(serviceGroup);
+                axisService.setClassLoader(serviceClassLoader);
+
+                ServiceBuilder serviceBuilder = new ServiceBuilder(configCtx, axisService);
+                AxisService service = serviceBuilder.populateService(rootElement);
+
+                ArrayList<AxisService> serviceList = new ArrayList<AxisService>();
+                serviceList.add(service);
+                return serviceList;
+            } else if (DeploymentConstants.TAG_SERVICE_GROUP.equals(elementName)) {
+                ServiceGroupBuilder groupBuilder = new ServiceGroupBuilder(rootElement,
+                        servicesMap, configCtx);
+                ArrayList<AxisService> servicList = groupBuilder.populateServiceGroup(serviceGroup);
+                Iterator<AxisService> serviceIterator = servicList.iterator();
+                while (serviceIterator.hasNext()) {
+                    AxisService axisService = (AxisService) serviceIterator.next();
+                    String wsdlLocation = "META-INF/service.wsdl";
+                    InputStream wsdlStream = serviceClassLoader.getResourceAsStream(wsdlLocation);
+                    URL wsdlURL = serviceClassLoader.getResource(wsdlLocation);
+                    if (wsdlStream == null) {
+                        wsdlLocation = "META-INF/" + serviceName + ".wsdl";
+                        wsdlStream = serviceClassLoader.getResourceAsStream(wsdlLocation);
+                        wsdlURL = serviceClassLoader.getResource(wsdlLocation);
+                    }
+                    if (wsdlStream != null) {
+                        WSDL11ToAxisServiceBuilder wsdl2AxisServiceBuilder = new WSDL11ToAxisServiceBuilder(
+                                wsdlStream, axisService);
+                        File file = Utils.toFile(servicesURL);
+                        if (file != null && file.exists()) {
+                            wsdl2AxisServiceBuilder.setCustomWSDLResolver(new AARBasedWSDLLocator(
+                                    wsdlLocation, file, wsdlStream));
+                            wsdl2AxisServiceBuilder.setCustomResolver(new AARFileBasedURIResolver(
+                                    file));
+                        }
+                        if (wsdlURL != null) {
+                            wsdl2AxisServiceBuilder.setDocumentBaseUri(wsdlURL.toString());
+                        }
+                        axisService = wsdl2AxisServiceBuilder.populateService();
+                        axisService.setWsdlFound(true);
+                        axisService.setCustomWsdl(true);
+                        // Set the default message receiver for the operations
+                        // that were
+                        // not listed in the services.xml
+                        Iterator<AxisOperation> operations = axisService.getOperations();
+                        while (operations.hasNext()) {
+                            AxisOperation operation = (AxisOperation) operations.next();
+                            if (operation.getMessageReceiver() == null) {
+                                operation.setMessageReceiver(loadDefaultMessageReceiver(
+                                        operation.getMessageExchangePattern(), axisService));
+                            }
+                        }
+                    }
+                }
+                return servicList;
+            }
+        } catch (IOException e) {
+            throw new DeploymentException(e);
+        } catch (XMLStreamException e) {
+            throw new DeploymentException(e);
+        }
+        return null;
+    }
+    
+    private MessageReceiver loadDefaultMessageReceiver(String mepURL, AxisService service) {
+        MessageReceiver messageReceiver;
+        if (mepURL == null) {
+            mepURL = WSDL2Constants.MEP_URI_IN_OUT;
+        }
+        if (service != null) {
+            messageReceiver = service.getMessageReceiver(mepURL);
+            if (messageReceiver != null) {
+                return messageReceiver;
+            }
+        }
+        return axisConfig.getMessageReceiver(mepURL);
+    }
 
     public void setDirectory(String directory) {
         this.directory = directory;
@@ -188,7 +477,7 @@
             AxisServiceGroup serviceGroup = axisConfig.removeServiceGroup(fileName);
             //Fixed - https://issues.apache.org/jira/browse/AXIS2-4610
             if (serviceGroup != null) {
-                for (Iterator services = serviceGroup.getServices(); services.hasNext();) {
+                for (Iterator<AxisService> services = serviceGroup.getServices(); services.hasNext();) {
                 AxisService axisService = (AxisService) services.next();
                 ServiceLifeCycle serviceLifeCycle = axisService.getServiceLifeCycle();
                 if (serviceLifeCycle != null) {
diff --git a/modules/kernel/src/org/apache/axis2/deployment/WarBasedAxisConfigurator.java b/modules/kernel/src/org/apache/axis2/deployment/WarBasedAxisConfigurator.java
index 4d55737..555e02a 100644
--- a/modules/kernel/src/org/apache/axis2/deployment/WarBasedAxisConfigurator.java
+++ b/modules/kernel/src/org/apache/axis2/deployment/WarBasedAxisConfigurator.java
@@ -23,6 +23,7 @@
 import org.apache.axis2.Constants;
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.deployment.repository.util.ArchiveReader;
+import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.AxisServiceGroup;
 import org.apache.axis2.description.Parameter;
 import org.apache.axis2.engine.AxisConfiguration;
@@ -311,7 +312,7 @@
             InputStream servicexml = config.getServletContext().
                     getResourceAsStream("/WEB-INF/services.xml");
             if (servicexml != null) {
-                HashMap wsdlServices = new HashMap();
+                HashMap<String, AxisService> wsdlServices = new HashMap<String, AxisService>();
                 ArchiveReader archiveReader = new ArchiveReader();
                 String path = config.getServletContext().getRealPath("/WEB-INF");
                 if (path != null) {
diff --git a/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java b/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java
index fe5ebca..f92d364 100644
--- a/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java
+++ b/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java
@@ -38,6 +38,15 @@
     private File file;
     private ClassLoader classLoader;
     private Deployer deployer;
+    private URL url;
+
+    public URL getUrl() {
+        return url;
+    }
+
+    public void setUrl(URL url) {
+        this.url = url;
+    }
 
     public DeploymentFileData(File file) {
         this.file = file;
@@ -45,7 +54,13 @@
 
     public DeploymentFileData(File file, Deployer deployer) {
         this(file);
+        this.deployer = deployer;        
+    }
+    
+    public DeploymentFileData(URL url, Deployer deployer, ClassLoader classLoader) {        
         this.deployer = deployer;
+        this.url = url;
+        this.classLoader = classLoader;
     }
 
     public String getAbsolutePath() {
diff --git a/modules/kernel/src/org/apache/axis2/deployment/repository/util/WSInfoList.java b/modules/kernel/src/org/apache/axis2/deployment/repository/util/WSInfoList.java
index 519e01f..e441ca1 100644
--- a/modules/kernel/src/org/apache/axis2/deployment/repository/util/WSInfoList.java
+++ b/modules/kernel/src/org/apache/axis2/deployment/repository/util/WSInfoList.java
@@ -25,6 +25,7 @@
 import org.apache.axis2.deployment.DeploymentEngine;
 
 import java.io.File;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -83,6 +84,25 @@
 
         jarList.add(info.getFileName());
     }
+    
+    public synchronized void addWSInfoItem(URL url, Deployer deployer, int type) {
+        // There is no way to set hot-update.
+        // Here file.getAbsolutePath() = info.getFileName()
+        WSInfo info = (WSInfo) currentJars.get(url.getPath());
+        if (info != null) {
+            if (deploymentEngine.isHotUpdate()) {
+                WSInfo wsInfo = new WSInfo(info.getFileName(), info.getLastModifiedDate(),
+                        deployer, type);
+                deploymentEngine.addWSToUndeploy(wsInfo); // add entry to undeploy list
+                DeploymentFileData deploymentFileData = new DeploymentFileData(url, deployer, null);
+                deploymentEngine.addWSToDeploy(deploymentFileData); // add entry to deploylist
+            }
+        } else {
+            info = getFileItem(url, deployer, type);
+        }
+
+        jarList.add(info.getFileName());
+    }
 
     /**
      * Checks undeployed Services. Checks old jars files and current jars.
@@ -160,6 +180,21 @@
         }
         return info;
     }
+    
+    /**
+     * Gets the WSInfo object related to a file if it exists, null otherwise.
+     * 
+     */
+    private WSInfo getFileItem(URL url, Deployer deployer, int type) {
+        WSInfo info = (WSInfo) currentJars.get(url.getPath());
+        if (info == null) {
+            info = new WSInfo(url.getPath(), 0, deployer, type);
+            currentJars.put(url.getPath(), info);
+            DeploymentFileData fileData = new DeploymentFileData(url, deployer, null);
+            deploymentEngine.addWSToDeploy(fileData);
+        }
+        return info;
+    }
 
     /**
      * Checks if a file has been modified by comparing the last update date of
diff --git a/modules/kernel/src/org/apache/axis2/engine/AddressingBasedDispatcher.java b/modules/kernel/src/org/apache/axis2/engine/AddressingBasedDispatcher.java
deleted file mode 100644
index c0aa16f..0000000
--- a/modules/kernel/src/org/apache/axis2/engine/AddressingBasedDispatcher.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 org.apache.axis2.engine;
-
-/**
- * Dispatcher based on the WS-Addressing properties.
- * @deprecated use org.apache.axis2.dispatchers.AddressingBasedDispatcher
- */
-public class AddressingBasedDispatcher extends org.apache.axis2.dispatchers.AddressingBasedDispatcher {
-}
diff --git a/modules/kernel/src/org/apache/axis2/engine/HTTPLocationBasedDispatcher.java b/modules/kernel/src/org/apache/axis2/engine/HTTPLocationBasedDispatcher.java
deleted file mode 100644
index aac34fe..0000000
--- a/modules/kernel/src/org/apache/axis2/engine/HTTPLocationBasedDispatcher.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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 org.apache.axis2.engine;
-
-/**
- * Dispatches the operation based on the information from the target endpoint URL.
- *
- * @deprecated use org.apache.axis2.dispatchers.HTTPLocationBasedDispatcher
- */
-public class HTTPLocationBasedDispatcher extends org.apache.axis2.dispatchers.HTTPLocationBasedDispatcher {
-}
diff --git a/modules/kernel/src/org/apache/axis2/engine/InstanceDispatcher.java b/modules/kernel/src/org/apache/axis2/engine/InstanceDispatcher.java
deleted file mode 100644
index 4cf7a23..0000000
--- a/modules/kernel/src/org/apache/axis2/engine/InstanceDispatcher.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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 org.apache.axis2.engine;
-
-import org.apache.axis2.AxisFault;
-import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.handlers.AbstractHandler;
-
-/**
- * By the time the control comes to this handler, the dispatching must have happened
- * so that the message context contains the AxisServiceGroup, AxisService and
- * AxisOperation.
- * This will then try to find the Contexts of ServiceGroup, Service and the Operation.
- * @deprecated The functionality of this class has moved into the DispatchPhase postconditions
- */
-public class InstanceDispatcher extends AbstractHandler {
-
-    /**
-     * This doesn't do anything, as the functionality is now in DispatchPhase.checkPostConditions()
-     * The class remains for backwards compatibility of axis2.xml files, but it should go away after
-     * 1.3.
-     *
-     * @param msgContext the <code>MessageContext</code> to process with this <code>Handler</code>.
-     * @return An InvocationResponse that indicates what the next step in the message processing
-     *         should be.
-     * @throws org.apache.axis2.AxisFault if the handler encounters an error
-     */
-    public InvocationResponse invoke(MessageContext msgContext) throws AxisFault {
-        return InvocationResponse.CONTINUE;
-    }
-}
diff --git a/modules/kernel/src/org/apache/axis2/engine/RequestURIBasedDispatcher.java b/modules/kernel/src/org/apache/axis2/engine/RequestURIBasedDispatcher.java
deleted file mode 100644
index 29a05a6..0000000
--- a/modules/kernel/src/org/apache/axis2/engine/RequestURIBasedDispatcher.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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 org.apache.axis2.engine;
-
-/**
- * Dispatches the service based on the information from the target endpoint URL.
- *
- * @deprecated use org.apache.axis2.dispatchers.RequestURIBasedDispatcher
- */
-public class RequestURIBasedDispatcher extends org.apache.axis2.dispatchers.RequestURIBasedDispatcher {
-}
diff --git a/modules/kernel/src/org/apache/axis2/engine/RequestURIOperationDispatcher.java b/modules/kernel/src/org/apache/axis2/engine/RequestURIOperationDispatcher.java
deleted file mode 100644
index 031dcf6..0000000
--- a/modules/kernel/src/org/apache/axis2/engine/RequestURIOperationDispatcher.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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 org.apache.axis2.engine;
-
-/**
- * Dispatches the operation based on the information from the target endpoint URL.
- *
- * @deprecated use org.apache.axis2.dispatchers.RequestURIOperationDispatcher
- */
-public class RequestURIOperationDispatcher extends org.apache.axis2.dispatchers.RequestURIOperationDispatcher {
-}
diff --git a/modules/kernel/src/org/apache/axis2/engine/SOAPActionBasedDispatcher.java b/modules/kernel/src/org/apache/axis2/engine/SOAPActionBasedDispatcher.java
deleted file mode 100644
index f446d94..0000000
--- a/modules/kernel/src/org/apache/axis2/engine/SOAPActionBasedDispatcher.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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 org.apache.axis2.engine;
-
-/**
- * Dispatches based on the SOAPAction.
- *
- * @deprecated use org.apache.axis2.dispatchers.SOAPActionBasedDispatcher
- */
-public class SOAPActionBasedDispatcher extends org.apache.axis2.dispatchers.SOAPActionBasedDispatcher {
-}
-
diff --git a/modules/kernel/src/org/apache/axis2/engine/SOAPMessageBodyBasedDispatcher.java b/modules/kernel/src/org/apache/axis2/engine/SOAPMessageBodyBasedDispatcher.java
deleted file mode 100644
index 9307c89..0000000
--- a/modules/kernel/src/org/apache/axis2/engine/SOAPMessageBodyBasedDispatcher.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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 org.apache.axis2.engine;
-
-/**
- * Dispatches based on the namespace URI of the first child of
- * the body.
- *
- * @deprecated use org.apache.axis2.dispatchers.SOAPMessageBodyBasedDispatcher
- */
-public class SOAPMessageBodyBasedDispatcher extends org.apache.axis2.dispatchers.SOAPMessageBodyBasedDispatcher {
-}
diff --git a/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutSyncMessageReceiver.java b/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutSyncMessageReceiver.java
deleted file mode 100644
index 6fb94f2..0000000
--- a/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutSyncMessageReceiver.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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 org.apache.axis2.receivers;
-
-import org.apache.axis2.AxisFault;
-import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.engine.AxisEngine;
-import org.apache.axis2.util.MessageContextBuilder;
-
-/**
- * This is the Absract IN-OUT MEP MessageReceiver. The
- * protected abstract methods are only for the sake of breaking down the logic
- *
- * @deprecated use AbstractInOutMessageReceiver
- */
-public abstract class AbstractInOutSyncMessageReceiver extends AbstractMessageReceiver {
-    public abstract void invokeBusinessLogic(MessageContext inMessage, MessageContext outMessage)
-            throws AxisFault;
-
-    public final void invokeBusinessLogic(MessageContext msgContext) throws AxisFault {
-        MessageContext outMsgContext = MessageContextBuilder.createOutMessageContext(msgContext);
-        outMsgContext.getOperationContext().addMessageContext(outMsgContext);
-
-        invokeBusinessLogic(msgContext, outMsgContext);
-        replicateState(msgContext);
-
-        AxisEngine.send(outMsgContext);
-    }
-}
diff --git a/modules/kernel/src/org/apache/axis2/receivers/AbstractRobustInMessageReceiver.java b/modules/kernel/src/org/apache/axis2/receivers/AbstractRobustInMessageReceiver.java
deleted file mode 100644
index 897cd71..0000000
--- a/modules/kernel/src/org/apache/axis2/receivers/AbstractRobustInMessageReceiver.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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 org.apache.axis2.receivers;
-
-/**
- * This is takes care of the IN-OUT sync MEP in the server side
- *
- * @deprecated not needed, since in-only MessageReceivers can throw faults
- */
-public abstract class AbstractRobustInMessageReceiver extends  AbstractMessageReceiver{
-}
diff --git a/modules/kernel/src/org/apache/axis2/receivers/RawXMLINOutAsyncMessageReceiver.java b/modules/kernel/src/org/apache/axis2/receivers/RawXMLINOutAsyncMessageReceiver.java
deleted file mode 100644
index 6ff1768..0000000
--- a/modules/kernel/src/org/apache/axis2/receivers/RawXMLINOutAsyncMessageReceiver.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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 org.apache.axis2.receivers;
-
-import org.apache.axis2.AxisFault;
-import org.apache.axis2.context.MessageContext;
-
-/**
- * The RawXMLINOutAsyncMessageReceiver MessageReceiver hands over the raw request received to
- * the service implementation class as an OMElement. The implementation class is expected
- * to return back the OMElement to be returned to the caller. This is an asynchronous
- * MessageReceiver, and finds the service implementation class to invoke by referring to
- * the "ServiceClass" parameter value specified in the service.xml and looking at the
- * methods of the form OMElement <<methodName>>(OMElement request)
- *
- * @see RawXMLINOnlyMessageReceiver
- * @see RawXMLINOutMessageReceiver
- * @deprecated use RawXMLINOutMessageReceiver and the DO_ASYNC property instead....
- */
-public class RawXMLINOutAsyncMessageReceiver extends RawXMLINOutMessageReceiver {
-    public void receive(final MessageContext messageCtx) throws AxisFault {
-        messageCtx.setProperty(DO_ASYNC, Boolean.TRUE);
-        super.receive(messageCtx);
-    }
-}
diff --git a/modules/kernel/src/org/apache/axis2/receivers/RawXMLINOutMessageReceiver.java b/modules/kernel/src/org/apache/axis2/receivers/RawXMLINOutMessageReceiver.java
index cadef20..80c3739 100644
--- a/modules/kernel/src/org/apache/axis2/receivers/RawXMLINOutMessageReceiver.java
+++ b/modules/kernel/src/org/apache/axis2/receivers/RawXMLINOutMessageReceiver.java
@@ -26,8 +26,10 @@
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.description.AxisOperation;
+import org.apache.axis2.engine.AxisEngine;
 import org.apache.axis2.engine.MessageReceiver;
 import org.apache.axis2.i18n.Messages;
+import org.apache.axis2.util.MessageContextBuilder;
 
 import java.lang.reflect.Method;
 
@@ -42,7 +44,7 @@
  * @see RawXMLINOnlyMessageReceiver
  * @see RawXMLINOutAsyncMessageReceiver
  */
-public class RawXMLINOutMessageReceiver extends AbstractInOutSyncMessageReceiver
+public class RawXMLINOutMessageReceiver extends AbstractMessageReceiver
         implements MessageReceiver {
 
     private Method findOperation(AxisOperation op, Class implClass) {
@@ -108,4 +110,14 @@
             throw AxisFault.makeFault(e);
         }
     }
+    
+    public final void invokeBusinessLogic(MessageContext msgContext) throws AxisFault {
+        MessageContext outMsgContext = MessageContextBuilder.createOutMessageContext(msgContext);
+        outMsgContext.getOperationContext().addMessageContext(outMsgContext);
+
+        invokeBusinessLogic(msgContext, outMsgContext);
+        replicateState(msgContext);
+
+        AxisEngine.send(outMsgContext);
+    }
 }
diff --git a/modules/kernel/src/org/apache/axis2/util/Base64.java b/modules/kernel/src/org/apache/axis2/util/Base64.java
deleted file mode 100644
index 4d23002..0000000
--- a/modules/kernel/src/org/apache/axis2/util/Base64.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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 org.apache.axis2.util;
-
-/**
- * @deprecated
- */
-public class Base64 extends org.apache.axiom.om.util.Base64 {
-}
\ No newline at end of file
diff --git a/modules/kernel/src/org/apache/axis2/util/FaultyServiceData.java b/modules/kernel/src/org/apache/axis2/util/FaultyServiceData.java
index ae275be..8c03eb9 100644
--- a/modules/kernel/src/org/apache/axis2/util/FaultyServiceData.java
+++ b/modules/kernel/src/org/apache/axis2/util/FaultyServiceData.java
@@ -19,6 +19,7 @@
 
 package org.apache.axis2.util;
 
+import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.AxisServiceGroup;
 import org.apache.axis2.deployment.repository.util.DeploymentFileData;
 
@@ -29,12 +30,12 @@
 
     private String serviceGroupName;
     private AxisServiceGroup serviceGroup;
-    private ArrayList serviceList;
+    private ArrayList<AxisService> serviceList;
     private DeploymentFileData currentDeploymentFile;
     private URL serviceLocation;
 
     public FaultyServiceData(AxisServiceGroup serviceGroup,
-                             ArrayList serviceList,
+                             ArrayList<AxisService> serviceList,
                              URL serviceLocation,
                              DeploymentFileData currentDeploymentFile) {
         serviceGroupName = serviceGroup.getServiceGroupName();
@@ -53,7 +54,7 @@
         return currentDeploymentFile;
     }
 
-    public ArrayList getServiceList() {
+    public ArrayList<AxisService> getServiceList() {
         return serviceList;
     }
 
diff --git a/modules/kernel/test/org/apache/axis2/engine/AbstractEngineTest.java b/modules/kernel/test/org/apache/axis2/engine/AbstractEngineTest.java
index a954270..9333e58 100644
--- a/modules/kernel/test/org/apache/axis2/engine/AbstractEngineTest.java
+++ b/modules/kernel/test/org/apache/axis2/engine/AbstractEngineTest.java
@@ -22,7 +22,8 @@
 import junit.framework.TestCase;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver;
+import org.apache.axis2.receivers.AbstractMessageReceiver;
+import org.apache.axis2.util.MessageContextBuilder;
 
 public class AbstractEngineTest extends TestCase {
     public AbstractEngineTest() {
@@ -32,12 +33,22 @@
         super(arg0);
     }
 
-    public class NullMessageReceiver extends AbstractInOutSyncMessageReceiver {
+    public class NullMessageReceiver extends AbstractMessageReceiver {
 
         public void invokeBusinessLogic(MessageContext inMessage,
                                         MessageContext outMessage)
                 throws AxisFault {
 
         }
+
+        public final void invokeBusinessLogic(MessageContext msgContext) throws AxisFault {
+            MessageContext outMsgContext = MessageContextBuilder.createOutMessageContext(msgContext);
+            outMsgContext.getOperationContext().addMessageContext(outMsgContext);
+
+            invokeBusinessLogic(msgContext, outMsgContext);
+            replicateState(msgContext);
+
+            AxisEngine.send(outMsgContext);
+        }
     }
 }
diff --git a/modules/ping/src/org/apache/axis2/ping/PingMessageReceiver.java b/modules/ping/src/org/apache/axis2/ping/PingMessageReceiver.java
index 33c00d2..b73f472 100644
--- a/modules/ping/src/org/apache/axis2/ping/PingMessageReceiver.java
+++ b/modules/ping/src/org/apache/axis2/ping/PingMessageReceiver.java
@@ -26,7 +26,7 @@
 import org.apache.axis2.description.AxisOperation;
 import org.apache.axis2.engine.MessageReceiver;
 import org.apache.axis2.engine.Pingable;
-import org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver;
+import org.apache.axis2.receivers.AbstractInOutMessageReceiver;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -34,7 +34,7 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 
-public class PingMessageReceiver extends AbstractInOutSyncMessageReceiver implements PingConstants {
+public class PingMessageReceiver extends AbstractInOutMessageReceiver implements PingConstants {
     private static Log log = LogFactory.getLog(PingMessageReceiver.class);
 
     public void invokeBusinessLogic(MessageContext inMessage, MessageContext outMessage) throws AxisFault {
@@ -44,7 +44,7 @@
             AxisOperation axisOperation;
             PingResponse pingResponse = new PingResponse();
             pingResponse.initPingResponse(inMessage);
-            Iterator opListIterator = getAxisOperations(inMessage);
+            Iterator<AxisOperation> opListIterator = getAxisOperations(inMessage);
 
             while (opListIterator.hasNext()) {
                 axisOperation = (AxisOperation) opListIterator.next();
@@ -75,9 +75,9 @@
      * @return Iterator for the list of AxisOperations
      * @throws AxisFault
      */
-    private Iterator getAxisOperations(MessageContext inMessage) throws AxisFault {
+    private Iterator<AxisOperation> getAxisOperations(MessageContext inMessage) throws AxisFault {
         boolean serviceLevel = false;
-        Iterator operationsIterator;
+        Iterator<AxisOperation> operationsIterator;
 
         OMElement element = null;
         OMElement pingRequestElement = inMessage.getEnvelope().
@@ -95,8 +95,8 @@
 
         if (!serviceLevel && element != null) {
             //Operations to be pinged has been specified in the ping request
-            Iterator elementIterator = pingRequestElement.getChildrenWithName(new QName(TAG_OPERATION));
-            ArrayList operationList = new ArrayList();
+            Iterator<?> elementIterator = pingRequestElement.getChildrenWithName(new QName(TAG_OPERATION));
+            ArrayList<AxisOperation> operationList = new ArrayList<AxisOperation>();
             AxisOperation axisOperation;
 
             while (elementIterator.hasNext()) {
diff --git a/modules/scripting/src/org/apache/axis2/scripting/ScriptReceiver.java b/modules/scripting/src/org/apache/axis2/scripting/ScriptReceiver.java
index 36fbc08..f36d275 100644
--- a/modules/scripting/src/org/apache/axis2/scripting/ScriptReceiver.java
+++ b/modules/scripting/src/org/apache/axis2/scripting/ScriptReceiver.java
@@ -24,7 +24,7 @@
 import org.apache.axis2.context.ServiceContext;
 import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.Parameter;
-import org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver;
+import org.apache.axis2.receivers.AbstractInOutMessageReceiver;
 import org.apache.axis2.scripting.convertors.ConvertorFactory;
 import org.apache.axis2.scripting.convertors.OMElementConvertor;
 import org.apache.bsf.BSFEngine;
@@ -76,7 +76,7 @@
  * The script language is determined by the file name suffix when using scripts
  * in seperate files or the script parameter name suffix when using inline scripts.
  */
-public class ScriptReceiver extends AbstractInOutSyncMessageReceiver {
+public class ScriptReceiver extends AbstractInOutMessageReceiver {
 
     public static final String SCRIPT_ATTR = "script";
     public static final String FUNCTION_ATTR = "function";
@@ -161,7 +161,7 @@
             }
         } else {
             // the script is defined inline within the services.xml
-            ArrayList parameters = axisService.getParameters();
+            ArrayList<Parameter> parameters = axisService.getParameters();
             for (int i=0; scriptFileParam == null && i<parameters.size(); i++) {
                 Parameter p = (Parameter) parameters.get(i);
                 if (p.getName().startsWith("script.")) {
