for RMC Enhancement 46678
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/meta/IMetaDef.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/meta/IMetaDef.java
index 2a94ee3..d5cfeaf 100644
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/meta/IMetaDef.java
+++ b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/meta/IMetaDef.java
@@ -62,6 +62,8 @@
 	
 	public static final String attachment = "attachment"; 						//$NON-NLS-1$
 	
+	public static final String treeBrowser = "treeBrowser"; 						//$NON-NLS-1$
+	
 	//APIs
 	public String getName();
 	
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/meta/internal/ExtendedReferenceImpl.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/meta/internal/ExtendedReferenceImpl.java
index dddaf18..1bba756 100644
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/meta/internal/ExtendedReferenceImpl.java
+++ b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/meta/internal/ExtendedReferenceImpl.java
@@ -26,6 +26,8 @@
 	
 	private String contributeTo;
 	
+	private boolean createUDTChild;
+	
 	private ExtendedOppositeImpl opposite;
 
 	public ExtendedReferenceImpl(MetaElement parent) {
@@ -71,6 +73,9 @@
 			opposite.parseElement(childElement);
 		}
 		
+
+		createUDTChild = new Boolean(element.getAttribute(IMetaDef.treeBrowser));
+		
 		qualifiedReferences = new ArrayList<QualifiedReference>();
 		List<Element> rqElements = XMLUtil.getChildElementsByTagName(element, IMetaDef.REFERENCE_QUALIFIERS);
 		if (rqElements == null || rqElements.isEmpty()) {
@@ -86,6 +91,10 @@
 		}
 	}
 	
+	public boolean isCreateUDTChild() {
+		return createUDTChild;
+	}
+
 	public List<String> getValueTypes() {		
 		return valueTypes;
 	}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ConfigurationViewBuilder.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ConfigurationViewBuilder.java
index 755a861..8070a61 100644
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ConfigurationViewBuilder.java
+++ b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ConfigurationViewBuilder.java
@@ -34,13 +34,19 @@
 import org.eclipse.epf.common.utils.FileUtil;
 import org.eclipse.epf.common.utils.StrUtil;
 import org.eclipse.epf.common.utils.Timer;
+import org.eclipse.epf.library.LibraryService;
 import org.eclipse.epf.library.configuration.ConfigurationFilter;
 import org.eclipse.epf.library.configuration.ConfigurationHelper;
 import org.eclipse.epf.library.edit.IFilter;
 import org.eclipse.epf.library.edit.TngAdapterFactory;
 import org.eclipse.epf.library.edit.configuration.PracticeSubgroupItemProvider;
+import org.eclipse.epf.library.edit.meta.TypeDefUtil;
+import org.eclipse.epf.library.edit.meta.internal.ExtendedReferenceImpl;
 import org.eclipse.epf.library.edit.process.IBSItemProvider;
+import org.eclipse.epf.library.edit.util.LibraryEditUtil;
+import org.eclipse.epf.library.edit.util.PracticePropUtil;
 import org.eclipse.epf.library.edit.util.ProcessUtil;
+import org.eclipse.epf.library.edit.util.PropUtil;
 import org.eclipse.epf.library.edit.util.Suppression;
 import org.eclipse.epf.library.edit.util.TngUtil;
 import org.eclipse.epf.library.layout.Bookmark;
@@ -74,6 +80,11 @@
 import org.eclipse.epf.uma.UmaPackage;
 import org.eclipse.epf.uma.WorkProduct;
 import org.eclipse.epf.uma.util.AssociationHelper;
