function displayLinkedTags($tag, $linkType, $uId, $cat_url, $user, $editingMode = false, $precedentTag = null, $level = 0, $stopList = array())
{
    if (in_array($tag, $stopList)) {
        return array('output' => '', 'stoplist' => $stopList);
    }
    $tag2tagservice = SemanticScuttle_Service_Factory::get('Tag2Tag');
    $tagstatservice = SemanticScuttle_Service_Factory::get('TagStat');
    // link '>'
    if ($level > 1) {
        if ($editingMode) {
            $link = '<small><a href="' . createURL('tag2tagedit', $precedentTag . '/' . $tag) . '" title="' . _('Edit link') . '">></a> </small>';
        } else {
            $link = '> ';
        }
    } else {
        $link = '';
    }
    $output = '';
    $output .= '<tr>';
    $output .= '<td></td>';
    $output .= '<td>';
    $output .= $level == 1 ? '<b>' : '';
    $output .= str_repeat('&nbsp;', $level * 2) . $link . '<a href="' . sprintf($cat_url, filter($user, 'url'), filter($tag, 'url')) . '" rel="tag">' . filter($tag) . '</a>';
    $output .= $level == 1 ? '</b>' : '';
    //$output.= ' - '. $tagstatservice->getMaxDepth($tag, $linkType, $uId);
    $synonymTags = $tag2tagservice->getAllLinkedTags($tag, '=', $uId);
    $synonymTags = is_array($synonymTags) ? $synonymTags : array($synonymTags);
    sort($synonymTags);
    $synonymList = '';
    foreach ($synonymTags as $synonymTag) {
        //$output.= ", ".$synonymTag;
        $synonymList .= $synonymTag . ' ';
    }
    if (count($synonymTags) > 0) {
        $output .= ', ' . $synonymTags[0];
    }
    if (count($synonymTags) > 1) {
        $output .= '<span title="' . T_('Synonyms:') . ' ' . $synonymList . '">, etc</span>';
    }
    /*if($editingMode) {
    	$output.= ' (';
    	$output.= '<a href="'.createURL('tag2tagadd', $tag).'" title="'._('Add a subtag').'">+</a>';
    	if(1) {
    	    $output.= ' - ';
    	    $output.= '<a href="'.createURL('tag2tagdelete', $tag).'">-</a>';
    	}
    	$output.= ')';
        }*/
    $output .= '</td>';
    $output .= '</tr>';
    $tags = array($tag);
    $tags = array_merge($tags, $synonymTags);
    foreach ($tags as $tag) {
        if (!in_array($tag, $stopList)) {
            $linkedTags = $tag2tagservice->getLinkedTags($tag, '>', $uId);
            $precedentTag = $tag;
            $stopList[] = $tag;
            foreach ($linkedTags as $linkedTag) {
                $displayLinkedTags = displayLinkedTags($linkedTag, $linkType, $uId, $cat_url, $user, $editingMode, $precedentTag, $level + 1, $stopList);
                $output .= $displayLinkedTags['output'];
            }
            if (isset($displayLinkedTags) && is_array($displayLinkedTags['stopList'])) {
                $stopList = array_merge($stopList, $displayLinkedTags['stopList']);
                $stopList = array_unique($stopList);
            }
        }
    }
    return array('output' => $output, 'stopList' => $stopList);
}

<div id="related">
<table>
<?php 
    if ($editingMode) {
        echo '<tr><td></td><td>';
        echo ' (<a href="' . createURL('tag2tagadd', 'menu') . '" rel="tag">' . T_('Add new link') . '</a>) ';
        echo ' (<a href="' . createURL('tag2tagdelete', 'menu') . '" rel="tag">' . T_('Delete link') . '</a>)';
        echo '</td></tr>';
    }
    $stopList = array();
    foreach ($menuTags as $menuTag) {
        $tag = $menuTag['tag'];
        if (!in_array($tag, $stopList)) {
            $displayLinkedTags = displayLinkedTags($tag, '>', $userid, $cat_url, $user, $editingMode, null, 1);
            echo $displayLinkedTags['output'];
            if (is_array($displayLinkedTags['stopList'])) {
                $stopList = array_merge($stopList, $displayLinkedTags['stopList']);
            }
        }
    }
    ?>
</table>

<?php 
    $cUser = $userservice->getUser($userid);
    if ($userid > 0) {
        if ($userid == $logged_on_userid) {
            ?>
<p style="text-align:right"><a href="<?php