Index: src/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
===================================================================
--- src/java/com/opensymphony/xwork2/config/entities/PackageConfig.java	(revision 1429)
+++ src/java/com/opensymphony/xwork2/config/entities/PackageConfig.java	(working copy)
@@ -40,7 +40,10 @@
     private String namespace = "";
     private boolean isAbstract = false;

+    private boolean needsRefresh;
+

+
     public PackageConfig() {
     }

@@ -397,6 +400,14 @@
         resultTypeConfigs.put(config.getName(), config);
     }

+    public boolean isNeedsRefresh() {
+        return needsRefresh;
+    }
+
+    public void setNeedsRefresh(boolean needsRefresh) {
+        this.needsRefresh = needsRefresh;
+    }
+
     public boolean equals(Object o) {
         if (this == o) {
             return true;
Index: src/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
===================================================================
--- src/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java	(revision 1429)
+++ src/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java	(working copy)
@@ -222,6 +222,7 @@
     }

     public void loadPackages() throws ConfigurationException {
+        List<ReloadPackage> reloads = new ArrayList<ReloadPackage>();
         for (Document doc : documents) {
             Element rootElement = doc.getDocumentElement();
             NodeList children = rootElement.getChildNodes();
@@ -236,16 +237,76 @@
                     final String nodeName = child.getNodeName();

                     if (nodeName.equals("package")) {
-                        addPackage(child);
-                    }
+                        PackageConfig cfg = addPackage(child);
+                        if (cfg.isNeedsRefresh()) {
+                            reloads.add(new ReloadPackage(doc, child));
+                        }
+                    }
                 }
             }
             loadExtraConfiguration(doc);
         }
+
+        if (reloads.size() > 0) {
+            reloadRequiredPackages(reloads);
+        }
+
+        reloads.clear();
         documents.clear();
         configuration = null;
     }

+    private void reloadRequiredPackages(List<ReloadPackage> reloads) {
+        List<ReloadPackage> result = new ArrayList<ReloadPackage>();
+        if ( reloads.size() > 0) {
+            for (ReloadPackage pkg : reloads) {
+                Document doc = pkg.getDoc();
+                Element rootElement = doc.getDocumentElement();
+                NodeList children = rootElement.getChildNodes();
+                int childSize = children.getLength();
+
+                for (int i = 0; i < childSize; i++) {
+                    Node childNode = children.item(i);
+
+                    if (childNode instanceof Element) {
+                        Element child = (Element) childNode;
+
+                        final String nodeName = child.getNodeName();
+
+                        if (nodeName.equals("package")) {
+                            PackageConfig cfg = addPackage(child);
+                            if (cfg.isNeedsRefresh()) {
+                                result.add(new ReloadPackage(doc, child));
+                            }
+                        }
+                    }
+                }
+                loadExtraConfiguration(doc);
+            }
+        }
+        if ( result.size() > 0 && reloads.size() > result.size() && result.size() != reloads.size()) {
+            reloadRequiredPackages(result);
+        }
+    }
+
+    private class ReloadPackage {
+        Element child;
+        Document doc;
+
+        public ReloadPackage(Document doc, Element child) {
+            this.child = child;
+            this.doc = doc;
+        }
+
+        public Element getChild() {
+            return child;
+        }
+
+        public Document getDoc() {
+            return doc;
+        }
+    }
+
     /**
      * Tells whether the ConfigurationProvider should reload its configuration. This method should only be called
      * if ConfigurationManager.isReloadingConfigs() is true.
@@ -351,9 +412,13 @@
     /**
      * Create a PackageConfig from an XML element representing it.
      */
