Programming with software agents is a popular concept in computing of late, and yet, it is unclear what is even meant by the term 'agent'. Yet if we consider agents as mobile, autonomous pieces of software, there is a great deal of potential for their use in distributed computation by proxy But for agents to have this potential, they need the ability to cooperate. If we define cooperation as the ability for agents to identify and communicate with one another, then agents are crippled today by their inability to do these activities if they are written in different agent systems We have defined a mechanism by which agents written in different agent systems have the means to cooperate, and this is accomplished via a shared agent environment. We have given agents the ability to identify one another regardless of the agent system the agent was written in, as well as the ability to communicate. Further, agents can know the status of their messages to other agents, giving them the ability to model the other agents knowledge