diff --git a/cms/includes/class.input.helper.php b/cms/includes/class.input.helper.php
index f4c8c04..4526bc6 100644
--- a/cms/includes/class.input.helper.php
+++ b/cms/includes/class.input.helper.php
@@ -144,8 +144,7 @@ class cHTMLInputSelectElement extends cHTMLSelectElement {
      *
      * @return int		Number of items added
      * */
-    function addCategories($iMaxLevel = 0, $bColored = false, $bCatVisible = true, $bCatPublic = true,
-            $bWithArt = false, $bArtOnline = true) {
+    function addCategories($iMaxLevel = 0, $bColored = false, $bCatVisible = true, $bCatPublic = true, $bWithArt = false, $bArtOnline = true) {
         global $cfg, $client, $lang;
 
         $oDB = new DB_Contenido;
@@ -259,27 +258,18 @@ class cHTMLInputSelectElement extends cHTMLSelectElement {
         }
     }
 
-    /**
-     * Selects specified elements as selected
-     *
-     * @param array		$aElements Array with "values" of the cHTMLOptionElement to set
-     *
-     * @return none
-     */
-    function setSelected($aElements) {
-        if (is_array($this->_options) && is_array($aElements)) {
-            foreach ($this->_options as $sKey => $oOption) {
-                if (in_array($oOption->getAttribute("value"), $aElements)) {
-                    $oOption->setSelected(true);
-                    $this->_options[$sKey] = $oOption;
-                } else {
-                    $oOption->setSelected(false);
-                    $this->_options[$sKey] = $oOption;
-                }
-            }
-        }
+    public function addFiles($sPath) {
+        $iCount = 0;
+        $aFiles = cDirHandler::read($sPath);
+        asort($aFiles);
+        $iCounter = count($this->_options);
+        foreach ($aFiles as $sValue) {
+            $oOption = new cHTMLOptionElement($sValue, $sValue);            
+            $this->addOptionElement($iCounter, $oOption);
+            $iCounter++;
+        }        
+        return count($aFiles);
     }
-
 }
 
 class UI_Config_Table {
@@ -302,16 +292,24 @@ class UI_Config_Table {
     var $_sColorLight;
     var $_sColorDark;
 
+    /**
+     * 
+     * @var type
+     */
+    protected $_iRowCnt = 0;
+
     function __construct() {
-        global $cfg;
+        $cfg = cRegistry::getConfig();
 
         $this->_sPadding = 2;
         $this->_sBorder = 0;
-        $this->_sBorderColor = $cfg['color']['table_border'];
-        $this->_sTplCellCode = '        
{CONTENT}' . "\n";
+        $this->_sBorderColor = cRegistry::getConfigValue('color', 'table_border');
+        $this->_sTplCellCode = ' | ' . "\n"
+                . '{CONTENT}' . "\n"
+                . '' . "\n";
         $this->_sTplTableFile = $cfg['path']['contenido'] . $cfg['path']['templates'] . $cfg['templates']['generic_list'];
-        $this->_sColorLight = $cfg['color']['table_light'];
-        $this->_sColorDark = $cfg['color']['table_dark'];
+        $this->_sColorLight = cRegistry::getConfigValue('color', 'table_light');
+        $this->_sColorDark = cRegistry::getConfigValue('color', 'table_dark');
     }
 
     function setCellTemplate($sCode) {
@@ -417,8 +415,37 @@ class UI_Config_Table {
         return $sSkript;
     }
 
-    function render($bPrint = false) {
-        $oTable = new Template;
+    /**
+     * increase row counter
+     */
+    public function nextRow() {
+        $this->_iRowCnt++;
+    }
+    
+    /**
+     * get current row count
+     * 
+     * @return int row count
+     */
+    public function getRowCount() : int {
+        return $this->_iRowCnt;
+    }
+
+    public function setRowCell(int $iCell, $mContent) {
+        $this->setCell($this->_iRowCnt, $iCell, $mContent);
+    }
+
+    public function setRowBorder(string $sWhich = 'bottom') {
+        $sStyle = '';
+        switch ($sWhich) {
+            case 'bottom':
+                $this->setRowExtra($this->_iRowCnt, 'border-bottom: 1px solid silver;');
+                break;
+        }
+    }
+
+    public function render($bPrint = false) {
+        $oTable = new Template();
         $oTable->reset();
 
         $oTable->set('s', 'CELLPADDING', $this->_sPadding);
@@ -437,6 +464,8 @@ class UI_Config_Table {
                 $iCount = 0;
 
                 foreach ($aCells as $sCell => $sData) {
+                    $sData = $this->_processContentData($sData);
+
                     $iCount++;
                     $sTplCell = $this->_sTplCellCode;
 
@@ -525,4 +554,57 @@ class UI_Config_Table {
         }
     }
 
-}
\ No newline at end of file
+    /**
+     * returns different types of content data as string
+     * you can use 
+     * - string
+     * - object, needs to have a render method
+     * - array of objects and/or strings
+     * 
+     * @author Ortwin Pinke
+     * @since 2.3.0
+     * 
+     * 
+     * @param mixed $mData
+     * @return string
+     */
+    protected function _processContentData($mData): string {
+        if (is_string($mData)) {
+            return $mData;
+        }
+
+        $sData = '';
+
+        if (is_array($mData) && count($mData) > 0) {
+            foreach ($mData as $mElement) {
+                if (is_string($mElement)) {
+                    $sData .= $mElement;
+                    continue;
+                }
+                $sData .= $this->_renderObject($mElement);
+            }
+        } else {
+            $sData = $this->_renderObject($mData);
+        }
+
+        return $sData;
+    }
+
+    /**
+     * Renders an object using its render method
+     * 
+     * @author Ortwin Pinke 
+     * @since 2.3.0
+     * 
+     * @param type $oObject
+     * @return string rendered string from object | empty string
+     */
+    protected function _renderObject($oObject): string {
+        $sReturn = '';
+        if (is_object($oObject) && method_exists($oObject, 'render')) {
+            $sReturn = $oObject->render();
+        }
+        return $sReturn;
+    }
+
+} |