-    protected void addPackage(Element packageElement) throws ConfigurationException {
+    protected PackageConfig addPackage(Element packageElement) throws ConfigurationException {
         PackageConfig newPackage = buildPackageContext(packageElement);

+        if (newPackage.isNeedsRefresh()) {
+            return newPackage;
+        }
+
         if (LOG.isDebugEnabled()) {
             LOG.debug("Loaded " + newPackage);
         }
@@ -388,6 +453,7 @@
         loadDefaultActionRef(newPackage, packageElement);

         configuration.addPackageConfig(newPackage.getName(), newPackage);
+        return newPackage;
     }

     protected void addResultTypes(PackageConfig packageContext, Element element) {
@@ -489,6 +555,7 @@
                 LOG.error("Unable to find parent packages " + parent);

                 cfg = new PackageConfig(name, namespace, isAbstract);
+                cfg.setNeedsRefresh(true);
             } else {
                 cfg = new PackageConfig(name, namespace, isAbstract, parents);
             }
@@ -806,7 +873,7 @@
                 Element rootElement = doc.getDocumentElement();
                 NodeList children = rootElement.getChildNodes();
                 int childSize = children.getLength();
-
+
                 for (int i = 0; i < childSize; i++) {
                     Node childNode = children.item(i);

@@ -815,9 +882,6 @@

                         final String nodeName = child.getNodeName();

-                        //if (nodeName.equals("package")) {
-                        //    addPackage(child);
-                        //} else
                         if (nodeName.equals("include")) {
                             String includeFileName = child.getAttribute("file");
                             docs.addAll(loadConfigurationFiles(includeFileName, child));
Index: src/test/xwork-proxyinvoke.xml
===================================================================
--- src/test/xwork-proxyinvoke.xml	(revision 1429)
+++ src/test/xwork-proxyinvoke.xml	(working copy)
@@ -5,7 +5,40 @@
     
  	<bean type="com.opensymphony.xwork2.ActionProxyFactory" name="default" class="com.opensymphony.xwork2.DefaultActionProxyFactory"/>
 	<constant name="devMode" value="false" />
- 
+
+    <package name="xwork-test-default">
+        <result-types>
+            <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult" default="true"/>
+            <result-type name="void" class="com.opensymphony.xwork2.VoidResult"/>
+            <result-type name="mock" class="com.opensymphony.xwork2.mock.MockResult"/>
+        </result-types>
+
+        <interceptors>
+            <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
+            <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
+            <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
+            <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
+            <interceptor name="static-params" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
+            <interceptor name="model-driven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
+            <interceptor name="validation" class="com.opensymphony.xwork2.validator.ValidationInterceptor"/>
+			<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
+            <interceptor name="test" class="com.opensymphony.xwork2.mock.MockInterceptor">
+                <param name="foo">expectedFoo</param>
+            </interceptor>
+
+            <interceptor-stack name="defaultStack">
+                <interceptor-ref name="static-params"/>
+                <interceptor-ref name="model-driven"/>
+                <interceptor-ref name="params"/>
+            </interceptor-stack>
+
+            <interceptor-stack name="debugStack">
+                <interceptor-ref name="timer"/>
+                <interceptor-ref name="logger"/>
+            </interceptor-stack>
+        </interceptors>
+    </package>
+    
     <package name="default" extends="xwork-test-default">
 
         <action name="ProxyInvocation" method="show" class="com.opensymphony.xwork2.ProxyInvocationAction"/>
Index: src/test/com/opensymphony/xwork2/config/providers/xwork-include-before-package-2.xml
===================================================================
--- src/test/com/opensymphony/xwork2/config/providers/xwork-include-before-package-2.xml	(revision 0)
+++ src/test/com/opensymphony/xwork2/config/providers/xwork-include-before-package-2.xml	(revision 0)
@@ -0,0 +1,14 @@
+<!DOCTYPE xwork PUBLIC
+    "-//OpenSymphony Group//XWork 2.0//EN"
+    "http://www.opensymphony.com/xwork/xwork-2.0.dtd"
+ >
+
+<xwork>
+    <package name="namespace2" extends="namespace1" namespace="/namespace2">
+        <action name="action2" class="com.opensymphony.xwork2.SimpleAction">
+            <result name="success" type="chain"/>
+            <interceptor-ref name="params"/>
+        </action>
+    </package>
+
+</xwork>
Index: src/test/com/opensymphony/xwork2/config/providers/xwork-include-before-package.xml
===================================================================
--- src/test/com/opensymphony/xwork2/config/providers/xwork-include-before-package.xml	(revision 0)
+++ src/test/com/opensymphony/xwork2/config/providers/xwork-include-before-package.xml	(revision 0)
@@ -0,0 +1,22 @@
+<!DOCTYPE xwork PUBLIC
+    "-//OpenSymphony Group//XWork 2.0//EN"
+    "http://www.opensymphony.com/xwork/xwork-2.0.dtd"
+ >
+
+<xwork>
+	<include file="xwork-test-beans.xml" />
+
+    <package name="namespace1" extends="default" namespace="/namespace1">
+        <interceptors>
+            <interceptor name="static-params" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
+        </interceptors>
+
+        <action name="action1" class="com.opensymphony.xwork2.SimpleAction">
+            <result name="success" type="chain"/>
+            <interceptor-ref name="params"/>
+        </action>
+    </package>
+
+    <include file="com/opensymphony/xwork2/config/providers/xwork-include-before-package-2.xml" />
+
+</xwork>
Index: src/test/com/opensymphony/xwork2/config/providers/xwork-include-parent.xml
===================================================================
--- src/test/com/opensymphony/xwork2/config/providers/xwork-include-parent.xml	(revision 0)
+++ src/test/com/opensymphony/xwork2/config/providers/xwork-include-parent.xml	(revision 0)
@@ -0,0 +1,22 @@
+<!DOCTYPE xwork PUBLIC
+    "-//OpenSymphony Group//XWork 2.0//EN"
+    "http://www.opensymphony.com/xwork/xwork-2.0.dtd"
+ >
+
+<xwork>
+	<include file="xwork-test-default.xml" />
+
+    <package name="default">
+        <result-types>
+            <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult" default="true"/>
+        </result-types>
+        <interceptors>
+            <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
+        </interceptors>
+    </package>
+
+    <include file="com/opensymphony/xwork2/config/providers/xwork-include-before-package.xml" />
+
+
+    <include file="com/opensymphony/xwork2/config/providers/xwork-include-after-package.xml" />
+</xwork>
Index: src/test/com/opensymphony/xwork2/config/providers/xwork-include-after-package-2.xml
===================================================================
--- src/test/com/opensymphony/xwork2/config/providers/xwork-include-after-package-2.xml	(revision 0)
+++ src/test/com/opensymphony/xwork2/config/providers/xwork-include-after-package-2.xml	(revision 0)
@@ -0,0 +1,14 @@
+<!DOCTYPE xwork PUBLIC
+    "-//OpenSymphony Group//XWork 2.0//EN"
+    "http://www.opensymphony.com/xwork/xwork-2.0.dtd"
+ >
+
+<xwork>
+    <package name="namespace5" extends="namespace4" namespace="/namespace5">
+        <action name="action5" class="com.opensymphony.xwork2.SimpleAction">
+            <result name="success" type="chain"/>
+            <interceptor-ref name="params"/>
+        </action>
+    </package>
+
+</xwork>
Index: src/test/com/opensymphony/xwork2/config/providers/xwork-include-after-package.xml
===================================================================
--- src/test/com/opensymphony/xwork2/config/providers/xwork-include-after-package.xml	(revision 0)
+++ src/test/com/opensymphony/xwork2/config/providers/xwork-include-after-package.xml	(revision 0)
@@ -0,0 +1,20 @@
+<!DOCTYPE xwork PUBLIC
+    "-//OpenSymphony Group//XWork 2.0//EN"
+    "http://www.opensymphony.com/xwork/xwork-2.0.dtd"
+ >
+
+<xwork>
+    <package name="namespace4" extends="namespace1" namespace="/namespace4">
+        <interceptors>
+            <interceptor name="static-params" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
+        </interceptors>
+
+        <action name="action4" class="com.opensymphony.xwork2.SimpleAction">
+            <result name="success" type="chain"/>
+            <interceptor-ref name="params"/>
+        </action>
+    </package>
+
+
+    <include file="com/opensymphony/xwork2/config/providers/xwork-include-after-package-2.xml" />
+</xwork>
Index: src/test/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderTest.java
===================================================================
--- src/test/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderTest.java	(revision 1429)
+++ src/test/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderTest.java	(working copy)
@@ -5,8 +5,11 @@
 package com.opensymphony.xwork2.config.providers;
 
 import java.io.File;
+import java.util.List;
 
 import com.opensymphony.xwork2.config.ConfigurationProvider;
+import com.opensymphony.xwork2.config.RuntimeConfiguration;
+import com.opensymphony.xwork2.config.entities.PackageConfig;
 import com.opensymphony.xwork2.util.FileManager;
 
 
@@ -25,4 +28,47 @@
         
         assertTrue(provider.needsReload());
     }
+
+    public void testInheritence() throws Exception {
+        final String filename = "com/opensymphony/xwork2/config/providers/xwork-include-parent.xml";
+        ConfigurationProvider provider = buildConfigurationProvider(filename);
+
+        provider.init(configuration);
+        provider.loadPackages();
+
+        // test expectations
+        assertEquals(6, configuration.getPackageConfigs().size());
+
+        
+        PackageConfig defaultPackage = configuration.getPackageConfig("default");
+        assertNotNull(defaultPackage);
+        assertEquals("default", defaultPackage.getName());
+
+
+        PackageConfig namespace1 = configuration.getPackageConfig("namespace1");
+        assertNotNull(namespace1);
+        assertEquals("namespace1", namespace1.getName());
+        assertEquals(defaultPackage, namespace1.getParents().get(0));
+
+        PackageConfig namespace2 = configuration.getPackageConfig("namespace2");
+        assertNotNull(namespace2);
+        assertEquals("namespace2", namespace2.getName());
+        assertEquals(1, namespace2.getParents().size());
+        assertEquals(namespace1, namespace2.getParents().get(0));
+
+        
+        PackageConfig namespace4 = configuration.getPackageConfig("namespace4");
+        assertNotNull(namespace4);
+        assertEquals("namespace4", namespace4.getName());
+        assertEquals(1, namespace4.getParents().size());
+        assertEquals(namespace1, namespace4.getParents().get(0));
+
+        
+        PackageConfig namespace5 = configuration.getPackageConfig("namespace5");
+        assertNotNull(namespace5);
+        assertEquals("namespace5", namespace5.getName());
+        assertEquals(1, namespace5.getParents().size());
+        assertEquals(namespace4, namespace5.getParents().get(0));
+
+    }
 }