+import org.eclipse.epf.uma.util.ExtendedAttribute;
+import org.eclipse.epf.uma.util.ExtendedReference;
+import org.eclipse.epf.uma.util.ModifiedTypeMeta;
+import org.eclipse.epf.uma.util.UmaUtil;
+import org.eclipse.epf.uma.util.UserDefinedTypeMeta;
 
 /**
  * Builds the views defined for a method configuration.
@@ -552,6 +563,10 @@
 			// Either delegate the call or return nothing.
 			if (treeItemContentProvider != null) {
 				Collection items = treeItemContentProvider.getChildren(obj);
+				Collection udtReference = getUDTReference(obj);
+				if(udtReference != null){
+					items.addAll(udtReference);
+				}	
 				for (Iterator it = items.iterator(); it.hasNext();) {
 					if (monitor.isCanceled()) {
 						return;
@@ -600,8 +615,7 @@
 										}
 									} else {
 										if (itorObj instanceof PracticeSubgroupItemProvider) {
-											buildPracticeSubgroupTree(obj, parent,
-													(PracticeSubgroupItemProvider) itorObj);
+											isCreateSubFolder(obj, parent, itorObj);
 										} else {										
 											Bookmark b = createBookmark(me, parent);
 											if (!buildSubTree(itorObj, me, b)) {
@@ -619,7 +633,7 @@
 						}
 					} else {
 						if (itorObj instanceof PracticeSubgroupItemProvider) {
-							buildPracticeSubgroupTree(obj, parent, (PracticeSubgroupItemProvider) itorObj);
+							isCreateSubFolder(obj, parent, itorObj);
 						} else {
 							iterate(itorObj, parent);
 						}
@@ -636,6 +650,51 @@
 	}
 
 	/**
+	 * it udt designed as have treebroswer,create tree node for it
+	 * @param obj
+	 * @return
+	 */
+	private Collection<?> getUDTReference(Object obj) {
+		Collection<?> result = null;
+		if(obj instanceof Practice && PracticePropUtil.getPracticePropUtil().isUdtType((Practice)obj)){
+			Practice practice = (Practice)obj;
+			UserDefinedTypeMeta udtMeta = PracticePropUtil.getPracticePropUtil().getUdtMeta(practice);
+			ModifiedTypeMeta modifiedTypeMeta = LibraryEditUtil.getInstance().getModifiedType(udtMeta.getId());
+			if(modifiedTypeMeta != null){
+				List<ExtendedAttribute> attributes = modifiedTypeMeta.getAttributes();
+				String flag = null;
+				if(flag != null && !new Boolean(flag)){
+					result = practice.getContentReferences();
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * for udt generateTreebrowserFolders attribute.If false,no sub folder
+	 * @param obj
+	 * @param parent
+	 * @param itorObj
+	 */
+	private void isCreateSubFolder(Object obj, Bookmark parent, Object itorObj) {
+		PracticeSubgroupItemProvider provider = (PracticeSubgroupItemProvider)itorObj;
+		if(provider.getPractice() != null && PracticePropUtil.getPracticePropUtil().isUdtType(provider.getPractice())){
+			//first UDT to get ID,use ID to get generateTreebrowserFolders
+			UserDefinedTypeMeta udtMeta = PracticePropUtil.getPracticePropUtil().getUdtMeta(provider.getPractice());
+			UserDefinedTypeMeta userDefineType = LibraryService.getInstance().getCurrentLibraryManager().getUserDefineType(udtMeta.getId());
+			String flag = userDefineType.getRteNameMap().get(UserDefinedTypeMeta._generateTreebrowserFolders);
+			if(Boolean.FALSE.toString().equals(flag)){
+				iterate(itorObj, parent);
+			}else{
+				buildPracticeSubgroupTree(obj, parent, (PracticeSubgroupItemProvider) itorObj);
+			}
+		}else{
+			buildPracticeSubgroupTree(obj, parent, (PracticeSubgroupItemProvider) itorObj);
+		}
+	}
+
+	/**
 	 * create a bookmark under the specified parent. If no parent is specified,
 	 * 
 	 * @param monitor
@@ -684,6 +743,14 @@
 			}
 		} else if (LibraryUtil.isProcess(element)) {
 			buildProcessSubTree(obj, (org.eclipse.epf.uma.Process) element, bm);
+		} else if (element instanceof Practice) {
+			ModifiedTypeMeta meta = TypeDefUtil.getMdtMeta(element);
+			if (meta == null) {
+				return false;
+			}else{
+				buildUDTSubTree(obj, element, bm, meta);
+				return true;
+			}
 		} else {
 			// System.out.println("Not handled: " + element);
 			return false;
@@ -692,6 +759,28 @@
 		return true;
 	}
 
+	/**
+	 * create the children of the UDT
+	 * @param obj
+	 * @param element
+	 * @param bm
+	 * @param meta
+	 */
+	private void buildUDTSubTree(Object obj, MethodElement element,
+			Bookmark bm, ModifiedTypeMeta meta) {
+		List<ExtendedReference> references = meta.getReferences();
+		iterate(obj, bm);//create references elements
+		for(ExtendedReference reference:references){
+			ExtendedReferenceImpl referenceimpl = (ExtendedReferenceImpl)reference;
+			boolean createUDTChild = referenceimpl.isCreateUDTChild();
+			List<MethodElement> items = PropUtil.getPropUtil().getExtendedReferenceList(
+					element, referenceimpl, false);
+			if(createUDTChild){
+				createFolderBookmark(element, bm, referenceimpl.getName(), referenceimpl.getName(), items, true);
+			}
+		}
+	}
+
 	private void buildItems(List elements, Bookmark bm) {
 		buildItems(elements, bm, false);
 	}
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UserDefinedTypeMeta.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UserDefinedTypeMeta.java
index a31b570..822ee57 100644
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UserDefinedTypeMeta.java
+++ b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UserDefinedTypeMeta.java
@@ -34,6 +34,7 @@
 	public static final String _shapeIconRelative = "shapeIconRelative";    //$NON-NLS-1$
 	public static final String _referenceQualifiers = "referenceQualifiers";//$NON-NLS-1$
 	public static final String _referenceQualifierNames = "referenceQualifierNames";//$NON-NLS-1$
+	public static final String _generateTreebrowserFolders = "generateTreebrowserFolders";//$NON-NLS-1$
 	
 	public static String[] rteNames = {
 		_typeName,