diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java
index 124f774fd3e375f0e7854d4220ac5ff7fe916a70..f78d8bc2b5f0779c5c96f46d95e6ff176ef4a0a5 100644
--- a/src/ac/ed/lurg/ModelMain.java
+++ b/src/ac/ed/lurg/ModelMain.java
@@ -33,10 +33,9 @@ import ac.ed.lurg.demand.DemandManagerFromFile;
 import ac.ed.lurg.demand.DemandManagerSSP;
 import ac.ed.lurg.landuse.CropUsageData;
 import ac.ed.lurg.landuse.CropUsageReader;
-import ac.ed.lurg.landuse.IrrigationConstraintReader;
 import ac.ed.lurg.landuse.IrrigationItem;
 import ac.ed.lurg.landuse.IrrigationMaxAmountReader;
-import ac.ed.lurg.landuse.IrrigiationCostReader;
+import ac.ed.lurg.landuse.IrrigationRasterSet;
 import ac.ed.lurg.landuse.LandCoverItem;
 import ac.ed.lurg.landuse.LandCoverReader;
 import ac.ed.lurg.landuse.LandUseItem;
@@ -75,7 +74,7 @@ public class ModelMain {
 	private Map<CropType, GlobalPrice> prevWorldPrices;
 	private Map<CropType, Double> prevStockLevel;
 	private RasterSet<LandUseItem> prevLandUseRaster;
-	private RasterSet<IrrigationItem> currentIrrigationData;
+	private IrrigationRasterSet currentIrrigationData;
 	private RasterSet<LandUseItem> globalLandUseRaster;
 	private RasterSet<IntegerRasterItem> clusterIdRaster;
 
@@ -99,7 +98,7 @@ public class ModelMain {
 		
 		tradeManager = new TradeManager(compositeCountryManager);
 		fpuManager = new FPUManager(desiredProjection);
-		currentIrrigationData = getFixedIrrigationData();
+		currentIrrigationData = new IrrigationRasterSet(desiredProjection);
 		countryBoundaryRaster = getCountryBoundaryRaster();
 		clusterIdRaster = (ModelConfig.IS_CALIBRATION_RUN) ? new RasterSet<IntegerRasterItem>(desiredProjection) : getClusterRaster();
 
@@ -550,29 +549,16 @@ public class ModelMain {
 		LPJYieldResponseMapReader yieldReader = new LPJYieldResponseMapReader(desiredProjection);
 		return yieldReader.getRasterData(timestep); 
 	}
-
-	/** Get irrigation data components that don't change over time */
-	private RasterSet<IrrigationItem> getFixedIrrigationData() {	
-		RasterSet<IrrigationItem> irigData = new RasterSet<IrrigationItem>(desiredProjection) {
-			private static final long serialVersionUID = 8393130687550888654L;
-			protected IrrigationItem createRasterData() {
-				return new IrrigationItem();
-			}
-		};
-
-		new IrrigiationCostReader(irigData).getRasterDataFromFile(ModelConfig.IRRIGATION_COST_FILE);
-	//	new IrrigationConstraintReader(irigData).getRasterDataFromFile(ModelConfig.IRRIGATION_CONSTRAINT_FILE);
-		return irigData;
-	}
 	
 
 	private RasterSet<IrrigationItem> getUpdateIrrigationData(Timestep timestep, YieldRaster yieldSurfaces) {		
 		String rootDir = timestep.getYearSubDir(ModelConfig.YIELD_DIR);
 		new IrrigationMaxAmountReader(currentIrrigationData, yieldSurfaces).getRasterDataFromFile(rootDir + File.separator + ModelConfig.IRRIG_MAX_WATER_FILENAME);
 		new RunOffReader(currentIrrigationData).getRasterDataFromFile(rootDir + File.separator + ModelConfig.IRRIG_RUNOFF_FILE);
-		fpuManager.handleFPU(currentIrrigationData, timestep); //this is altering currentIrrigationData irrigConstraint(s) based on runoff and industrial use through time 
+		currentIrrigationData.updateConstraintByFPU(fpuManager, timestep);
 		return currentIrrigationData;
 	}
+	
 	private Map<CropType,Double> getInitialStockLevels(){
 		Map<CropType, Double> initialStockLevels = new StockReader().read();
 		initialStockLevels.put(CropType.ENERGY_CROPS, 0.0);
diff --git a/src/ac/ed/lurg/country/CountryAgent.java b/src/ac/ed/lurg/country/CountryAgent.java
index f502e89449afbe7808d825dd6204ff1fc332f052..bc9c8d816ae41ba2d47b14be70af4d5c2842fde5 100644
--- a/src/ac/ed/lurg/country/CountryAgent.java
+++ b/src/ac/ed/lurg/country/CountryAgent.java
@@ -14,7 +14,6 @@ import ac.ed.lurg.country.gams.GamsRasterInput;
 import ac.ed.lurg.country.gams.GamsRasterOptimiser;
 import ac.ed.lurg.country.gams.GamsRasterOutput;
 import ac.ed.lurg.demand.AbstractDemandManager;
-import ac.ed.lurg.demand.DemandManagerSSP;
 import ac.ed.lurg.landuse.CropUsageData;
 import ac.ed.lurg.landuse.IrrigationItem;
 import ac.ed.lurg.landuse.LandUseItem;
diff --git a/src/ac/ed/lurg/landuse/FPUBoundaryReader.java b/src/ac/ed/lurg/landuse/FPUBoundaryReader.java
index a99d406b115894d3535d63648b445297028f9383..0f38487c0add927d033f65091680bf555ee78ba5 100644
--- a/src/ac/ed/lurg/landuse/FPUBoundaryReader.java
+++ b/src/ac/ed/lurg/landuse/FPUBoundaryReader.java
@@ -1,7 +1,5 @@
 package ac.ed.lurg.landuse;
 
-import java.util.Map;
-
 import ac.sac.raster.AbstractRasterReader;
 import ac.sac.raster.IntegerRasterItem;
 import ac.sac.raster.RasterSet;
diff --git a/src/ac/ed/lurg/landuse/FPUManager.java b/src/ac/ed/lurg/landuse/FPUManager.java
index f2000bb613a5cd5f2b54a2e8c0877e434dd7d12d..41a38764ed02865417bd6ea7ec749e5e9a49207e 100644
--- a/src/ac/ed/lurg/landuse/FPUManager.java
+++ b/src/ac/ed/lurg/landuse/FPUManager.java
@@ -4,13 +4,11 @@ import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import ac.ed.lurg.ModelConfig;
-import ac.ed.lurg.Timestep;
 import ac.ed.lurg.utils.CollectionHelper;
 import ac.ed.lurg.utils.LazyHashMap;
 import ac.ed.lurg.utils.LogWriter;
@@ -97,50 +95,5 @@ public class FPUManager {
 		return keys;
 	}
 	
-	public void handleFPU(RasterSet<IrrigationItem> allIrrigData, Timestep timestep) {
-
-		Collection<RasterKey> fpuKeys;
-		Collection<IntegerRasterItem> keyset = fpuMap.keySet();
-
-		int yearsOfIrrigChange = (timestep.getTimestep() - ModelConfig.START_TIMESTEP) * ModelConfig.TIMESTEP_SIZE;
-		double waterAvailabilityAdj = 1.0 + yearsOfIrrigChange * ModelConfig.WATER_AVAILIBILITY_RATE_OF_CHANGE;
-		int year = timestep.getYear();
-		
-		for (IntegerRasterItem fpu : keyset) {
-				
-			fpuKeys =getKeysFor(fpu);
-			RasterSet<IrrigationItem> irrigData = allIrrigData.createSubsetForKeys(fpuKeys);
-			double fpuRunOff = 0.0;
-			double otherUses = 0.0;
-			double waterAvailForIrrigPerCell = 0.0;
-			int cellCount = 0;
-			
-			
-			for (Map.Entry<RasterKey, IrrigationItem> entry : irrigData.entrySet()) {
-
-				if (entry.getValue() != null) {
-					fpuRunOff += entry.getValue().getRunOff()*fpuBoundaries.getAreaMha(entry.getKey())*0.01;
-			
-					cellCount++;
-				}
-				
-			}
-
-			Double fpuRunOffAvailable = fpuRunOff*0.4 * ModelConfig.ENVIRONMENTAL_WATER_CONSTRAINT; //0.4 from elliott paper
-			
-			otherUses = fpuOtherUses.get(fpu.getInt()).get(year) * waterAvailabilityAdj;
-			if (fpuRunOffAvailable - otherUses < 0){
-				waterAvailForIrrigPerCell = 0;
-			}
-			else waterAvailForIrrigPerCell = (fpuRunOffAvailable - otherUses) / cellCount;
-		
-			for (Map.Entry<RasterKey, IrrigationItem> entry : irrigData.entrySet()) {
-				if (entry.getValue() != null) {
-					entry.getValue().setIrrigConstraint(waterAvailForIrrigPerCell);
-				}
-			}
-
-		}
-
-	}
+	
 }
diff --git a/src/ac/ed/lurg/landuse/IrrigationRasterSet.java b/src/ac/ed/lurg/landuse/IrrigationRasterSet.java
new file mode 100644
index 0000000000000000000000000000000000000000..fffedff6d2533a312b9fd3281e709c6294c162f7
--- /dev/null
+++ b/src/ac/ed/lurg/landuse/IrrigationRasterSet.java
@@ -0,0 +1,79 @@
+package ac.ed.lurg.landuse;
+
+import java.util.Collection;
+import java.util.Map;
+
+import ac.ed.lurg.ModelConfig;
+import ac.ed.lurg.Timestep;
+import ac.sac.raster.IntegerRasterItem;
+import ac.sac.raster.RasterHeaderDetails;
+import ac.sac.raster.RasterKey;
+import ac.sac.raster.RasterSet;
+
+public class IrrigationRasterSet extends RasterSet<IrrigationItem>{
+	
+	private static final long serialVersionUID = 4794790389538053286L;
+
+	public IrrigationRasterSet(RasterHeaderDetails header) {
+		super(header);
+		new IrrigiationCostReader(this).getRasterDataFromFile(ModelConfig.IRRIGATION_COST_FILE); //this isn't very nice in here...
+	}
+
+	
+	protected IrrigationItem createRasterData() {
+		return new IrrigationItem();
+	}
+	
+	public void updateConstraintByFPU(FPUManager fpuManager, Timestep timestep) {
+
+		Collection<RasterKey> fpuKeys;
+		Collection<IntegerRasterItem> keyset = fpuManager.fpuMap.keySet();
+
+		int yearsOfIrrigChange = (timestep.getTimestep() - ModelConfig.START_TIMESTEP) * ModelConfig.TIMESTEP_SIZE;
+		double waterAvailabilityAdj = 1.0 + yearsOfIrrigChange * ModelConfig.WATER_AVAILIBILITY_RATE_OF_CHANGE;
+		int year = timestep.getYear();
+		
+		
+		
+		for (IntegerRasterItem fpu : keyset) {
+				
+			fpuKeys =fpuManager.getKeysFor(fpu);
+			RasterSet<IrrigationItem> irrigData = this.createSubsetForKeys(fpuKeys);
+			double fpuRunOff = 0.0;
+			double otherUses = 0.0;
+			double waterAvailForIrrigPerCell = 0.0;
+			int cellCount = 0;
+			
+			for (Map.Entry<RasterKey, IrrigationItem> entry : irrigData.entrySet()) {
+
+				
+				if (entry.getValue() != null) {
+					fpuRunOff += entry.getValue().getRunOff()*fpuManager.fpuBoundaries.getAreaMha(entry.getKey())*0.01;
+					
+					cellCount++;
+				}
+				
+			}
+
+			Double fpuRunOffAvailable = fpuRunOff*0.4 * ModelConfig.ENVIRONMENTAL_WATER_CONSTRAINT; //0.4 from elliott paper
+			
+			
+			otherUses = fpuManager.fpuOtherUses.get(fpu.getInt()).get(year) * waterAvailabilityAdj;
+			if (fpuRunOffAvailable - otherUses < 0){
+				waterAvailForIrrigPerCell = 0;
+			}
+			else waterAvailForIrrigPerCell = (fpuRunOffAvailable - otherUses) / cellCount;
+		
+			for (Map.Entry<RasterKey, IrrigationItem> entry : irrigData.entrySet()) {
+				if (entry.getValue() != null) {
+					entry.getValue().setIrrigConstraint(waterAvailForIrrigPerCell);
+					
+				}
+			}
+
+		}
+
+	}
+
+
+}