If you want to receive ERC20 tokens onto a new contract along with data, you can create the new contract using ERC 223 token standard. Read here (Dont be confused about the nomenclature, its ERC223 and not ERC23)
When you transfer the tokens, you can also send data in the function
transfer(address to, uint value, bytes data)
And since ERC223 is backward compatible with ERC20, there will be no breaking in contract.
A sample function can be as
function transferToContract(address _to, uint _value, bytes _data) private returns (bool success) {
if (balanceOf(msg.sender) < _value) throw;
balances[msg.sender] = safeSub(balanceOf(msg.sender), _value);
balances[_to] = safeAdd(balanceOf(_to), _value);
ContractReceiver reciever = ContractReceiver(_to);
reciever.tokenFallback(msg.sender, _value, _data);
Transfer(msg.sender, _to, _value, _data);
StateChanged(true,"Transfer to contract successful");
return true;
}