RichFaces e Ajax 4 JSF - Dados não são atualizados no controller

Boa noite pessoal,

tenho o seguinte código que estou fazendo para estudar o richfaces, porém tenho um problema:

Se eu deixo a jsp com vários forms, ao clicar no botão Salvar ou Pesquisar, os dados do ManagedBean não são atualizados com os dados do formulário de edição, mas chama o método com os dados desatualizados.
Se eu deixo a jsp com um form, o botão de Alterar chama o método mas a view não é atualizada (O form fica em branco).

No que vocês puderem ajudar eu fico grato, e peço desculpas por postar um código imenso no fórum.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<ui:composition template="../template.xhtml"
				xmlns="http://www.w3.org/1999/xhtml"
				xmlns:ui="http://java.sun.com/jsf/facelets"
				xmlns:c="http://java.sun.com/jsp/jstl/core"
				xmlns:h="http://java.sun.com/jsf/html"
				xmlns:f="http://java.sun.com/jsf/core"
				xmlns:t="http://myfaces.apache.org/tomahawk"
				xmlns:a4j="http://richfaces.org/a4j"
				xmlns:rich="http://richfaces.org/rich">
	<ui:define name="titulo">Cadastro de Clientes</ui:define>
	<ui:define name="conteudo">
		<f:view>
			<a4j:region>
				<a4j:keepAlive beanName="ClienteBean" />

				<a4j:status onstart="Richfaces.showModalPanel('carregando');" onstop="Richfaces.hideModalPanel('carregando');" />

				<rich:modalPanel id="carregando" autosized="true" moveable="false" resizeable="false">
					<h:graphicImage value="../static/images/loading.gif" />
				</rich:modalPanel>

				<a4j:outputPanel id="mensagem">
					<rich:messages style="color:red;" />
				</a4j:outputPanel>

				<a4j:form>
					<a4j:outputPanel>
						<rich:panel id="form">
							<f:facet name="header">
								<h:outputText value="Cadastro de Clientes" />
							</f:facet>

							<h:inputHidden value="#{ClienteBean.cliente.id}" />

							<h:panelGrid columns="3">
								<h:outputText value="Nome" />
								<h:inputText value="#{ClienteBean.cliente.nome}" id="nome" size="50" maxlength="50" required="true" tabindex="1">
									<f:validateLength minimum="3" maximum="50" />
								</h:inputText>
								<rich:messages for="nome" />
			
								<h:outputText value="Sexo" />
								<h:selectOneMenu value="#{ClienteBean.cliente.sexo}" id="sexo" required="true" tabindex="2">
									<f:selectItem itemLabel="... Selecione ..." itemValue="" />
									<f:selectItem itemLabel="Masculino" itemValue="M" />
									<f:selectItem itemLabel="Feminino" itemValue="F" />
								</h:selectOneMenu>
								<rich:message for="sexo" />
			
								<h:outputText value="Data de Nascimento" />
								<rich:calendar value="#{ClienteBean.cliente.dataNascimento}" id="dataNascimento" datePattern="dd/MM/yyyy" required="true" tabindex="3">
									<f:convertDateTime pattern="dd/MM/yyyy"/>
								</rich:calendar>
								<rich:message for="dataNascimento" />
			
								<h:outputText value="Endereço" />
								<h:inputText value="#{ClienteBean.cliente.endereco}" id="endereco" size="50" maxlength="50" required="true" tabindex="4">
									<f:validateLength minimum="3" maximum="50" />
								</h:inputText>
								<rich:message for="nome" />
			
								<h:outputText value="Cep" />
								<h:inputText value="#{ClienteBean.cliente.cep}" id="cep" size="10" maxlength="9" required="true" tabindex="5">
									<f:converter converterId="CepConverter" />
								</h:inputText>
								<rich:message for="cep" />
			
								<h:outputText value="Bairro" />
								<h:inputText value="#{ClienteBean.cliente.bairro}" id="bairro" size="30" maxlength="30" required="true" tabindex="6" />
								<rich:message for="bairro" />
			
								<h:outputText value="Cidade" />
								<h:inputText value="#{ClienteBean.cliente.cidade}" id="cidade" size="30" maxlength="30" required="true" tabindex="7" />
								<rich:message for="cidade" />
			
								<h:outputText value="Estado" />
								<h:inputText value="#{ClienteBean.cliente.estado}" id="estado" size="3" maxlength="2" required="true" tabindex="8" />
								<rich:message for="estado" />
			
								<h:outputText value="Telefone" />
								<h:inputText value="#{ClienteBean.cliente.telefone}" id="telefone" size="15" maxlength="13" required="true" tabindex="9">
									<f:converter converterId="TelefoneConverter" />
								</h:inputText>
								<rich:message for="telefone" />
			
								<h:outputText value="Celular" />
								<h:inputText value="#{ClienteBean.cliente.celular}" id="celular" size="15" maxlength="13" required="true" tabindex="10">
									<f:converter converterId="TelefoneConverter" />
								</h:inputText>
								<rich:message for="celular" />
							</h:panelGrid>
						</rich:panel>
					</a4j:outputPanel>
				</a4j:form>

				<a4j:form>
					<a4j:outputPanel>
						<rich:panel id="botoes">
							<h:panelGrid columns="4" rendered="#{ClienteBean.modoEdicao}">
								<a4j:commandButton value="Salvar" action="#{ClienteBean.salvar}" reRender="botoes,form" />
								<a4j:commandButton value="Cancelar" action="#{ClienteBean.cancelar}" reRender="botoes,form" immediate="true" />
							</h:panelGrid>
							<h:panelGrid columns="4" rendered="#{ClienteBean.modoPesquisa}">
								<a4j:commandButton value="Pesquisar" action="#{ClienteBean.pesquisar}" reRender="botoes,tabela" immediate="true" />
								<a4j:commandButton value="Incluir" action="#{ClienteBean.incluir}" reRender="botoes,form" />
							</h:panelGrid>
						</rich:panel>
					</a4j:outputPanel>
				</a4j:form>

				<a4j:form>
					<a4j:outputPanel>
						<rich:dataTable id="tabela" var="cliente" value="#{ClienteBean.model}" width="100%" rows="10">
							<f:facet name="header"><h:outputText value="Cadastro de Clientes" /></f:facet>
							<rich:column>
								<f:facet name="header">
									<h:outputText value="Nome" />
								</f:facet>
								<h:outputText value="#{cliente.nome}" />
							</rich:column>

							<rich:column>
								<f:facet name="header">
									<h:outputText value="Ações" />
								</f:facet>

								<a4j:commandLink id="botaoAlterar" action="#{ClienteBean.alterar}" reRender="botoes,form" immediate="true">
									<h:graphicImage value="../static/images/alterar.gif" style="border:0" />
								</a4j:commandLink>
								<rich:toolTip for="botaoAlterar" value="Alterar" />

								<a4j:commandLink id="botaoExcluir" action="#{ClienteBean.excluir}" reRender="tabela" immediate="true">
									<h:graphicImage value="../static/images/excluir.gif" style="border:0" />
								</a4j:commandLink>
								<rich:toolTip for="botaoExcluir" value="Excluir" />
							</rich:column>

							<f:facet name="footer">
								<rich:datascroller for="tabela" reRender="tabela" maxPages="15" />
							</f:facet>
						</rich:dataTable>
					</a4j:outputPanel>
				</a4j:form>
			</a4j:region>
		</f:view>
	</ui:define>
