diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/category/SortableCategoryList.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/category/SortableCategoryList.java
new file mode 100755
index 000000000..f0395ba65
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/category/SortableCategoryList.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+package com.arsdigita.cms.ui.category;
+
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.ParameterSingleSelectionModel;
+import com.arsdigita.bebop.parameters.BigDecimalParameter;
+import com.arsdigita.cms.CMS;
+
+import com.arsdigita.cms.ui.SortableList;
+import org.apache.log4j.Logger;
+import org.libreccm.categorization.Category;
+import org.librecms.contentsection.ContentSection;
+
+import javax.servlet.ServletException;
+import java.math.BigDecimal;
+
+/**
+ * This list offers the option for the code to provide the developer
+ * with links to sort the given categories.
+ *
+ * NOTE: This UI currently does not scale well with large numbers of
+ * items since it just lists all of them. It would probably be nice
+ * to integrate a paginator as well to as to allow the user to move an
+ * item in large distances and to insert an item in the middle. Right
+ * now, when you add an item it is just placed at the end. However,
+ * if you want the item to appear in the middle then you must hit the
+ * "up" arrow n/2 times where n is the number of items in the list.
+ * This clearly is not a good setup.
+ *
+ * @author Yannick Bülter
+ * @author Randy Graebner (randyg@alum.mit.edu)
+ * @version $Id: SortableCategoryList.java 1942 2009-05-29 07:53:23Z terry $
+ */
+abstract class SortableCategoryList extends SortableList {
+
+ private static final Logger s_log = Logger.getLogger
+ (SortableCategoryList.class);
+
+ public final static String CHILDREN = "ch";
+
+ private final CategoryRequestLocal m_parent;
+
+ /**
+ * This just makes a standard
+ * {@link SortableList}
+ */
+ public SortableCategoryList(final CategoryRequestLocal parent) {
+ super(new ParameterSingleSelectionModel
+ (new BigDecimalParameter(CHILDREN)), false);
+
+ m_parent = parent;
+
+ setIdAttr("categorized_objects_list");
+ }
+
+ protected final Category getCategory(final PageState state) {
+ return m_parent.getCategory(state);
+ }
+
+ /**
+ * This actually performs the sorting
+ */
+ public void respond(PageState ps) throws ServletException {
+ String event = ps.getControlEventName();
+ /* TODO Do actual sorting
+ if (NEXT_EVENT.equals(event) || PREV_EVENT.equals(event)) {
+ try {
+ ACSObject child =
+ (ACSObject)DomainObjectFactory.newInstance
+ (new OID(ACSObject.BASE_DATA_OBJECT_TYPE,
+ new BigDecimal(ps.getControlEventValue())));
+ Category parent = m_parent.getCategory(ps);
+
+ if (CMS.getContext().getSecurityManager().canAccess
+ (SecurityManager.CATEGORY_ADMIN)) {
+ if (NEXT_EVENT.equals(event)) {
+ parent.swapWithNext(child);
+ } else {
+ parent.swapWithPrevious(child);
+ }
+
+ parent.save();
+ }
+ } catch (DataObjectNotFoundException e) {
+ s_log.error("Trying to create categories with state = " + ps, e);
+ throw new ServletException(e);
+ }
+ } else {
+ super.respond(ps);
+ }*/
+ }
+}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/category/SubcategoryList.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/category/SubcategoryList.java
new file mode 100755
index 000000000..5f2ea504d
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/category/SubcategoryList.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+package com.arsdigita.cms.ui.category;
+
+import com.arsdigita.bebop.Label;
+import com.arsdigita.bebop.List;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.SingleSelectionModel;
+import com.arsdigita.bebop.event.ActionEvent;
+import com.arsdigita.bebop.event.ActionListener;
+import com.arsdigita.bebop.list.ListModel;
+import com.arsdigita.bebop.list.ListModelBuilder;
+import com.arsdigita.bebop.util.GlobalizationUtil;
+import com.arsdigita.util.LockableImpl;
+import org.libreccm.categorization.Category;
+
+import java.util.Collection;
+
+/**
+ * A List of all subcategories of the current category.
+ *
+ * @author Stanislav Freidin (stas@arsdigita.com)
+ * @author Michael Pih (pihman@arsdigita.com)
+ * @version $Revision: #15 $ $DateTime: 2004/08/17 23:15:09 $
+ */
+public class SubcategoryList extends SortableCategoryList {
+ private final CategoryRequestLocal m_parent;
+ private final SingleSelectionModel m_model;
+
+ public SubcategoryList(final CategoryRequestLocal parent,
+ final SingleSelectionModel model) {
+ super(parent);
+
+ m_parent = parent;
+ m_model = model;
+
+ setIdAttr("subcategories_list");
+
+ setModelBuilder(new SubcategoryModelBuilder());
+
+ // Select the category in the main tree when the
+ // user selects it here
+ addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent event) {
+ final PageState state = event.getPageState();
+ final String id = (String) getSelectedKey(state);
+
+ if (id != null) {
+ m_model.setSelectedKey(state, id);
+ }
+ }
+ });
+
+ Label label = new Label(GlobalizationUtil.globalize
+ ("cms.ui.category.subcategory.none"));
+ label.setFontWeight(Label.ITALIC);
+ setEmptyView(label);
+ }
+
+ private class SubcategoryModelBuilder extends LockableImpl
+ implements ListModelBuilder {
+ public ListModel makeModel(List list, PageState state) {
+ final Category category = m_parent.getCategory(state);
+
+ if (category != null && !category.getSubCategories().isEmpty()) {
+ Collection children = category.getSubCategories();
+ //String order = ContentSection.getConfig().getCategoryTreeOrder(); TODO Sorting?
+ //order = Category.SORT_KEY.equals(order) ? "link." + order : order;
+ //children.addOrder(order);
+ // children.addOrder("link." + Category.SORT_KEY);
+ return new CategoryCollectionListModel(children);
+ } else {
+ return List.EMPTY_MODEL;
+ }
+ }
+ }
+}