diff --git a/campcaster/src/modules/storageServer/var/GreenBox.php b/campcaster/src/modules/storageServer/var/GreenBox.php
index 3974546e6..7e579080e 100644
--- a/campcaster/src/modules/storageServer/var/GreenBox.php
+++ b/campcaster/src/modules/storageServer/var/GreenBox.php
@@ -671,12 +671,14 @@ class GreenBox extends BasicStor {
      * @param string $length
      *      length in extent format -
      *          for webstream (or for overrule length of audioclip)
-     * @param string $pause
-     *      pause between half-faded points in time format hh:mm:ss.ssssss
+     * @param string $clipstart
+     *      optional clipstart time format hh:mm:ss.ssssss - relative to begin
+     * @param string $clipend
+     *      optional $clipend time format hh:mm:ss.ssssss - relative to begin
      * @return string, generated playlistElement gunid
      */
     public function addAudioClipToPlaylist($token, $acId, $sessid,
-        $fadeIn=NULL, $fadeOut=NULL, $length=NULL, $pause=NULL)
+        $fadeIn=NULL, $fadeOut=NULL, $length=NULL, $clipstart=NULL, $clipend=NULL)
     {
         require_once("Playlist.php");
         $pl = StoredFile::RecallByToken($token);
@@ -690,13 +692,11 @@ class GreenBox extends BasicStor {
                 " ($type)"
             );
         }
-//        $res = $pl->addAudioClip($acId, $fadeIn, $fadeOut, NULL, $pause);
-        $res = $pl->addAudioClip($acId, $fadeIn, $fadeOut, NULL, $length);
+        $res = $pl->addAudioClip($acId, $fadeIn, $fadeOut, NULL, $length, $clipstart, $clipend);
         if (PEAR::isError($res)) {
             return $res;
         }
         // recalculate offsets and total length:
-//        $r = $pl->recalculateTimes($pause);
         $r = $pl->recalculateTimes();
         if (PEAR::isError($r)) {
             return $r;
@@ -770,6 +770,41 @@ class GreenBox extends BasicStor {
         }
         return TRUE;
     } // fn changeFadeInfo
+    
+    /**
+     * Change cueIn/curOut values for playlist element
+     *
+     * @param string $token
+     *      playlist access token
+     * @param string $plElGunid
+     *      global id of deleted playlistElement
+     * @param string $clipStart
+     *      in time format hh:mm:ss.ssssss
+     * @param string $clipEnd
+     *      in time format hh:mm:ss.ssssss
+     *      relative to begin
+     * @param sessid $string
+     *      session ID
+     * @return boolean or pear error object
+     */
+    public function changeClipLength($token, $plElGunid, $clipStart, $clipEnd, $sessid)
+    {
+        require_once("Playlist.php");
+        $pl = StoredFile::RecallByToken($token);
+        if (is_null($pl) || PEAR::isError($pl)) {
+            return $pl;
+        }
+        $res = $pl->changeClipLength($plElGunid, $clipStart, $clipEnd);
+        if (PEAR::isError($res)) {
+            return $res;
+        }
+        // recalculate offsets and total length:
+        $r = $pl->recalculateTimes();
+        if (PEAR::isError($r)) {
+            return $r;
+        }
+        return TRUE;
+    } // fn changeFadeInfo
 
 
     /**
@@ -1041,11 +1076,11 @@ class GreenBox extends BasicStor {
      * @return int
      * 		seconds
      */
-//    public function playlistTimeToSeconds($plt)
-//    {
-//        require_once("Playlist.php");
-//        return Playlist::playlistTimeToSeconds($plt);
-//    }
+      public function playlistTimeToSeconds($plt)
+      {
+          require_once("Playlist.php");
+          return Playlist::playlistTimeToSeconds($plt);
+      }
 
 
     /**
@@ -1056,11 +1091,11 @@ class GreenBox extends BasicStor {
      * @return string
      * 		time in playlist time format (HH:mm:ss.dddddd)
      */
-//    public static function secondsToPlaylistTime($s0)
-//    {
-//        require_once("Playlist.php");
-//        return Playlist::secondsToPlaylistTime($s0);
-//    } // fn secondsToPlaylistTime
+      public static function secondsToPlaylistTime($s0)
+      {
+          require_once("Playlist.php");
+          return Playlist::secondsToPlaylistTime($s0);
+      } // fn secondsToPlaylistTime
 
 
     /* ------------------------------------------------------- render methods */
