diff --git a/src/ac/ed/lurg/country/CountryAgent.java b/src/ac/ed/lurg/country/CountryAgent.java
index 8bcdf33483e7651e029655efcefd15379f314fa7..c0a79f62ab3e14144ce05bb0a5a9e4d075282a50 100644
--- a/src/ac/ed/lurg/country/CountryAgent.java
+++ b/src/ac/ed/lurg/country/CountryAgent.java
@@ -13,7 +13,7 @@ import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.utils.LogWriter;
 import ac.ed.lurg.yield.YieldResponses;
 
-public class CountryAgent implements GamsInput, GamsCountryInput {
+public class CountryAgent {
 	
 	private ModelContext modelContext;
 	private Country country;
@@ -58,19 +58,20 @@ public class CountryAgent implements GamsInput, GamsCountryInput {
 		currentRefYield =  modelContext.getYieldManager().getRefYield(country, year);
 		
 		// optimise areas and intensity 
-		GamsLandUseOptimiser opti = new GamsLandUseOptimiser(this);
+		GamsCountryInput countryLevelInputs = new GamsCountryInput(getProjectedDemand(), getWorldInputEnergy(), getMaxNetImport(), getMinNetImport());
+		GamsInput gamsInput = new GamsInput(getYields(), getPreviousCropArea(), countryLevelInputs);
+
+		GamsLandUseOptimiser opti = new GamsLandUseOptimiser(gamsInput);
 		LogWriter.println("Running " + country.getCountryName() + ", year " + year);
 		
 		GamsOutput result = opti.run();
 	//	cropAreasTimeseries.put(timestep, result);
 	}
 
-	@Override
 	public Map<CropType, Double> getProjectedDemand() {
 		return currentProjectedDemand;
 	}
 
-	@Override
 	public Map<Integer, YieldResponses> getYields() {
 	//	Map<Integer, Map<CropType, YieldResponse>> returnMap = new HashMap<Integer, Map<CropType, YieldResponse>>();
 
@@ -80,7 +81,6 @@ public class CountryAgent implements GamsInput, GamsCountryInput {
 		return null;  // this should be from LPJ data
 	}
 
-	@Override
 	public Map<Integer, Map<CropType, Double>> getPreviousCropArea() {		
 		Map<CropType, Double> previousCropAreas = new HashMap<CropType, Double>();
 		int previousTimestep = currentTimestep==0 ? 0 : currentTimestep-1;
@@ -97,7 +97,6 @@ public class CountryAgent implements GamsInput, GamsCountryInput {
 		return returnMap;
 	}
 
-	@Override
 	public Map<CropType, Double> getWorldInputEnergy() {
 		Map<CropType, Double> dummyMap = new HashMap<CropType, Double>();
 		dummyMap.put(CropType.CEREALS, 9.0);
@@ -111,7 +110,6 @@ public class CountryAgent implements GamsInput, GamsCountryInput {
 		return dummyMap;
 	}
 
-	@Override
 	public Map<CropType, Double> getMaxNetImport() {
 		Map<CropType, Double> dummyMaxExports = new HashMap<CropType, Double>();
 		dummyMaxExports.put(CropType.CEREALS, 24.0);
@@ -125,7 +123,6 @@ public class CountryAgent implements GamsInput, GamsCountryInput {
 		return dummyMaxExports;
 	}
 
-	@Override
 	public Map<CropType, Double> getMinNetImport() {
 		Map<CropType, Double> dummyMaxExports = new HashMap<CropType, Double>();
 		dummyMaxExports.put(CropType.CEREALS, -24.0);
@@ -138,39 +135,4 @@ public class CountryAgent implements GamsInput, GamsCountryInput {
 		dummyMaxExports.put(CropType.TREENUTS, -5.0);
 		return dummyMaxExports;
 	}
-
-	@Override
-	public double getMeatEfficiency() {
-		return 1;  // this is already handled by the feed conversion efficiency for each animal product
-	}
-
-	@Override
-	public double getMaxLandUseChange() {
-		return 0.05;
-	}
-
-	@Override
-	public double getMaxIntensity() {
-		return 29.0;
-	}
-
-	@Override
-	public double getTradeBarrier() {
-		return 2;
-	}
-
-	@Override
-	public double getLandChangeEnergy() {
-		return 0.1;
-	}
-
-	@Override
-	public double getMinFeedRate() {
-		return 0.15;
-	}
-
-	@Override
-	public GamsCountryInput getCountryInput() {
-		return this;
-	}
 }
\ No newline at end of file
diff --git a/src/ac/ed/lurg/country/gams/GamsCountryInput.java b/src/ac/ed/lurg/country/gams/GamsCountryInput.java
index eca14dab3db22a77ce874307b89bd80486a15303..2c0111d34a16d113952e7bfb811a694a2f1b98f2 100644
--- a/src/ac/ed/lurg/country/gams/GamsCountryInput.java
+++ b/src/ac/ed/lurg/country/gams/GamsCountryInput.java
@@ -4,20 +4,73 @@ import java.util.Map;
 
 import ac.ed.lurg.types.CropType;
 
-public interface GamsCountryInput {
+public class GamsCountryInput {
 
-	Map<CropType, Double> getProjectedDemand();
-	Map<CropType, Double> getWorldInputEnergy();
-	Map<CropType, Double> getMaxNetImport();
-	Map<CropType, Double> getMinNetImport();
+	private Map<CropType, Double> projectedDemand;
+	private Map<CropType, Double> worldInputEnergy;
+	private Map<CropType, Double> maxNetImport;
+	private Map<CropType, Double> minNetImport;
 	
 	// limits to areas for each location and crop
 	
-	double getMaxLandUseChange();
-	double getMeatEfficiency();
-	double getMaxIntensity();
-	double getMinFeedRate();
-	double getTradeBarrier();
-	double getLandChangeEnergy();
+/*	private double maxLandUseChange;
+	private double meatEfficiency;
+	private double maxIntensity;
+	private double minFeedRate;
+	private double tradeBarrier;
+	private double landChangeEnergy;*/
+	
+	
+	public GamsCountryInput(Map<CropType, Double> projectedDemand, Map<CropType, Double> worldInputEnergy,
+			Map<CropType, Double> maxNetImport, Map<CropType, Double> minNetImport) {
+		super();
+		this.projectedDemand = projectedDemand;
+		this.worldInputEnergy = worldInputEnergy;
+		this.maxNetImport = maxNetImport;
+		this.minNetImport = minNetImport;
+	}
+
+
+	public Map<CropType, Double> getProjectedDemand() {
+		return projectedDemand;
+	}
+
+
+	public Map<CropType, Double> getWorldInputEnergy() {
+		return worldInputEnergy;
+	}
+
+
+	public Map<CropType, Double> getMaxNetImport() {
+		return maxNetImport;
+	}
+
+
+	public Map<CropType, Double> getMinNetImport() {
+		return minNetImport;
+	}
+
+	public double getMeatEfficiency() {
+		return 1;  // this is already handled by the feed conversion efficiency for each animal product
+	}
+
+	public double getMaxLandUseChange() {
+		return 0.05;
+	}
+
+	public double getMaxIntensity() {
+		return 29.0;
+	}
+
+	public double getTradeBarrier() {
+		return 4;
+	}
+
+	public double getLandChangeEnergy() {
+		return 0.1;
+	}
 
+	public double getMinFeedRate() {
+		return 0.15;
+	}
 }
diff --git a/src/ac/ed/lurg/country/gams/GamsInput.java b/src/ac/ed/lurg/country/gams/GamsInput.java
index c2b77650ae89db778597ab413df815b70d5127e5..787b991032b1c82a1226a2ed354e5a7b1de41bba 100644
--- a/src/ac/ed/lurg/country/gams/GamsInput.java
+++ b/src/ac/ed/lurg/country/gams/GamsInput.java
@@ -5,10 +5,27 @@ import java.util.Map;
 import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.yield.YieldResponses;
 
-public interface GamsInput {
+public class GamsInput {
 	
-	Map<Integer, YieldResponses> getYields();
-	Map<Integer, Map<CropType, Double>> getPreviousCropArea();
+	private Map<Integer, ? extends YieldResponses> yields;
+	private Map<Integer, Map<CropType, Double>> previousCropArea;
+	private GamsCountryInput countryInput;
+		
+	public GamsInput(Map<Integer, ? extends YieldResponses> yields, Map<Integer, Map<CropType, Double>> previousCropArea, GamsCountryInput countryInput) {
+		super();
+		this.yields = yields;
+		this.previousCropArea = previousCropArea;
+		this.countryInput = countryInput;
+	}
 	
-	GamsCountryInput getCountryInput();
+	public Map<Integer, ? extends YieldResponses> getYields() {
+		return yields;
+	}
+	public Map<Integer, Map<CropType, Double>> getPreviousCropArea() {
+		return previousCropArea;
+	}
+	
+	public GamsCountryInput getCountryInput() {
+		return countryInput;
+	}
 }
diff --git a/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java b/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java
index d5a5835ca87dbfcc2ae44c7acd772ef329a9740d..ad0ff148459c719dae9abd32f7a982c2c4460366 100644
--- a/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java
+++ b/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java
@@ -73,7 +73,7 @@ public class GamsLandUseOptimiser {
 		GAMSParameter fert_p = inDB.addParameter("fertParam", 2);
 		GAMSParameter irrig_p = inDB.addParameter("irrigParam", 2);
 
-		for (Entry<Integer, YieldResponses> cropsForALocation : inputData.getYields().entrySet()) {
+		for (Entry<Integer, ? extends YieldResponses> cropsForALocation : inputData.getYields().entrySet()) {
 			Integer locationId = cropsForALocation.getKey();
 			YieldResponses yresp = cropsForALocation.getValue();
 
diff --git a/src/ac/ed/lurg/country/gams/GamsRasterInput.java b/src/ac/ed/lurg/country/gams/GamsRasterInput.java
index 1292d3b0a654dedcd49baaa517042939e0f5deb9..a2a7fdc3dd2ca657d31ae6a1a5ad423b29b56847 100644
--- a/src/ac/ed/lurg/country/gams/GamsRasterInput.java
+++ b/src/ac/ed/lurg/country/gams/GamsRasterInput.java
@@ -4,10 +4,29 @@ import ac.ed.lurg.landuse.LandUse;
 import ac.ed.lurg.yield.YieldRaster;
 import ac.sac.raster.RasterSet;
 
-public interface GamsRasterInput {
+public class GamsRasterInput {
 	
-	YieldRaster getYields();
-	RasterSet<LandUse> getPreviousLandUse();
+	private YieldRaster yields;
+	private RasterSet<LandUse> previousLandUse;
+	private GamsCountryInput countryInput;
 	
-	GamsCountryInput getCountryInput();
+	public GamsRasterInput(YieldRaster yields,
+			RasterSet<LandUse> previousLandUse, GamsCountryInput countryInput) {
+		super();
+		this.yields = yields;
+		this.previousLandUse = previousLandUse;
+		this.countryInput = countryInput;
+	}
+
+	public YieldRaster getYields() {
+		return yields;
+	}
+
+	public RasterSet<LandUse> getPreviousLandUse() {
+		return previousLandUse;
+	}
+
+	public GamsCountryInput getCountryInput() {
+		return countryInput;
+	}
 }
diff --git a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
index 74877b74c9b895c33e024035c35f8dc50f36ae24..39bea1589949454847b00c220fe1863a19862490 100644
--- a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
+++ b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
@@ -17,22 +17,24 @@ import ac.sac.raster.RasterKey;
 
 public class GamsRasterOptimiser {
 	
-	private GamsRasterInput inputData;
+	private GamsRasterInput rasterInputData;
 
-	public GamsRasterOptimiser(GamsRasterInput inputData) {
-		this.inputData = inputData;
+	public GamsRasterOptimiser(GamsRasterInput rasterInputData) {
+		this.rasterInputData = rasterInputData;
 	}
 
 	public GamsRasterOutput run() {
-		// workout similar areas - clustering multi-dimensional data
-		YieldRaster yieldRaster = inputData.getYields();
-		
-		Map<Integer, AveragingYieldResponses> mapping = findSimilarAreas(yieldRaster);
+		// workout similar areas		
+		Map<Integer, AveragingYieldResponses> mapping = findSimilarAreas(rasterInputData.getYields());
+		Map<Integer, Map<CropType, Double>> dummy = null;
 		
 		// create GamsInput using mapping
-		
+		GamsInput gamsInput = new GamsInput(mapping, dummy, rasterInputData.getCountryInput());
+
 		// run optimizer
-		
+		GamsLandUseOptimiser opti = new GamsLandUseOptimiser(gamsInput);		
+		GamsOutput gamsOutput = opti.run();
+
 		// map results back to raster
 		
 		return null;
diff --git a/src/ac/ed/lurg/country/gams/GamsTest.java b/src/ac/ed/lurg/country/gams/GamsTest.java
index e5e1c8d448f447e4646e59b839a69943a2e811a3..c72ca4b3c95f437cb19cb54b50489a8ca512b243 100644
--- a/src/ac/ed/lurg/country/gams/GamsTest.java
+++ b/src/ac/ed/lurg/country/gams/GamsTest.java
@@ -8,7 +8,7 @@ import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.types.YieldType;
 import ac.ed.lurg.yield.YieldResponses;
 
-public class GamsTest implements GamsInput, GamsCountryInput {
+public class GamsTest {
 	
 	public static void main(String[] args)  {
 		GamsTest aGamsTest = new GamsTest();
@@ -16,11 +16,13 @@ public class GamsTest implements GamsInput, GamsCountryInput {
 	}
 	
 	private void run() {
-		GamsLandUseOptimiser opti = new GamsLandUseOptimiser(this);		
-		opti.run();
+		GamsCountryInput countryLevelInputs = new GamsCountryInput(getProjectedDemand(), getWorldInputEnergy(), getMaxNetImport(), getMinNetImport());
+		GamsInput gamsInput = new GamsInput(getYields(), getPreviousCropArea(), countryLevelInputs);
+		
+		GamsLandUseOptimiser opti = new GamsLandUseOptimiser(gamsInput);		
+		GamsOutput gamsOutput = opti.run();
 	}
 
-	@Override
 	public Map<CropType, Double> getProjectedDemand() {
 		Map<CropType, Double> dummyMap = new HashMap<CropType, Double>();
 		dummyMap.put(CropType.CEREALS, 300.0);
@@ -35,7 +37,6 @@ public class GamsTest implements GamsInput, GamsCountryInput {
 	}
 
 	
-	@Override
 	public Map<Integer, YieldResponses> getYields() {
 		
 		YieldResponses yresp = new YieldResponses();
@@ -57,7 +58,6 @@ public class GamsTest implements GamsInput, GamsCountryInput {
 		return returnMap;
 	}
 	
-	@Override
 	public Map<Integer, Map<CropType, Double>> getPreviousCropArea() {
 		Map<CropType, Double> dummyMap = new HashMap<CropType, Double>();
 		dummyMap.put(CropType.CEREALS, 9.0);
@@ -77,7 +77,6 @@ public class GamsTest implements GamsInput, GamsCountryInput {
 		return returnMap;
 	}
 
-	@Override
 	public Map<CropType, Double> getWorldInputEnergy() {
 		Map<CropType, Double> dummyMap = new HashMap<CropType, Double>();
 		dummyMap.put(CropType.CEREALS, 0.4);
@@ -91,7 +90,6 @@ public class GamsTest implements GamsInput, GamsCountryInput {
 		return dummyMap;
 	}
 
-	@Override
 	public Map<CropType, Double> getMaxNetImport() {
 		Map<CropType, Double> dummyMaxExports = new HashMap<CropType, Double>();
 		dummyMaxExports.put(CropType.CEREALS, 24.0);
@@ -105,7 +103,6 @@ public class GamsTest implements GamsInput, GamsCountryInput {
 		return dummyMaxExports;
 	}
 
-	@Override
 	public Map<CropType, Double> getMinNetImport() {
 		Map<CropType, Double> dummyMaxExports = new HashMap<CropType, Double>();
 		dummyMaxExports.put(CropType.CEREALS, -24.0);
@@ -118,39 +115,4 @@ public class GamsTest implements GamsInput, GamsCountryInput {
 		dummyMaxExports.put(CropType.TREENUTS, -5.0);
 		return dummyMaxExports;
 	}
-
-	@Override
-	public double getMeatEfficiency() {
-		return 1;  // this is already handled by the feed conversion efficiency for each animal product
-	}
-
-	@Override
-	public double getMaxLandUseChange() {
-		return 0.05;
-	}
-
-	@Override
-	public double getMaxIntensity() {
-		return 29.0;
-	}
-
-	@Override
-	public double getTradeBarrier() {
-		return 4;
-	}
-
-	@Override
-	public double getLandChangeEnergy() {
-		return 0.1;
-	}
-
-	@Override
-	public double getMinFeedRate() {
-		return 0.15;
-	}
-
-	@Override
-	public GamsCountryInput getCountryInput() {
-		return this;
-	}
 }