--- E:\src\extern\nant\src\NAnt.Core\Types\a\Project.cs	Thu Dec 18 19:22:32 2003
+++ E:\src\extern\nant\src\NAnt.Core\Project.cs	Wed Jan 07 14:38:42 2004
@@ -861,6 +861,19 @@
             }
         }
 
+		public void MergeOrReplaceType(string id, DataTypeBase type) {
+			switch(type.Mode) {
+				case DataTypeBase.RedefineMode.replace :
+					Log(Level.Debug,"Replacing type with id '"+id+"'");
+					DataTypeReferences[id] = type; // overwrite with the new reference.
+					break;
+				case DataTypeBase.RedefineMode.append :
+					Log(Level.Debug,"Appending to type with id '"+id+"'");
+					DataTypeReferences[id].MergeWith(type);
+					break;
+			}
+		}
+		
         public DataTypeBase CreateDataTypeBase(XmlNode elementNode) {
             DataTypeBase type = TypeFactory.CreateDataType(elementNode, this);
 
@@ -1185,32 +1198,36 @@
                     continue;
                 }
 
-                if (TypeFactory.TaskBuilders.Contains(childNode.Name)) {
-                    // create task instance
-                    Task task = CreateTask(childNode);
+				ExecuteNode(childNode,this);				
+            }
+        }
 
-                    task.Parent = this;
+		public void ExecuteNode(XmlNode node,object parent) {
+			if (TypeFactory.TaskBuilders.Contains(node.Name)) {
+				// create task instance
+				Task task = CreateTask(node);
 
-                    // execute task
+                if(task != null) {
+                    task.Parent = parent;
                     task.Execute();
-                } else if (TypeFactory.DataTypeBuilders.Contains(childNode.Name)) {
-                    // we are an datatype declaration
-                    DataTypeBase dataType = CreateDataTypeBase(childNode);
-
-                    Log(Level.Debug, "Adding a {0} reference with id '{1}'.", childNode.Name, dataType.ID);                    
-                    if ( ! DataTypeReferences.Contains(dataType.ID ) ) {
-                        DataTypeReferences.Add(dataType.ID, dataType);
-                    } else {
-                        DataTypeReferences[dataType.ID] = dataType; // overwrite with the new reference.
-                    }
-                } else {
-                    throw new BuildException(string.Format(CultureInfo.InvariantCulture, 
-                        "Invalid element <{0}>. Unknown task or datatype.", childNode.Name), 
-                        LocationMap.GetLocation(childNode));
                 }
-            }
-        }
-
+			} else if (TypeFactory.DataTypeBuilders.Contains(node.Name)) {
+				// we are an datatype declaration
+				DataTypeBase dataType = CreateDataTypeBase(node);
+
+				if ( ! DataTypeReferences.Contains(dataType.ID ) ) {
+					Log(Level.Debug, "Adding a {0} reference with id '{1}'.", node.Name, dataType.ID);                    
+					DataTypeReferences.Add(dataType.ID, dataType);
+				} else {
+					MergeOrReplaceType(dataType.ID,dataType);
+				}
+			} else {
+				throw new BuildException(string.Format(CultureInfo.InvariantCulture, 
+					"Invalid element <{0}>. Unknown task or datatype.", node.Name), 
+					LocationMap.GetLocation(node));
+			}
+		}
+		
         #endregion Internal Instance Methods
 
         #region Private Instance Methods