</ui:composition>
package br.com.vinicius.cadastro.controller;

import java.io.Serializable;
import java.util.List;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import br.com.vinicius.cadastro.model.bean.Cliente;
import br.com.vinicius.cadastro.model.dao.ClienteDao;

public class ClienteBean implements Serializable {

	private static final long serialVersionUID = 1L;

	private Modo modoAtual = Modo.PESQUISA;
	private Cliente cliente = new Cliente();
	private DataModel model = new ListDataModel();
	private ClienteDao clienteDao = new ClienteDao();

	public Modo getModoAtual() {
		return modoAtual;
	}

	public void setModoAtual(Modo modoAtual) {
		this.modoAtual = modoAtual;
	}

	public Boolean getModoPesquisa() {
		return Modo.PESQUISA.equals(modoAtual);
	}

	public Boolean getModoEdicao() {
		return Modo.EDICAO.equals(modoAtual);
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public DataModel getModel() {
		return model;
	}

	public void setModel(DataModel model) {
		this.model = model;
	}

	public ClienteDao getClienteDao() {
		return clienteDao;
	}

	public void setClienteDao(ClienteDao clienteDao) {
		this.clienteDao = clienteDao;
	}

	public void pesquisar() {
		List<Cliente> clientes = clienteDao.find(cliente);
		getModel().setWrappedData(clientes);
	}

	public void incluir() {
		cliente = new Cliente();
		modoAtual = Modo.EDICAO;
	}

	public void alterar() {
		cliente = (Cliente) model.getRowData();
		modoAtual = Modo.EDICAO;
	}

	public void salvar() {
		clienteDao.merge(cliente);
		modoAtual = Modo.PESQUISA;
	}

	public void cancelar() {
		cliente = new Cliente();
		modoAtual = Modo.PESQUISA;
	}

	public void excluir() {
		Cliente cliente = (Cliente) model.getRowData();
		List<Cliente> clientes = (List<Cliente>) model.getWrappedData();

		clienteDao.remove(cliente);
		clientes.remove(clientes.indexOf(cliente));
	}
}