diff --git a/config/inc_roles.php b/config/inc_roles.php
index 54e159ac5a00399c0a929e0488113fd49361409a..6970cab1ffc407e14ac5c06817a97f24162dff74 100644
--- a/config/inc_roles.php
+++ b/config/inc_roles.php
@@ -42,6 +42,7 @@ return array(
         "page_cleanup",
         "page_delete",
         "page_deploy",
+        "page_htmltest",
         "page_phase",
         "page_setup",
         
diff --git a/public_html/deployment/classes/htmlguielements.class.php b/public_html/deployment/classes/htmlguielements.class.php
new file mode 100644
index 0000000000000000000000000000000000000000..8c9e7afe99eee9f33b78b2b3a41207d762c47acf
--- /dev/null
+++ b/public_html/deployment/classes/htmlguielements.class.php
@@ -0,0 +1,273 @@
+<?php
+/**
+ * html gui elements
+ * for bootstrap
+ * see http://dev.ci.iml.unibe.ch:8002/deployment/all/htmltest/
+ *
+ * $oHtml=new htmlguielements();
+ * 
+ * echo $oHtml->getBox('error', 'errormessage');
+ * echo $oHtml->getIcon('fa-pencil');
+ * 
+ * echo $oHtml->getLink(array(
+ *     'href'=>'https://www.axel-hahn.de',
+ *     'class'=>'btn btn-primary',
+ *     'icon'=>'fa-close',
+ *     'label'=>'linked text',
+ * ));
+ * 
+ * echo $oHtml->getTabs(
+ *     array(
+ *         'tab 1'=>'Inhalt #1',
+ *         'tab 2'=>'Inhalt #2',
+ *     )
+ * );
+ * 
+ * 
+ * @author hahn
+ */
+class htmlguielements{
+    
+    var $aCfg=array(
+        'buttons'=>array(
+            // bootstrap defaults
+            'primary'=>array('class'=>'btn-primary', 'icon'=>''),
+            'success'=>array('class'=>'btn-success', 'icon'=>''),
+            'info'=>array('class'=>'btn-info', 'icon'=>''),
+            'warning'=>array('class'=>'btn-warning', 'icon'=>''),
+            'danger'=>array('class'=>'btn-danger', 'icon'=>''),
+
+            // custom buttons
+            'close'=>array('class'=>'btn-danger', 'icon'=>'fa-close'),
+            'error'=>array('class'=>'btn-danger', 'icon'=>'fa-bolt'),
+            'ok'=>array('class'=>'btn-primary', 'icon'=>'fa-check'),
+            
+            // deploy actions and buttons
+            'accept'=>array('class'=>'', 'icon'=>'glyphicon-forward'),
+            'build'=>array('class'=>'', 'icon'=>'glyphicon-equalizer'),
+            'cleanup'=>array('class'=>'', 'icon'=>'glyphicon-chevron-right'),
+            'deploy'=>array('class'=>'', 'icon'=>'glyphicon-forward'),
+            'new'=>array('class'=>'', 'icon'=>'glyphicon-star-empty'),
+            'overview'=>array('class'=>'', 'icon'=>'glyphicon-book'),
+            'phase'=>array('class'=>'', 'icon'=>'glyphicon-chevron-right'),
+            'rollback'=>array('class'=>'', 'icon'=>'glyphicon-forward'),
+            'setup'=>array('class'=>'', 'icon'=>'glyphicon-cog'),
+            
+        ),
+        'icons'=>array(
+            'branch'=>'glyphicon-bookmark',
+            'calendar'=>'glyphicon-calendar',
+            'comment'=>'glyphicon-comment',
+            'revision'=>'glyphicon-tag',
+        ),
+    );
+    
+    public function __construct() {
+        return true;
+    }
+    
+    // ----------------------------------------------------------------------
+    // helper function
+    // ----------------------------------------------------------------------
+    
+    /**
+     * add an html attribute if the attribute exists as a key
+     * @param string  $sAttribute  html attribute to add
+     * @param string  $aData       item array
+     * @param string  $sDefault    use default if key does not exists
+     * @return string
+     */
+    public function addAttributeFromKey($sAttribute, $aData, $sDefault=''){
+        return (array_key_exists($sAttribute, $aData) 
+                ? $this->addAttribute($sAttribute, $aData[$sAttribute])
+                : $this->addAttribute($sAttribute, $sDefault)
+                );
+    }
+    
+    /**
+     * add an html attribute if value is not empty
+     * @param string  $sAttribute  html attribute to add
+     * @param string  $sValue      value of attribute
+     * @return string
+     */
+    public function addAttribute($sAttribute, $sValue){
+        return ($sValue ? ' '.$sAttribute.'="'.$sValue.'"' : '' );
+    }
+    
+    // ----------------------------------------------------------------------
+    // low level
+    // ----------------------------------------------------------------------
+    
+    /**
+     * get html code for icon; glypphicons and font-awesome is supported
+     * 
+     * @param string $sLabel  label of icon
+     * @return string
+     */
+    public function getIcon($sLabel){
+        if(!$sLabel){
+            return '';
+        }
+        $sPrefix=(
+                strpos($sLabel, 'glyphicon-')===0 ? 'glyphicon' 
+                : ( strpos($sLabel, 'fa-')===0 ? 'fa' : '')
+                );
+        if(!$sPrefix){
+            return '';
+        }
+        return '<i'.$this->addAttribute('class', ($sPrefix ? $sPrefix . ' ' : '').$sLabel).'></i> ';
+    }
+    
+    /**
+     * get a default icon from config
+     * @param string  $sType  icon type
+     * @return array 
+     */
+    public function getIconByType($sType){
+        return (array_key_exists($sType, $this->aCfg['icons'])
+            ? $this->getIcon($this->aCfg['icons'][$sType])
+            : ''
+        );
+    }
+
+    /**
+     * get html code for icon; glypphicons and font-awesome is supported
+     * 
+     * @param array $aItem  array with link attributes; href for target; "label" and "icon" 
+     * @return string
+     */
+    public function getLink($aItem){
+        
+        $sHref=$this->addAttributeFromKey('href', $aItem, '#');
+        $sLabel=(array_key_exists('icon', $aItem) ? $this->getIcon($aItem['icon']): '')
+            .(array_key_exists('label', $aItem) ? $aItem['label'] : '');
+        
+        foreach(array('href', 'icon', 'label') as $sKey){
+            if (array_key_exists($sKey, $aItem)){
+                unset($aItem[$sKey]);
+            }
+        }
+        
+        $sReturn='<a'.$sHref;
+        foreach (array_keys($aItem) as $sKey){
+            $sReturn.=$this->addAttributeFromKey($sKey, $aItem);
+        }
+        $sReturn.='>'
+                .$sLabel
+                .'</a>';
+        return $sReturn;
+    }
+    
+    /**
+     * add default css classes and colors based on $aItem['type']
+     * @param array  $aItem
+     * @return array 
+     */
+    protected function _getButtonattributesByType($aItem){
+        $aReturn=$aItem;
+        if (array_key_exists($aItem['type'], $this->aCfg['buttons'])){
+            $sClass=$this->aCfg['buttons'][$aItem['type']]['class'];
+            $aReturn['class'].=$sClass ? ' '.$sClass : '';
+            $aReturn['icon']=$aReturn['icon'] ? $aReturn['icon'] : $this->aCfg['buttons'][$aItem['type']]['icon'];
+        }
+        return $aReturn;
+    }
+
+
+    /**
+     * get html code for icon; glypphicons and font-awesome is supported
+     * 
+     * @param array $aItem  array with link attributes; href for target; "label" and "icon" 
+     * @return string
+     */
+    public function getLinkButton($aItem){
+        foreach(array('class', 'icon') as $sKey){
+            if (!array_key_exists($sKey, $aItem)){
+                $aItem[$sKey]='';
+            }
+        }
+        $aItem['class'].='btn btn-default';
+        
+        if (array_key_exists('type', $aItem)){
+            $aItem=$this->_getButtonattributesByType($aItem);
+            unset($aItem['type']);
+        }
+        
+        return $this->getLink($aItem);
+    }
+
+    // ----------------------------------------------------------------------
+    // gui elements
+    // ----------------------------------------------------------------------
+
+    /**
+     * get html code of a div around a message
+     * @param string $sWarnlevel one of error|success|info|warning to get a colored box
+     * @param string $sMessage   message text
+     * @return string
+     */
+    public function getBox($sWarnlevel, $sMessage) {
+        $aCfg = array(
+            "error" => array("class" => "alert alert-danger", "prefix" => t("error")),
+            "success" => array("class" => "alert alert-success", "prefix" => t("success")),
+            "info" => array("class" => "alert alert-info", "prefix" => t("info")),
+            "warning" => array("class" => "alert alert-warning", "prefix" => t("warning")),
+        );
+        $sClass = "";
+        $sPrefix = "";
+        if (array_key_exists($sWarnlevel, $aCfg)) {
+            $sClass = $aCfg[$sWarnlevel]["class"];
+            $sPrefix = $aCfg[$sWarnlevel]["prefix"];
+            $sMessage = '<strong>' . $aCfg[$sWarnlevel]["prefix"] . '</strong> ' . $sMessage;
+        }
+        return '<div'.$this->addAttribute('class', $sClass).'>' . $sMessage . '</div>';
+    }
+    
+    /**
+     * get html code for tabs with content
+     * 
+     * @staticvar int $iCounter  internal counter for tabs ans content
+     * @param array  $aTabData  tab data; key is the tab label; value the content of its tab
+     * @return string
+     */
+    public function getNav($aTabData){
+        $sTabs='';
+        $sContent='';
+        
+        static $iCounter=0;
+        $iTab=0;
+        
+        if (!is_array($aTabData) || !count($aTabData)){
+            return false;
+        }
+        $sNavType=$aTabData['options']['type']; // "tabs" or "pills"
+        $sNavCss='nav nav-'.$sNavType;
+        if (array_key_exists('stacked', $aTabData['options']) && $aTabData['options']['stacked']){
+            $sNavCss.=' nav-stacked';
+        }
+        if (array_key_exists('justified', $aTabData['options']) && $aTabData['options']['justified']){
+            $sNavCss.=' nav-justified';
+        }
+        $sNavType=$aTabData['options']['justified'];
+        foreach ($aTabData['tabs'] as  $sTabLabel=>$sTabContent){
+            $iCounter++;
+            $iTab++;
+            $sId="tab${iCounter}";
+            $sTabs.= ($iTab==1 ?  '<li class="active"' : '<li')
+                . ' role="presentation">'
+                . '<a href="#'.$sId.'" data-toggle="tab">' . $sTabLabel . '</a></li>'
+                ;
+            $sContent.='<div class="tab-pane'
+                    .($iTab==1 ?  ' active' : '')
+                    .'" id="'.$sId.'">'
+                    .$sTabContent
+                    .'</div>'
+                    ;
+        }
+        return '<div class="tabbable">'
+                . '<ul class="'.$sNavCss.'">'. $sTabs.'</ul>'
+                . '<div class="tab-content">'.$sContent.'</div>'
+                . '</div>';
+    }
+        
+}
diff --git a/public_html/deployment/classes/project.class.php b/public_html/deployment/classes/project.class.php
index 5e4827db7f31053895f03b5953809ac126636949..8699f44a5b54e89ec526a570b1b1efd2ac46e0ac 100644
--- a/public_html/deployment/classes/project.class.php
+++ b/public_html/deployment/classes/project.class.php
@@ -1,6 +1,7 @@
 <?php
 
 require_once 'base.class.php';
+require_once 'htmlguielements.class.php';
 
 /* ######################################################################
 
@@ -1372,32 +1373,6 @@ class project extends base {
         return file_exists($this->_sProcessTempOut);
     }
 
-    /**
-     * get html code of a div around a message
-     * @param string $sWarnlevel one of error|success|info|warning to get a colored box
-     * @param string $sMessage   message txt
-     * @return string
-     */
-    public function getBox($sWarnlevel, $sMessage) {
-        $this->log(__FUNCTION__ . " start");
-        $aCfg = array(
-            "error" => array("class" => "alert alert-danger", "prefix" => t("error")),
-            "success" => array("class" => "alert alert-success", "prefix" => t("success")),
-            "info" => array("class" => "alert alert-info", "prefix" => t("info")),
-            "warning" => array("class" => "alert alert-warning", "prefix" => t("warning")),
-        );
-        $sClass = "";
-        $sPrefix = "";
-        if (array_key_exists($sWarnlevel, $aCfg)) {
-            $sClass = $aCfg[$sWarnlevel]["class"];
-            $sPrefix = $aCfg[$sWarnlevel]["prefix"];
-            $sMessage = '<strong>' . $aCfg[$sWarnlevel]["prefix"] . '</strong> ' . $sMessage;
-        }
-        return '
-            <div class="' . $sClass . '">
-                ' . $sMessage . '
-            </div>';
-    }
 
     /**
      * get the name of the current branch (or default branch)
@@ -1429,6 +1404,7 @@ class project extends base {
         }
         global $aParams;
         $sReturn = false;
+        $oHtml=new htmlguielements();
 
         $aActionList = array(
             'iActive' => 0,
@@ -1468,7 +1444,7 @@ class project extends base {
         if (!$this->_oVcs) {
             $sError = sprintf(t('class-project-error-build-type-not-supported'), $this->_aPrjConfig["build"]["type"]);
             $this->_logaction($sError, __FUNCTION__, "error");
-            return $this->getBox("error", $sError . $sReturn);
+            return $oHtml->getBox("error", $sError . $sReturn);
         }
 
         // --------------------------------------------------
@@ -1491,7 +1467,7 @@ class project extends base {
             $this->_TempDelete();
             $sError = sprintf(t('"class-project-error-build-dir-was-not-created"'), $sTempDir);
             $this->_logaction($sError, __FUNCTION__, "error");
-            return $this->getBox("error", $sError . $sReturn);
+            return $oHtml->getBox("error", $sError . $sReturn);
         }
         // $this->_iRcAll = 0;
         $aActionList['iActive'] ++;
@@ -1509,7 +1485,7 @@ class project extends base {
         $sCommitMsg = $aVersion["message"];
         $sCommitMsg = str_replace("\n", "<br>", $sCommitMsg);
         $sCommitMsg = str_replace('"', "&quot;", $sCommitMsg);
-        $sReturn.=$this->getBox("info", $sCommitMsg);
+        $sReturn.=$oHtml->getBox("info", $sCommitMsg);
 
         $sReturn.=$this->_execAndSend("ls -lisa $sTempDir");
 
@@ -1517,7 +1493,7 @@ class project extends base {
             $this->_TempDelete();
             $sError = sprintf(t('class-project-error-command-failed'), $sTempDir) . $sReturn;
             $this->_logaction($sError, __FUNCTION__, "error");
-            return $this->getBox("error", $sError);
+            return $oHtml->getBox("error", $sError);
         }
 
         // --------------------------------------------------
@@ -1527,7 +1503,7 @@ class project extends base {
             $sReturn.=$this->_execAndSend('ls -l ' . $filename);
         }
         
-        $sReturn.=$this->getBox("success", t('class-project-info-build-checkout-ok'));
+        $sReturn.=$oHtml->getBox("success", t('class-project-info-build-checkout-ok'));
         $aActionList['iActive'] ++;
         $this->_TempFill($sReturn, $aActionList);
 
@@ -1545,7 +1521,7 @@ class project extends base {
                 $sError = sprintf(t('class-project-error-command-failed'), $sTempDir);
                 $this->_logaction($sError, __FUNCTION__, "error");
                 $this->_TempDelete();
-                return $this->getBox("error", $sError . $sReturn);
+                return $oHtml->getBox("error", $sError . $sReturn);
             }
         } else {
             $sReturn.=t('skip') . '<br>';
@@ -1581,7 +1557,7 @@ class project extends base {
                 $this->_TempDelete();
                 $sError = sprintf(t('class-project-error-command-failed'), $sTempDir) . $sReturn;
                 $this->_logaction($sError, __FUNCTION__, "error");
-                return $this->getBox("error", $sError);
+                return $oHtml->getBox("error", $sError);
             }
         } else {
             $sReturn.=t('skip') . '<br>';
@@ -1624,16 +1600,16 @@ class project extends base {
             $this->_TempDelete();
             $sError = t('class-project-error-build-docroot-not-found');
             $this->_logaction($sError, __FUNCTION__, "error");
-            return $this->getBox("error", $sError . $sReturn);
+            return $oHtml->getBox("error", $sError . $sReturn);
         }
 
         if (!$this->_iRcAll == 0) {
             $this->_TempDelete();
             $sError = sprintf(t('class-project-error-command-failed'), $sTempDir) . $sReturn;
             $this->_logaction($sError, __FUNCTION__, "error");
-            return $this->getBox("error", $sError);
+            return $oHtml->getBox("error", $sError);
         }
-        // $sReturn.=$this->getBox("success", "preparations ok - directory is ready for packaging now.");
+        // $sReturn.=$oHtml->getBox("success", "preparations ok - directory is ready for packaging now.");
         // generate info file
         $sTs = date("Y-m-d H:i:s");
         $sTs2 = date("Ymd_His");
@@ -1679,7 +1655,7 @@ class project extends base {
             $this->_TempDelete();
             $sError = sprintf(t('"class-project-error-build-dir-was-not-created"'), $sTempDir);
             $this->_logaction($sError, __FUNCTION__, "error");
-            return $this->getBox("error", $sError . $sReturn);
+            return $oHtml->getBox("error", $sError . $sReturn);
         }
         $this->_TempFill($sReturn, $aActionList);
 
@@ -1710,7 +1686,7 @@ class project extends base {
             $this->_TempDelete();
             $sError = t('class-project-error-build-docroot-not-found');
             $this->_logaction($sError, __FUNCTION__, "error");
-            return $this->getBox("error", $sError . $sReturn);
+            return $oHtml->getBox("error", $sError . $sReturn);
         }
         $aActionList['iActive'] ++;
         $this->_TempFill($sReturn, $aActionList);
@@ -1722,7 +1698,7 @@ class project extends base {
 
         $sInfo = t("class-project-info-build-successful");
         $this->_logaction(t('finished') . ' ' . $sInfo, __FUNCTION__, "success");
-        $sReturn.=$this->getBox("success", $sInfo);
+        $sReturn.=$oHtml->getBox("success", $sInfo);
         $aActionList['iActive'] ++;
         $this->_TempFill($sReturn, $aActionList);
 
@@ -1754,11 +1730,12 @@ class project extends base {
         $this->_logaction(t('starting') . " queue($sPhase, $sVersion)", __FUNCTION__);
         $sReturn = "<h2> " . t("queue") . " " . $this->getLabel() . " :: $sPhase</h2>";
         $this->_TempFill($sReturn, $aActionList);
+        $oHtml=new htmlguielements();
 
         if (!$this->isActivePhase($sPhase)) {
             $sError = sprintf(t("class-project-warning-phase-not-active"), $sPhase);
             $this->_logaction($sError, __FUNCTION__, "error");
-            return $this->getBox("error", $sError . $sReturn);
+            return $oHtml->getBox("error", $sError . $sReturn);
         }
 
         $sPlace = "onhold";
@@ -1807,10 +1784,10 @@ class project extends base {
             $this->_TempDelete();
             $sError = t("class-project-error-command-failed");
             $this->_logaction($sError, __FUNCTION__, "error");
-            return $this->getBox("error", $sError . $sReturn);
+            return $oHtml->getBox("error", $sError . $sReturn);
         }
         $this->_logaction(t('finished') . " queue($sPhase, $sVersion) " . t("class-project-info-queue-successful"), __FUNCTION__);
-        $sReturn.=$this->getBox("success", t("class-project-info-queue-successful"));
+        $sReturn.=$oHtml->getBox("success", t("class-project-info-queue-successful"));
         $sReturn.=$this->deploy($sPhase);
         $this->_TempDelete();
 
@@ -1826,6 +1803,7 @@ class project extends base {
      * @return boolean|string
      */
     public function deploy($sPhase, $bIgnoreDeploytimes = false) {
+        $oHtml=new htmlguielements();
         $this->log(__FUNCTION__ . " start");
         if (!$this->oUser->hasPermission("project-action-deploy")
             && !$this->oUser->hasPermission("project-action-deploy-$sPhase")
@@ -1848,7 +1826,7 @@ class project extends base {
         if (!$this->isActivePhase($sPhase)) {
             $sError = sprintf(t("class-project-warning-phase-not-active"), $sPhase);
             $this->_logaction($sError, __FUNCTION__, "error");
-            return $sReturn . $this->getBox("error", $sError);
+            return $sReturn . $oHtml->getBox("error", $sError);
         }
 
         $sQueueLink = $this->_getFileBase($sPhase, "onhold");
@@ -1880,7 +1858,7 @@ class project extends base {
                 if (!$bIgnoreDeploytimes) {
                     $sError = t("class-project-info-deploy-time-not-reached");
                     // $this->_logaction($sError, __FUNCTION__);
-                    $sReturn.=$this->getBox("info", $sError);
+                    $sReturn.=$oHtml->getBox("info", $sError);
                     $this->_TempDelete();
                     return $sReturn;
                 } else {
@@ -1895,7 +1873,7 @@ class project extends base {
         if (!file_exists($sQueueLink)) {
             $sError = sprintf(t("class-project-info-deploy-nothing-in-queue"), $sQueueLink);
             $this->_logaction($sError, __FUNCTION__, "error");
-            $sReturn.=$this->getBox("info", $sError);
+            $sReturn.=$oHtml->getBox("info", $sError);
             $this->_TempDelete();
             return $sReturn;
         }
@@ -1921,7 +1899,7 @@ class project extends base {
             $this->_TempDelete();
             $sError = t("class-project-error-command-failed");
             $this->_logaction($sError, __FUNCTION__, "error");
-            $sReturn.=$this->getBox("error", $sError . $sReturn);
+            $sReturn.=$oHtml->getBox("error", $sError . $sReturn);
             return $sReturn;
         }
 
@@ -2009,7 +1987,7 @@ class project extends base {
         $this->_TempFill($sReturn, $aActionList);
 
         $sReturn.="<br>";
-        $sReturn.=$this->getBox("success", t("class-project-info-deploy-successful"));
+        $sReturn.=$oHtml->getBox("success", t("class-project-info-deploy-successful"));
         $this->_logaction(t('finished') . " deploy($sPhase, $bIgnoreDeploytimes) " . t("class-project-info-deploy-successful"), __FUNCTION__, "success");
         $this->_TempDelete();
         return $sReturn;
@@ -2022,6 +2000,7 @@ class project extends base {
      * @return type
      */
     public function accept($sPhase) {
+        $oHtml=new htmlguielements();
         $this->log(__FUNCTION__ . " start");
         if (!$this->oUser->hasPermission("project-action-accept")
             && !$this->oUser->hasPermission("project-action-accept-$sPhase")
@@ -2035,7 +2014,7 @@ class project extends base {
         if (!$this->canAcceptPhase($sPhase)) {
             $sError = sprintf(t("class-project-error-accept-impossible"), $sPhase);
             $this->_logaction($sError, __FUNCTION__, "error");
-            return $sReturn . $this->getBox("error", $sError);
+            return $sReturn . $oHtml->getBox("error", $sError);
         }
 
         $sReturn.="<h3>" . sprintf(t("class-project-info-accept-overview"), $sPhase) . "</h3>";
@@ -2046,7 +2025,7 @@ class project extends base {
 
 
         // $sReturn.='<pre>' . print_r($aInfos["deployed"], true) . '</pre>';
-        $sReturn.=$this->getBox("info", sprintf(t("class-project-info-accept-version-and-next-phase"), $sVersion, $sNext));
+        $sReturn.=$oHtml->getBox("info", sprintf(t("class-project-info-accept-version-and-next-phase"), $sVersion, $sNext));
         $this->_logaction(t('finished') . " accept($sPhase) " . sprintf(t("class-project-info-accept-version-and-next-phase"), $sVersion, $sNext), __FUNCTION__, "success");
         $sReturn.=$this->queue($sNext, $sVersion);
         $this->_TempFill($sReturn);
@@ -2068,18 +2047,20 @@ class project extends base {
         if (!$aData) {
             $aData = $_POST;
         }
-        if (!array_key_exists("id", $aData)) {
-            $this->_logaction(t('abortet') . " no id in \$_POST", __FUNCTION__, "error");
-            return false;
+        
+        foreach(array('id', 'label', 'description', 'contact', 'build', 'fileprefix', 'phases') as $sKey){
+            if (!array_key_exists($sKey, $aData)){
+                $this->_logaction(t('abortet') . " missing key $sKey in savedata", __FUNCTION__, "error");
+                return false;
+            }
         }
-        // if (!array_key_exists("setupaction", $_POST)) return false;
-
         $sId = $aData["id"];
 
         // remove unwanted items
         foreach (array("setupaction", "prj", "id") as $s) {
-            if (array_key_exists($s, $aData))
+            if (array_key_exists($s, $aData)){
                 unset($aData[$s]);
+            }
         }
 
         // save json file
@@ -2390,27 +2371,28 @@ class project extends base {
     public function renderLink($sFunction, $sPhase = false, $sVersion = false) {
         $sFirst = $this->getNextPhase();
         $sNext = $this->getNextPhase($sPhase);
+        $oHtml=new htmlguielements();
         $aLinkdata = array(
-            'default' => array('icon' => 'glyphicon glyphicon-forward', 'class' => ''),
-            'accept' => array('icon' => 'glyphicon glyphicon-forward', 'class' => $sNext,
+            'default' => array('class' => ''),
+            'accept' => array('class' => $sNext,
                 'hint' => sprintf(t("accept-hint"), $sPhase, $sNext),
                 'label' => t('accept'),
             ),
-            'build' => array('icon' => 'glyphicon glyphicon-equalizer', 'class' => $sFirst,
+            'build' => array('class' => $sFirst,
                 'hint' => sprintf(t("build-hint"), $sFirst),
                 'label' => t('build'),
                 'role' => 'buildProject'
             ),
-            'cleanup' => array('icon' => 'glyphicon glyphicon-chevron-right', 'class' => ''),
-            'deploy' => array('icon' => 'glyphicon glyphicon-forward', 'class' => $sPhase,
+            'cleanup' => array('class' => ''),
+            'deploy' => array('class' => $sPhase,
                 'hint' => sprintf(t("deploy-hint"), $sPhase),
                 'label' => t('deploy'),
             ),
-            'new' => array('icon' => 'glyphicon glyphicon-star-empty',
+            'new' => array(
                 'hint' => t("new-project-hint"),
                 'label' => t('new-project'),
             ),
-            'overview' => array('icon' => 'glyphicon glyphicon-book', 'class' => '',
+            'overview' => array('class' => '',
                 'hint' => t('menu-project-home') . ' [' . $this->getLabel() . ']',
                 'label' => $this->getLabel()
             ),
@@ -2418,11 +2400,11 @@ class project extends base {
                 'hint' => sprintf(t('phase-details-hint'), $sPhase),
                 'label' => t('phase-details')
             ),
-            'rollback' => array('icon' => 'glyphicon glyphicon-forward', 'class' => $sPhase,
+            'rollback' => array('class' => $sPhase,
                 'hint' => sprintf(t('rollback-hint'), $sPhase, $sVersion),
                 'label' => t('rollback')
             ),
-            'setup' => array('icon' => 'glyphicon glyphicon-cog', 'class' => $sPhase,
+            'setup' => array('class' => $sPhase,
                 'hint' => sprintf(t('setup-hint'), $sPhase, $sVersion),
                 'label' => t('setup')
             ),
@@ -2437,10 +2419,11 @@ class project extends base {
         // fuer wen ist der Link
         $sRole = '';
         $sOnMouseover = '';
+        $sOnMouseout = '';
         if ($sFunction == "build") {
             $sRole = 'developer';
-            $sOnMouseover = 'onmouseover="$(\'.' . $sNext . '.td' . $this->_aConfig["id"] . '\').addClass(\'highlight\');" 
-             onmouseout="$(\'.' . $sNext . '.td' . $this->_aConfig["id"] . '\').removeClass(\'highlight\');" ';
+            $sOnMouseover = '$(\'.' . $sNext . '.td' . $this->_aConfig["id"] . '\').addClass(\'highlight\');'; 
+            $sOnMouseout = '$(\'.' . $sNext . '.td' . $this->_aConfig["id"] . '\').removeClass(\'highlight\');';
         }
         if ($sFunction == "accept") {
             $sRole = 'developer';
@@ -2448,8 +2431,8 @@ class project extends base {
                 $sRole = 'pl';
                 // $aLinkdata[$sFunction]['icon']='glyphicon glyphicon-star';
             }
-            $sOnMouseover = 'onmouseover="$(\'.' . $sNext . '.td' . $this->_aConfig["id"] . '\').addClass(\'highlight\');" 
-             onmouseout="$(\'.' . $sNext . '.td' . $this->_aConfig["id"] . '\').removeClass(\'highlight\');" ';
+            $sOnMouseover = '$(\'.' . $sNext . '.td' . $this->_aConfig["id"] . '\').addClass(\'highlight\');'; 
+            $sOnMouseout ='$(\'.' . $sNext . '.td' . $this->_aConfig["id"] . '\').removeClass(\'highlight\');';
         }
 
         // $sClass = $sPhase;
@@ -2482,7 +2465,16 @@ class project extends base {
             return '<span title="no permission [project-action-'.$sFunction.'] for '.$this->oUser->getUsername().'">[ <i class="' . $sIconClass . '"></i> ' . $sLabel . ' ]</span>';
         }        
 
-        return '<a href="' . $sLink . '" ' . $sOnMouseover . ' title="' . $sHint . '" class="btn  btn-default ' . $sClass . '"><i class="' . $sIconClass . '"></i> ' . $sLabel . '</a>';
+        return $oHtml->getLinkButton(array(
+            'href'=>$sLink,
+            'title'=>$sHint,
+            'class'=>'btn btn-default ' . $sClass,
+            'type'=>$sFunction,
+            'onmouseover'=>$sOnMouseover,
+            'onmouseout'=>$sOnMouseout,
+            'label'=>$sLabel,
+        ));
+        // return '<a href="' . $sLink . '" ' . $sOnMouseover . ' title="' . $sHint . '" class="btn  btn-default ' . $sClass . '"><i class="' . $sIconClass . '"></i> ' . $sLabel . '</a>';
     }
 
     /**
@@ -2683,6 +2675,7 @@ class project extends base {
      * @return string
      */
     public function renderRepoInfo() {
+        $oHtml=new htmlguielements();
         $sReturn = "";
         switch ($this->_aPrjConfig["build"]["type"]) {
             case "git":
@@ -2694,14 +2687,14 @@ class project extends base {
                     $sReturn.= '<i class="glyphicon glyphicon-tag"></i> ' . t('revision') . ': ' . $aRepodata["revision"] . '<br>';
                     $sReturn.="<pre>" . strip_tags($aRepodata["message"], '<br>') . "</pre>";
                 } else {
-                    $sReturn .= $this->getBox("error", sprintf(t('class-project-error-no-repoaccess'), $aRepodata["error"]))
+                    $sReturn .= $oHtml->getBox("error", sprintf(t('class-project-error-no-repoaccess'), $aRepodata["error"]))
                             . $this->renderLink("setup") . '<br>';
                 }
 
                 break;
 
             default:
-                $sReturn .= $this->getBox("error", sprintf(t('class-project-error-wrong-buildtype'), $this->_aPrjConfig["build"]["type"]));
+                $sReturn .= $oHtml->getBox("error", sprintf(t('class-project-error-wrong-buildtype'), $this->_aPrjConfig["build"]["type"]));
         }
         if (array_key_exists("url", $this->_aPrjConfig["build"])) {
             $sReturn.=t('repository-url') . ': ' . $this->_aPrjConfig["build"]["url"] . '<br>';
@@ -2738,6 +2731,7 @@ class project extends base {
     public function renderInfoLink($aInfos, $aOptions = array()) {
         $sReturn = '';
         $bIsError = false;
+        $oHtml=new htmlguielements();
 
         $sInfos.='';
         if (array_key_exists("title", $aOptions) && $aOptions["title"]) {
@@ -2747,10 +2741,10 @@ class project extends base {
             $sLinktitle = t('infos');
             if (array_key_exists("message", $aInfos)) {
                 $sInfos.=$this->_getChecksumDiv($aInfos["revision"])
-                        . '<i class="glyphicon glyphicon-calendar"></i> ' . t('build-from') . ' ' . date("d.m.Y H:i:s", strtotime($aInfos["date"])) . '<br>'
-                        . '<i class="glyphicon glyphicon-bookmark"></i> ' . t('branch') . ': ' . $aInfos["branch"] . '<br>'
-                        . '<i class="glyphicon glyphicon-tag"></i> ' . t('revision') . ': ' . $this->_renderRevision($aInfos["revision"]) . '<br>'
-                        . '<i class="glyphicon glyphicon-comment"></i> ' . t('commitmessage') . ':<br><span class="pre">' . strip_tags($aInfos["message"], '<br>') . '</span>';
+                        . $oHtml->getIconByType('calendar') . t('build-from')    . ' '  . date("d.m.Y H:i:s", strtotime($aInfos["date"])) . '<br>'
+                        . $oHtml->getIconByType('branch')   . t('branch')        . ': ' . $aInfos["branch"] . '<br>'
+                        . $oHtml->getIconByType('revision') . t('revision')      . ': ' . $this->_renderRevision($aInfos["revision"]) . '<br>'
+                        . $oHtml->getIconByType('comment')  . t('commitmessage') . ':<br><span class="pre">' . strip_tags($aInfos["message"], '<br>') . '</span>';
                 if (array_key_exists("more", $aOptions)) {
                     $sInfos.=$aOptions["more"];
                 }
@@ -2771,7 +2765,7 @@ class project extends base {
 
         // render html
         $sId='info'.md5($sInfos);
-        $sReturn = '<a href="#" class="infoAsModal btn '.($bIsError ? 'btn-danger': 'btn-default').'" onclick="showIdAsModalMessage(\''.$sId.'\'); return false;">'
+        $sReturn = '<a href="#" class="btn '.($bIsError ? 'btn-danger': 'btn-default').'" onclick="showIdAsModalMessage(\''.$sId.'\'); return false;">'
                 // . '<i class="fa fa-info"></i> '
                 . $sLinktitle
                 . '</a><div id="'.$sId.'" style="display: none;" ';
@@ -2798,13 +2792,14 @@ class project extends base {
      * @return string
      */
     public function renderVersionUsage() {
+        $oHtml=new htmlguielements();
         $sReturn = false;
         $sRowHead1 = false;
         $sRowHead2 = '';
 
         $aAllVersions = $this->_getVersionUsage();
         if (!count($aAllVersions)) {
-            return $this->getBox("info", t('class-project-info-no-package'));
+            return $oHtml->getBox("info", t('class-project-info-no-package'));
         }
 
         foreach ($this->getActivePhases() as $sPhase) {
@@ -2958,7 +2953,7 @@ class project extends base {
         if (!$this->oUser->hasPermission("project-action-setup")){
             return $this->oUser->showDenied();
         }
-
+        $oHtml=new htmlguielements();
         $sMessages = '';
         require_once ("formgen.class.php");
         
@@ -2996,7 +2991,7 @@ class project extends base {
             $sRepoCheck = '<span class="ok">' . t('class-project-info-repoaccess') . '</span>';
         } else {
             $sRepoCheck = '<span class="error">' . sprintf(t('class-project-error-no-repoaccess'), $aRepodata["error"]) . '</span>';
-            $sMessages.=$this->getBox("error", sprintf(t('class-project-error-no-repoaccess'), $aRepodata["error"]));
+            $sMessages.=$oHtml->getBox("error", sprintf(t('class-project-error-no-repoaccess'), $aRepodata["error"]));
         }
 
         // generate datalist with exisating ssh keys for auth field
@@ -3356,7 +3351,7 @@ class project extends base {
                     } else {
                         $aForms["setup"]["form"]['input' . $i++] = array(
                             'type' => 'markup',
-                            'value' => '<br>'.$this->getBox("error", t("replacement-fields-not-found"))
+                            'value' => '<br>'.$oHtml->getBox("error", t("replacement-fields-not-found"))
                                 // . '<pre>'.print_r($aValues, 1).'</pre>'
                         );
                     }
diff --git a/public_html/deployment/index.php b/public_html/deployment/index.php
index 278ab3a2a3b4732cc85af8ad27f79167fa4222c9..3f6bd20487624ec856b9470e799ffc87fb561549 100644
--- a/public_html/deployment/index.php
+++ b/public_html/deployment/index.php
@@ -25,6 +25,8 @@ global $oCLog;
 $oCLog = new logger();
 $oCLog->enableDebugByIp($aConfig['showdebug']['ip']);
 require_once("./inc_functions.php");
+require_once("./classes/htmlguielements.class.php");
+$oHtml=new htmlguielements();
 
 $sPrj = "";
 $sAction = "overview";
diff --git a/public_html/deployment/pages/act_accept.php b/public_html/deployment/pages/act_accept.php
index 358f3891da5a1d125a618a1b7cdc7469117e8718..84e8c786807ace7c3e92697f47076787e3befe2b 100644
--- a/public_html/deployment/pages/act_accept.php
+++ b/public_html/deployment/pages/act_accept.php
@@ -24,7 +24,7 @@ if (array_key_exists("confirm", $aParams)) {
     $sOut.=$oPrj->accept($sPhase);
 } else {
     if (!$sPhase) {
-        $sOut.=$oPrj->getBox("error", t("error-no-phase"));
+        $sOut.=$oHtml->getBox("error", t("error-no-phase"));
     } else {
         if (!$oPrj->canAcceptPhase($sPhase)) {
             $sOut.= sprintf(t("page-accept-error-cannot-accept-phase"), $sPhase);
@@ -44,12 +44,12 @@ if (array_key_exists("confirm", $aParams)) {
             if (
                     array_key_exists("revision", $aPhaseData2["onhold"]) && $aPhaseData2["onhold"]["revision"] == $aPhaseData["deployed"]["revision"]
             ) {
-                $sOut.=$oPrj->getBox("warning", sprintf(t("page-accept-warning-version-exists-in-next-queue"), $sNext, $sPhase));
+                $sOut.=$oHtml->getBox("warning", sprintf(t("page-accept-warning-version-exists-in-next-queue"), $sNext, $sPhase));
             }
             if (
                     array_key_exists("revision", $aPhaseData2["ready2install"]) && $aPhaseData2["ready2install"]["revision"] == $aPhaseData["deployed"]["revision"]
             ) {
-                $sOut.=$oPrj->getBox("warning", sprintf(t("page-accept-warning-version-exists-in-next-repo"), $sNext, $sPhase));
+                $sOut.=$oHtml->getBox("warning", sprintf(t("page-accept-warning-version-exists-in-next-repo"), $sNext, $sPhase));
             }
             $sOut.='
                    <table>
diff --git a/public_html/deployment/pages/act_build.php b/public_html/deployment/pages/act_build.php
index 2292efe0e8cf9010e1442369c8fc227918e12d06..9fbeee728a192211fbdbf7502b53fbeaa5eb5ee0 100644
--- a/public_html/deployment/pages/act_build.php
+++ b/public_html/deployment/pages/act_build.php
@@ -45,12 +45,12 @@ if (!array_key_exists("confirm", $aParams)) {
         if (
                 array_key_exists("revision", $aPhaseData2["onhold"]) && $aPhaseData2["onhold"]["revision"] == $sRevison
         ) {
-            $sOut.=$oPrj->getBox("warning", "In der Queue von [$sNext] ist die Version bereits $sRevison vorhanden!");
+            $sOut.=$oHtml->getBox("warning", "In der Queue von [$sNext] ist die Version bereits $sRevison vorhanden!");
         }
         if (
                 array_key_exists("revision", $aPhaseData2["ready2install"]) && $aPhaseData2["ready2install"]["revision"] == $sRevison
         ) {
-            $sOut.=$oPrj->getBox("warning", "Im Repo von [$sNext] ist die Version $sRevison bereits vorhanden!");
+            $sOut.=$oHtml->getBox("warning", "Im Repo von [$sNext] ist die Version $sRevison bereits vorhanden!");
         }
     }
     $sOut.='
diff --git a/public_html/deployment/pages/act_delete.php b/public_html/deployment/pages/act_delete.php
index 28dae01c7ab6a403f5cb02962e57797e62d72891..8c19c0333e4da1615d2f5daafcbf6babff4c4dc8 100644
--- a/public_html/deployment/pages/act_delete.php
+++ b/public_html/deployment/pages/act_delete.php
@@ -93,9 +93,9 @@ if (!array_key_exists("confirm", $aParams)) {
     }
     $sErrors=$oPrj->delete($aOptions);
     if ($sErrors) {
-        $sOut.=$oPrj->getBox("error", t('page-delete-project-delete-failed') . $sErrors);
+        $sOut.=$oHtml->getBox("error", t('page-delete-project-delete-failed') . $sErrors);
     } else {
-        $sOut.=$oPrj->getBox("success", t('page-delete-project-delete-success'));
+        $sOut.=$oHtml->getBox("success", t('page-delete-project-delete-success'));
     }
 }
 
diff --git a/public_html/deployment/pages/act_deploy.php b/public_html/deployment/pages/act_deploy.php
index c4c1c80c8c33ceb5dce9ff31fd6aa076ea961267..7cce7be48fc7136ec62b93cd8762dcf437913b25 100644
--- a/public_html/deployment/pages/act_deploy.php
+++ b/public_html/deployment/pages/act_deploy.php
@@ -34,7 +34,7 @@ if (array_key_exists("confirm", $aParams)) {
 
         $aPhaseData = $oPrj->getPhaseInfos($sPhase);
         if (!array_key_exists('version', $aPhaseData['onhold'])){
-            $sOut.=$oPrj->getBox("error", 
+            $sOut.=$oHtml->getBox("error", 
                     sprintf(t("deploy-impossible"), $sPhase).'<br>'
                     . (array_key_exists('info', $aPhaseData['onhold']) ? $aPhaseData['onhold']['info'].'<br>' : '')
                     . (array_key_exists('warning', $aPhaseData['onhold']) ? $aPhaseData['onhold']['warning'].'<br>' : '')
@@ -86,7 +86,7 @@ if (array_key_exists("confirm", $aParams)) {
             $sOut .= $oForm->renderHtml("deploy");
         }
     } else {
-        $sOut.=$oPrj->getBox("error", t("error-no-phase"));
+        $sOut.=$oHtml->getBox("error", t("error-no-phase"));
     }
 }
 
diff --git a/public_html/deployment/pages/act_doc.php b/public_html/deployment/pages/act_doc.php
index e00e63a8c9316a0710ae9d9a9cfeb859b046dfb9..040604c5afdf965eab34349b5a9f3684bafeef58 100644
--- a/public_html/deployment/pages/act_doc.php
+++ b/public_html/deployment/pages/act_doc.php
@@ -29,7 +29,7 @@ $sOut.= '<hr>';
 if (array_key_exists("par3", $aParams)) {
     $sClass = $aParams["par3"];
     if (!array_key_exists($sClass, $aClasses)) {
-        $sOut.= $oPrj->getBox("error", sprintf(t("page-doc-error-class-not-configured"), $sClass, __FILE__));
+        $sOut.= $oHtml->getBox("error", sprintf(t("page-doc-error-class-not-configured"), $sClass, __FILE__));
     } else {
         require_once("./classes/$sClass.class.php");
         $o = new classinfos($aClasses[$sClass]["name"]);
diff --git a/public_html/deployment/pages/act_htmltest.php b/public_html/deployment/pages/act_htmltest.php
new file mode 100644
index 0000000000000000000000000000000000000000..51ac13853360d4c169b5862836f018321b043d94
--- /dev/null
+++ b/public_html/deployment/pages/act_htmltest.php
@@ -0,0 +1,113 @@
+<?php
+
+/* ######################################################################
+
+  IML DEPLOYMENT
+
+  webgui - build a package
+
+  ---------------------------------------------------------------------
+  2014-11-14  Axel <axel.hahn@iml.unibe.ch>  selector for branches
+  2014-02-14  Axel <axel.hahn@iml.unibe.ch>  build was "ajaxified"
+  2013-11-08  Axel <axel.hahn@iml.unibe.ch>
+  ###################################################################### */
+
+require_once("./classes/project.class.php");
+
+
+/**
+ * helper: render html code for a table row
+ * @global htmlguielements $oHtml
+ * @param string   $sDescr  description
+ * @param string   $sCode   php code
+ * @return string
+ */
+function addHtmltestTest($sDescr, $sCode){
+    $oHtml=new htmlguielements();
+    $sOut='??';
+    eval("\$sOut=$sCode;");
+    
+    return '<tr>'
+    . '<td>'
+            .  $sDescr
+    . '</td>'
+    . '<td style="padding: 0 1em;"><pre>'
+            . htmlentities($sCode)
+    . '</pre></td>'
+    . '<td style="padding: 0 1em;">'
+            .$sOut
+    . '</td>'
+    . '<td style="padding: 0 1em;"><pre>'
+            .str_replace('&gt;', '&gt;<br>',htmlentities($sOut))
+    . '</pre></td>'
+    . '</tr>';
+}
+
+
+// ----------------------------------------------------------------------
+// MAIN
+// ----------------------------------------------------------------------
+
+$sRows=''        
+   .  addHtmltestTest("Box zeichnen - Fehler", "\$oHtml->getBox('error', 'errormessage')")
+   .  addHtmltestTest("Box zeichnen - Warnung", "\$oHtml->getBox('warning', 'Message')")
+   .  addHtmltestTest("Box zeichnen - Info", "\$oHtml->getBox('info', 'Message')")
+   .  addHtmltestTest("Box zeichnen - OK", "\$oHtml->getBox('success', 'Message')")
+        
+   .  addHtmltestTest("Icon - Fontawesome", "\$oHtml->getIcon('fa-close');")
+   .  addHtmltestTest("Icon - Glyphicon", "\$oHtml->getIcon('glyphicon-user');")
+
+   .  addHtmltestTest("Link", "\$oHtml->getLink(array(
+    'href'=>'https://www.axel-hahn.de/',
+    'icon'=>'fa-globe',
+    'label'=>'Axels Webseite',
+));")
+   .  addHtmltestTest("Link als Button", "\$oHtml->getLinkButton(array(
+    'href'=>'https://www.axel-hahn.de/',
+    'target'=>'_blank',
+    'icon'=>'fa-globe',
+    'label'=>'Axels Webseite',
+));")
+   .  addHtmltestTest("Link als Button mit Type OK", "\$oHtml->getLinkButton(array('type'=>'ok',));")
+   .  addHtmltestTest("Link als Button mit Type close", "\$oHtml->getLinkButton(array('type'=>'close',));")
+   .  addHtmltestTest("Link als Button mit Type error", "\$oHtml->getLinkButton(array('type'=>'error','label'=>'Fehler'));")
+
+   . addHtmltestTest("Tabs", "\$oHtml->getNav(
+    array(
+        'options' => array(
+            'type'=>'tabs',
+            'justified'=>1,
+        ),
+        'tabs' => array(
+            'tab 1'=>'Inhalt #1',
+            'tab 2'=>'Inhalt #2',
+        ),
+    )
+);")
+   . addHtmltestTest("Tabs", "\$oHtml->getNav(
+    array(
+        'options' => array(
+            'type'=>'pills',
+            'stacked'=>1,
+        ),
+        'tabs' => array(
+            'tab 1'=>'Inhalt #1',
+            'tab 2'=>'Inhalt #2',
+        ),
+    )
+);")
+;
+
+// ----------------------------------------------------------------------
+
+echo '<table><thead>'
+    . '<tr>'
+        . '<th>Beschreibung</th>'
+        . '<th>PHP-Code</th>'
+        . '<th>Ausgabe</th>'
+        . '<th>Ausgabe-Code</th>'
+    . '</tr>'
+. '</thead><tbody>'
+    .$sRows
+. '</tbody></table>'
+;
diff --git a/public_html/deployment/pages/act_overview.php b/public_html/deployment/pages/act_overview.php
index f40f6803816aaa2d03fabfe05167cbcfeb17476e..48ccb45ac70c8f4ef775d7f6f43a3a013e760f0c 100644
--- a/public_html/deployment/pages/act_overview.php
+++ b/public_html/deployment/pages/act_overview.php
@@ -83,7 +83,7 @@ if (!array_key_exists("prj", $aParams)) {
                                 . $oPrj->renderPhaseInfo()
                                 . $sPhaseTabs
                                 . $sPhaseDetails 
-                            : $oPrj->getBox("info", t("page-overview-no-phase")) .$oPrj->renderLink("setup")
+                            : $oHtml->getBox("info", t("page-overview-no-phase")) .$oPrj->renderLink("setup")
                     ).'
                 </div>
             </div>
diff --git a/public_html/deployment/pages/act_phase.php b/public_html/deployment/pages/act_phase.php
index a84866d66b65c28028e9384fdc5fe86f9d831e4c..c93965e3c38f98e5187a7143348b80cccccb75ac 100644
--- a/public_html/deployment/pages/act_phase.php
+++ b/public_html/deployment/pages/act_phase.php
@@ -56,7 +56,7 @@ if ($sPhase) {
      * 
      */
 } else {
-    $sOut.=$oPrj->getBox("error", t("error-no-phase"));
+    $sOut.=$oHtml->getBox("error", t("error-no-phase"));
 }
 
 $sOut.= '<div id="navbuttom">' . aPrjHome() . '</div>';
diff --git a/public_html/deployment/pages/act_rollback.php b/public_html/deployment/pages/act_rollback.php
index a2e53adacff6632ac430cfbfa742055dd5e563be..3c55fe1026829e61cd327a684a2873d348a4f926 100644
--- a/public_html/deployment/pages/act_rollback.php
+++ b/public_html/deployment/pages/act_rollback.php
@@ -29,7 +29,7 @@ if (array_key_exists("confirm", $aParams)) {
 } else {
 
     if (!$sPhase) {
-        $sOut.=$oPrj->getBox("error", t("error-no-phase"));
+        $sOut.=$oHtml->getBox("error", t("error-no-phase"));
     } else {
         /*
           if (!$oPrj->canAcceptPhase($sPhase)){
diff --git a/public_html/deployment/pages/act_setup.php b/public_html/deployment/pages/act_setup.php
index 215f90832a9d2e5908dad04e7fb4888494bda3d0..7fc8f3110dde77f47babf10876c38581b0ef3480 100644
--- a/public_html/deployment/pages/act_setup.php
+++ b/public_html/deployment/pages/act_setup.php
@@ -116,7 +116,7 @@ if ($aParams["prj"] == "all") {
             }
         }
         if ($sError){
-            $sOut.=$oPrj->getBox("error", '<ul>'.$sError.'</ul>');
+            $sOut.=$oHtml->getBox("error", '<ul>'.$sError.'</ul>');
         } else {
             $oForm = new formgen($aForms);
             // TODO: unhide after checkin
@@ -140,7 +140,7 @@ if ($aParams["prj"] == "all") {
                 if (!$sError) {
                     header("location: /deployment/" . $aParams["id"] . "/setup/");
                 }
-                $sOut.=$oPrj->getBox("error", $sError);
+                $sOut.=$oHtml->getBox("error", $sError);
             }
             $sOut.=$oPrj->renderNewProject();
         }
@@ -258,9 +258,9 @@ if ($aParams["prj"] == "all") {
 
     if (array_key_exists("setupaction", $aParams) && $aParams["setupaction"] == "save") {
         if ($oPrj->saveConfig()) {
-            $sOut.=$oPrj->getBox("success", t("page-setup-info-settings-were-saved")) . aPrjHome() . '<br><br>';
+            $sOut.=$oHtml->getBox("success", t("page-setup-info-settings-were-saved")) . aPrjHome() . '<br><br>';
         } else {
-            $sOut.=$oPrj->getBox("error", t("page-setup-error-settings-were-not-saved"));
+            $sOut.=$oHtml->getBox("error", t("page-setup-error-settings-were-not-saved"));
         }
     }