diff --git a/campcaster/src/modules/storageServer/var/Playlist.php b/campcaster/src/modules/storageServer/var/Playlist.php
index bf6264d86..965e3263b 100644
--- a/campcaster/src/modules/storageServer/var/Playlist.php
+++ b/campcaster/src/modules/storageServer/var/Playlist.php
@@ -129,19 +129,23 @@ class Playlist extends StoredFile {
      * @param string $acId
      * 		local ID of added file
      * @param string $fadeIn
-     * 		optional, in time format hh:mm:ss.ssssss
+     * 		optional, in time format hh:mm:ss.ssssss - total duration
      * @param string $fadeOut
-     * 		optional, in time format hh:mm:ss.ssssss
+     * 		optional, in time format hh:mm:ss.ssssss - total duration
      * @param string $plElGunid
      * 		optional playlist element gunid
      * @param string $length
-     * 		optional length in extent format -
+     * 		optional length in in time format hh:mm:ss.ssssss -
      *      for webstream (or for overrule length of audioclip)
+     * @param string $clipstart
+     *      optional clipstart in time format hh:mm:ss.ssssss - relative to begin
+     * @param string $clipend
+     *      optional $clipend in time format hh:mm:ss.ssssss - relative to begin
      * @return string
      * 		generated playlistElement gunid
      */
     public function addAudioClip($acId, $fadeIn=NULL, $fadeOut=NULL, $plElGunid=NULL,
-        $length=NULL)
+        $length=NULL, $clipstart=NULL, $clipend=NULL)
     {
         $plGunid = $this->gunid;
         // get information about audioClip
@@ -163,11 +167,18 @@ class Playlist extends StoredFile {
         // insert new playlist element
         $offset = $plLen;
 		
-		 // insert default values until UI starts supporting clip in / clip out
-        $clipStart = 00.000000;
-        $clipEnd = $acLen;
-        $clipLength = $acLen;
-		
+		 // insert default values if parameter was empty
+        $clipStart = !is_null($clipstart) ? $clipstart : '00:00:00.000000';
+        $clipEnd = !is_null($clipend) ? $clipend : $acLen;
+        
+        $acLengthS = $clipLengthS = self::playlistTimeToSeconds($acLen);
+        if (!is_null($clipStart)) {
+            $clipLengthS = $acLengthS - self::playlistTimeToSeconds($clipStart);    
+        }
+        if (!is_null($clipEnd)) {
+            $clipLengthS = $clipLengthS - ($acLengthS - self::playlistTimeToSeconds($clipEnd));   
+        }
+        $clipLength = self::secondsToPlaylistTime($clipLengthS);
 		
         $plElInfo = $this->insertPlaylistElement($parid, $offset, $clipStart, $clipEnd, $clipLength,
             $acGunid, $acLen, $acTit, $fadeIn, $fadeOut, $plElGunid,
@@ -263,7 +274,6 @@ class Playlist extends StoredFile {
         if (PEAR::isError($plElArr)) {
         	return $plElArr;
         }
-        $found = FALSE;
         foreach ($plElArr as $el) {
             $plElGunidArr = $this->md->getMetadataElement('id', $el['mid']);
             if (PEAR::isError($plElGunidArr)) {
@@ -273,6 +283,7 @@ class Playlist extends StoredFile {
             if ($plElGunidArr[0]['value'] != $plElGunid) {
             	continue;
             }
+            $found = TRUE;
             // get fadeInfo:
             $fiMid = $this->_getMidOrInsert('fadeInfo', $el['mid']);
             if (PEAR::isError($fiMid)) {
@@ -301,8 +312,82 @@ class Playlist extends StoredFile {
             if (PEAR::isError($r)) {
             	return $r;
             }
+            return true;
         }
-        return TRUE;
+        return false;
+    }
+    
+        /**
+     * Change cueIn/curOut values for playlist element
+     *
+     * @param string $plElGunid
+     * 		playlistElement gunid
+     * @param string $fadeIn
+     * 		new value in ss.ssssss or extent format
+     * @param string $fadeOut
+     * 		new value in ss.ssssss or extent format
+     * @return boolean or pear error object
+     */
+    public function changeClipLength($plElGunid, $clipStart, $clipEnd)
+    {
+        $plGunid = $this->gunid;
+        // get information about playlist and containers
+        $plInfo = $this->getPlaylistInfo();
+        if (PEAR::isError($plInfo)) {
+        	return $plInfo;
+        }
+        extract($plInfo);   // 'plLen', 'parid', 'metaParid'
+
+        // get array of playlist elements:
+        $plElArr = $this->md->getMetadataElement('playlistElement', $parid);
+        if (PEAR::isError($plElArr)) {
+        	return $plElArr;
+        }
+        foreach ($plElArr as $el) {
+            $plElGunidArr = $this->md->getMetadataElement('id', $el['mid']);
+            if (PEAR::isError($plElGunidArr)) {
+            	return $plElGunidArr;
+            }
+            // select playlist element:
+            if ($plElGunidArr[0]['value'] != $plElGunid) {
+            	continue;
+            }
+            $found = TRUE;
+            // get clipStart Mid
+            $clipStartMid = $this->_getMidOrInsert('clipStart', $el['mid']);
+            if (PEAR::isError($clipStartMid)) {
+            	return $clipStartMid;
+            }
+            // get clipEnd Mid
+            $clipEndMid = $this->_getMidOrInsert('clipEnd', $el['mid']);
+            if (PEAR::isError($clipEndMid)) {
+            	return $clipEndMid;
+            }
+            // get clipLength Mid
+            $clipLengthMid = $this->_getMidOrInsert('clipLength', $el['mid']);
+            if (PEAR::isError($clipLengthMid)) {
+            	return $clipLengthMid;
+            }
+            // set clipStart value
+            $r = $this->md->setMetadataElement($clipStartMid, $clipStart);
+            if (PEAR::isError($r)) {
+            	return $r;
+            }
+            // setClipend value
+            $r = $this->md->setMetadataElement($clipEndMid, $clipEnd);
+            if (PEAR::isError($r)) {
+            	return $r;
+            }
+            // set playlength value
+            $clipLength = self::secondsToPlaylistTime(self::playlistTimeToSeconds($clipEnd) - self::playlistTimeToSeconds($clipStart));
+            $r = $this->md->setMetadataElement($clipLengthMid, $clipLength);
+            if (PEAR::isError($r)) {
+            	return $r;
+            }
+            $this->recalculateTimes();
+            return true;
+        }
+        return false;
     }
 
 
@@ -422,15 +507,19 @@ class Playlist extends StoredFile {
             	return $offArr;
             }
             // get clipStart:
-            $startArr = $this->md->getMetadataElement('clipStart', $elId);
-            if (PEAR::isError($startArr)) {
-            	return $startArr;
+            $clipStartArr = $this->md->getMetadataElement('clipStart', $elId);
+            if (PEAR::isError($clipStartArr)) {
+            	return $clipStartArr;
             }
+            $clipStart = $clipStartArr[0]['value'];
+            $clipStartS = Playlist::playlistTimeToSeconds($clipStart);
             // get clipEnd:
-            $endArr = $this->md->getMetadataElement('clipEnd', $elId);
-            if (PEAR::isError($endArr)) {
-            	return $endArr;
+            $clipEndArr = $this->md->getMetadataElement('clipEnd', $elId);
+            if (PEAR::isError($clipEndArr)) {
+            	return $clipEndArr;
             }
+            $clipEnd = $clipEndArr[0]['value'];
+            $clipEndS = Playlist::playlistTimeToSeconds($clipEnd);
             // get clipLength:
             $lenArr = $this->md->getMetadataElement('clipLength', $elId);
             if (PEAR::isError($lenArr)) {
@@ -482,14 +571,20 @@ class Playlist extends StoredFile {
                         "Playlist::recalculateTimes: fadeIn too big");
                 }
             }
+            /*
+            this seems made for crossfade
             if ($len > 0) {
             	$len = $len - $fadeInS;
             }
+            */
+            
             $newOffset = Playlist::secondsToPlaylistTime($len);
             $r = $this->_setValueOrInsert($offsetId, $newOffset, $elId, 'relativeOffset');
             if (PEAR::isError($r)) {
             	return $r;
             }
+            
+            // commulate length for next offset
             $acLenS = Playlist::playlistTimeToSeconds($acLen);
             $len = $len + $acLenS;
             if (!is_null($prevFiMid)) {
@@ -503,6 +598,14 @@ class Playlist extends StoredFile {
                 	return $r;
                 }
             }
+            // respect clipStart and clipEnd
+            if (!is_null($clipStart)) {
+                $len = $len - $clipStartS;    
+            }
+            if (!is_null($clipEnd)) {
+                $len = $len - ($acLenS - $clipEndS);   
+            }
+            
             $prevFiMid = $fiMid;
             $lastLenS = $acLenS;
         }
@@ -1010,6 +1113,12 @@ class Playlist extends StoredFile {
      * 		parent record id
      * @param string $offset
      * 		relative offset in extent format
+     * @param string $clipstart
+     * 		audioClip clipstart in extent format
+     * @param string $clipEnd
+     * 		audioClip clipEnd in extent format
+     * @param string $clipLength
+     * 		 audioClip playlength in extent format (?)
      * @param string $acGunid
      * 		audioClip gunid
      * @param string $acLen