diff --git a/pykat/finesse.py b/pykat/finesse.py
index 20175f59441d855687d3f190d391e02d34c47618..443daa9ff36e7025e5b458bb0491c5981d40cc86 100644
--- a/pykat/finesse.py
+++ b/pykat/finesse.py
@@ -34,7 +34,7 @@ import pykat
 import warnings
 import re
 
-from pykat.exceptions import *
+import pykat.exceptions as pkex
 
 from pykat.node_network import NodeNetwork
 from pykat.detectors import Detector
@@ -77,8 +77,39 @@ class katRun(object):
             else:
                 return self.y[:, idx]
         else:
-            raise pkex.BasePyKatExeception("No output by the name {0} found", value)
-            
+            raise  pkex.BasePyKatException("No output by the name {0} found", value)
+      
+class katRun2D(object):
+    def __init__(self):
+        self.runDateTime = datetime.datetime.now()
+        self.x = None
+        self.y = None
+        self.z = None
+        self.xlabel = None
+        self.ylabel = None
+        self.zlabels = None
+        self.katScript = None
+        self.katVersion = None
+        
+    def saveKatRun(self, filename):
+        with open(filename,'w') as outfile:
+            pickle.dump(self, outfile)
+    
+    @staticmethod
+    def loadKatRun(filename):
+        with open(filename,'r') as infile:
+            return pickle.load(infile)
+    
+    def get(self, value): return self[value]
+    
+    def __getitem__(self, value):
+        idx = [i for i in range(len(self.zlabels)) if self.zlabels[i].split(" ")[0] == value]
+        
+        if len(idx) > 0:
+            return self.z[:, idx].squeeze()
+        else:
+            raise  pkex.BasePyKatException("No output by the name {0} found".format(value))
+      
 class Block:
     def __init__(self, name):
         self.__name = name
@@ -270,13 +301,10 @@ class kat(object):
         It returns a katRun object which is populated with the various
         data from the simulation run.
         """
-        try:
-            print "--------------------------------------------------------------"
-            start = datetime.datetime.now()
-            print "Running kat - Started at " + str(start)
-            
-            r = katRun()
-            r.katScript = "".join(self.generateKatScript())       
+        
+        try:        
+            if not hasattr(self, "xaxis"):
+                raise pkex.BasePyKatException("No xaxis was defined")
             
             if len(self.__katdir) == 0:
                 # Get the environment variable for where Finesse is stored
@@ -300,6 +328,17 @@ class kat(object):
             # check if kat file exists and it is executable by user        
             if not (os.path.isfile(kat_exec) and os.access(kat_exec, os.X_OK)):
                 raise MissingFinesse()
+                
+            print "--------------------------------------------------------------"
+            start = datetime.datetime.now()
+            print "Running kat - Started at " + str(start)
+            
+            if hasattr(self, "x2axis"):
+                r = katRun2D()
+            else:
+                r = katRun()
+                
+            r.katScript = "".join(self.generateKatScript())   
             
             # create a kat file which we will write the script into
             if self.__tempname == None:
@@ -361,11 +400,6 @@ class kat(object):
             root = os.path.splitext(katfile.name)
             base = os.path.basename(root[0])            
             outfile = root[0] + ".out"
-                    
-            [r.x,r.y,hdr] = self.readOutFile(outfile)
-            
-            r.xlabel = hdr[0]
-            r.ylabels = map(str.strip, hdr[1:])
             
             if save_output:        
                 newoutfile = "{0}.out".format(base)
@@ -378,8 +412,20 @@ class kat(object):
                     
                 os.rename(outfile, newoutfile)
 
-                print "Output data saved to '{0}'".format(newoutfile)
+                print "\nOutput data saved to '{0}'".format(newoutfile)
+            
+            if hasattr(self, "x2axis"):
+                [r.x,r.y,r.z,hdr] = self.readOutFile(outfile)
                 
+                r.xlabel = hdr[0]
+                r.ylabel = hdr[1]
+                r.zlabels = map(str.strip, hdr[2:])
+            else:
+                [r.x,r.y,hdr] = self.readOutFile(outfile)
+            
+                r.xlabel = hdr[0]
+                r.ylabels = map(str.strip, hdr[1:])
+                            
             if save_kat:
                 if kat_name == None:
                     kat_name = "pykat_output"                
@@ -452,29 +498,38 @@ class kat(object):
 
     def readOutFile(self, filename):
         
-        outfile = open(filename,'r')
-        
-        # read first to lines to get to header line
-        outfile.readline()
-        outfile.readline()
+        with open(filename,'r') as outfile:
+            # read first to lines to get to header line
+            outfile.readline()
+            outfile.readline()
+            
+            hdr = outfile.readline().replace('%','').replace('\n','').split(',')
         
-        hdr = outfile.readline().replace('%','').replace('\n','').split(',')
-
-        data = np.loadtxt(filename,comments='%')
-        shape_len = len(data.shape)
+        data = np.loadtxt(filename,comments='%',skiprows=4)
         
-        if shape_len > 1:
-            rows,cols = data.shape
-            x = data[:,0]
-            y = data[:,1:cols].squeeze()
+        if hasattr(self, "x2axis"):
+            # need to parse 2D outputs slightly different as they are effectively 2D matrices
+            # written in linear form
+            x = data[0::(1+self.x2axis.steps),0]
+            y = data[0:(1+self.x2axis.steps),1]
+            z = data[:,2:].transpose().reshape(data.shape[1]-2, 1+self.xaxis.steps, 1+self.x2axis.steps)
+            
+            return [x, y, z, hdr]
         else:
-            rows = 1
-            cols = data.shape[0]
+            shape_len = len(data.shape)
             
-            x = data[0]
-            y = data[1:cols].squeeze()
-        
-        return [x, y, hdr]
+            if shape_len > 1:
+                rows,cols = data.shape
+                x = data[:,0]
+                y = data[:,1:cols].squeeze()
+            else:
+                rows = 1
+                cols = data.shape[0]
+                
+                x = data[0]
+                y = data[1:cols].squeeze()
+            
+            return [x, y, hdr]
             
     def generateKatScript(self) :
         """ Generates the kat file which can then be run """