public function moveRecursive( $source, $destination, $depth = ezcWebdavRequest::DEPTH_INFINITY )
    {
        $errors = array();
        $fullSource = $source;
        $fullDestination = $destination;
        $source = $this->splitFirstPathElement( $source, $sourceSite );
        $destination = $this->splitFirstPathElement( $destination, $destinationSite );

        if ( $sourceSite !== $destinationSite )
        {
            // We do not support copying from one site to another yet
            // TODO: Check if the sites are using the same db,
            //       if so allow the copy as a simple object copy
            //       If not we will have to do an object export from
            //       $sourceSite and import it in $destinationSite
            return array(); // @as self::FAILED_FORBIDDEN;
        }

        if ( !$sourceSite or
             !$destinationSite )
        {
            // Cannot copy entries in site list
            return array( $fullSource ); // @as self::FAILED_FORBIDDEN;
        }

        $this->moveVirtualFolder( $sourceSite, $destinationSite,
                                  $source, $destination,
                                  $fullSource, $fullDestination );

        if ( $depth === ezcWebdavRequest::DEPTH_ZERO || !$this->isCollection( $fullSource ) )
        {
            // Do not recurse (any more)
            return array();
        }

        // Recurse
        $nodes = $this->getCollectionMembers( $fullSource );
        foreach ( $nodes as $node )
        {
            if ( $node->path === $fullSource . '/' )
            {
                // skip the current node which was copied with copyVirtualFolder() above
                continue;
            }

            $newDepth = ( $depth !== ezcWebdavRequest::DEPTH_ONE ) ? $depth : ezcWebdavRequest::DEPTH_ZERO;
            $errors = array_merge(
                $errors,
                $this->moveRecursive( $node->path,
                                      $fullDestination . '/' . $this->getProperty( $node->path, 'displayname' )->displayName,
                                      $newDepth ) );
        }

        return $errors;
    }