public void solution() {
		DomainKnowledge dk = this.agent.domain_knowledge;
		
		//Look to see if there is an Available Solution
		//	Check to see the domain knowledge for goals
		String goal = dk.peekGoal();
		
		//Find the Goal description
		String[] goalPerformative = goal.split("g=");
		String[] goalDescription = goalPerformative[1].split("\\(");
		
		String g = goalDescription[0];
		
		//	 Check to see if any Action can satisfy the Goal
		if(actions.containsKey(g)) {
			//If there is an action matching the goal add the potential solution to the Potential Solution Knowledge
			dk.addSolution(goal, ((Action)actions.get(g)).getName());
		} 
		
		//Done the problem solving - mental state = solutions
		this.agent.nextState();
		
		//Go to pre-interaction (If there is no available solution pre-interaction will identify interdependency)
		this.agent.getPreInteractionCapability().reason();
		
		//Check to see if the potential solution is an action or interaction
		//	IF it is an action
		//		Execute the action
		//		Transition the state from 3 -> 4 || commitment -> intention
		//	IF it is an interaction
		//		Execute the appropriate interaction
		//		Transition the state from 2 -> 3 || desire -> commitment
		//		Transition the state from 3 -> 4 || desire -> commitment
		
		//Potential Solution being an action will result in mental-state of 3 || commitment
		if(this.agent.getMentalState() == 3) {
			Action action = (Action) actions.get(g);
			
			//Pass the DataStore representing the knowledge for the Action/Behaviour
			DataStore ds = new DataStore();
			//Parse out the Goal Data
			int end = goalDescription[1].length()-1;
			String data = goalDescription[1].substring(0, end); 
			
			ds.put("data", data);
			
			//Set the Data Store
			action.getBehaviour().setDataStore(ds);
			//Execute the action
			action.getBehaviour().action();
			
			//Remove the Goal - pop it off the stack
			goal = dk.getGoal();
			//Remove the Solution
			dk.removeSolutionByKey(goal);
			
			//Transition to Intention
			this.agent.nextState();
		} 
		//Potential Solution being an interaction will result in mental-state of 2 || desire
		else if(this.agent.getMentalState() == 2) {
			//Execute the INTERACTION!
			//Check to see that an interaction has been added to the Interaction Capabilities
			if(!this.agent.getInteractions().isEmpty()) {
				String[] candidates = new String[5];
				candidates[0] = "";
				//If interactions are specified, execute them
				AssignmentInteractionSimulation assignment = (AssignmentInteractionSimulation) this.agent.getInteractions().get("ASSIGNMENT");
				assignment.interact();
				
				//Remove the Goal - pop it off the stack
				goal = dk.getGoal();
			} else {
				//Remove the Goal - pop it off the stack
				goal = dk.getGoal();
				//Set the response to indicate it can't be achieved
				ACLMessage reply = agent.domain_knowledge.getCommunication();
				reply.setPerformative(ACLMessage.INFORM);
				reply.setContent("DNE");
			}
			
			//Transition to Intention
			this.agent.nextState();
			this.agent.nextState();
		}

		//Return the response to Communication
		
		//Transition the mental state (1 -> 2 || Solutions -> Desire)
		//this.agent.transitionState(2);
	}