Renderização de componentes personalizados no JSF

Olá a todos

Estou aprendendo JSF e estou com problemas na hora de criar um componente personalizado.
Quero contruir uma caixa de menu a para isso criei uma tag personalizada. Nessa caixa de menu, terei vários commandlink’s.
Meu problema é que na hora que a tela é exibida, todos os commandlink’s que eu adiciono a caixa de menu é duplicada na página, conforme a figura abaixo.

Pois bem, segue o código:

Página JSP

<h:form id="formpage">
<div class="menu">
<b:menu value="#{pagina.menus}" />
</div>
</h:form>

Renderizador

	@SuppressWarnings("unchecked")
	public void encodeBegin(FacesContext context) throws IOException{
		HtmlPanelGroup panel = (HtmlPanelGroup) context.getApplication().createComponent(HtmlPanelGroup.COMPONENT_TYPE);
		ValueExpression value = (ValueExpression) this.getAttributes().get("value");
		HtmlForm form   = (HtmlForm) context.getViewRoot().findComponent("formpage");

		List<Menu> menus  = (List<Menu>) value.getValue(context.getELContext());
		ResponseWriter writer = context.getResponseWriter();

		form.getChildren().add(panel);
		panel.encodeBegin(context);

		for(Menu menu : menus){
			writer.startElement("div", panel);
			writer.writeAttribute("class", "item", null);
			writer.write(menu.getNome());
			writer.startElement("ul", panel);

			for(Submenu submenu : menu.getSubmenus()){
				writer.startElement("li", panel);
				UIParameter param = new UIParameter();
				param.setName("id");
				param.setValue(submenu.getId());
				
				HtmlCommandLink link = (HtmlCommandLink) context.getApplication().createComponent(HtmlCommandLink.COMPONENT_TYPE);
				link.getChildren().add(param);
				link.setActionExpression(context.getApplication().getExpressionFactory().createMethodExpression(context.getELContext(), "#{pagina.link}", String.class, new Class[0]));
				link.setValue(submenu.getNome());
				link.setImmediate(true);

				panel.getChildren().add(link);
				
				link.encodeAll(context);
				
				writer.endElement("li");
			}

			writer.endElement("ul");
			writer.endElement("div");
		}
		
		panel.encodeEnd(context);