Index: plottools/src/danse/common/plottools/PlotPanel.py
===================================================================
--- plottools/src/danse/common/plottools/PlotPanel.py	(revision ca586546279b3693bffdf86a420f087c8b14d5d7)
+++ plottools/src/danse/common/plottools/PlotPanel.py	(revision 4a4164c633bdb96dccfc304d13589ff77b7174e5)
@@ -324,5 +324,5 @@
         Set the resizing (True/False)
         """
-        pass # Not impleeted
+        pass # Not implemented
     
     def schedule_full_draw(self, func='append'):    
@@ -330,5 +330,5 @@
         Put self in schedule to full redraw list
         """
-        pass # Not implemeted
+        pass # Not implemented
     
     def add_toolbar(self):
@@ -1425,4 +1425,5 @@
                    cmap=self.cmap, zmin=zmin_2D_temp,
                    zmax=zmax_2D_temp)
+        self.figure.canvas.draw_idle()
       
     def image(self, data, qx_data, qy_data, xmin, xmax, ymin, ymax, 
@@ -1479,12 +1480,15 @@
             im = self.subplot.imshow(output, interpolation='nearest', 
                                      origin='lower',
-                                     #vmin=zmin_temp, vmax=self.zmax_2D,
-                                     cmap=self.cmap)#, 
-                                     #extent=(self.xmin_2D, self.xmax_2D,
-                                     #           self.ymin_2D, self.ymax_2D))
+                                     vmin=zmin_temp, vmax=self.zmax_2D,
+                                     cmap=self.cmap, 
+                                     extent=(self.xmin_2D, self.xmax_2D,
+                                                self.ymin_2D, self.ymax_2D))
+            
             cbax = self.subplot.figure.add_axes([0.84,0.2,0.02,0.7])
         else:
             # clear the previous 2D from memory
-            self.subplot.figure.clf()
+            # mpl is not clf, so we do
+            self.subplot.figure.clear()
+
             self.subplot.figure.subplots_adjust(left=0.1, right=.8, bottom=.1)  
             try:
@@ -1501,10 +1505,11 @@
             Y = self.y_bins[0:-1]
             X, Y = numpy.meshgrid(X, Y)
-    
+            if len(X) > 60:
+                ax.disable_mouse_rotation()
             im = ax.plot_surface(X, Y, output, rstride=1, cstride=1, cmap=cmap,
                                    linewidth=0, antialiased=False)
             #ax.set_zlim3d(zmin_temp, self.zmax_2D)
             #ax.set_frame_on(False)
-            self.subplot.set_axis_off()    
+            self.subplot.set_axis_off()  
             
         if cbax == None:
@@ -1514,7 +1519,4 @@
         cb.update_bruteforce(im)
         cb.set_label('$' + self.scale + '$')
-        
-        #if self.dimension != 3:
-        self.figure.canvas.draw_idle()
     
     def _build_matrix(self):
Index: plottools/src/danse/common/plottools/canvas.py
===================================================================
--- plottools/src/danse/common/plottools/canvas.py	(revision 7434020a097527ae6efc0f0e238d753b17df8b04)
+++ plottools/src/danse/common/plottools/canvas.py	(revision 4a4164c633bdb96dccfc304d13589ff77b7174e5)
@@ -130,4 +130,5 @@
         self.xaxis = None
         self.yaxis = None
+        self.ndraw = 0
         # Support for mouse wheel
         self.Bind(wx.EVT_MOUSEWHEEL, self._onMouseWheel)
@@ -166,4 +167,7 @@
         """
         # Check resize whether or not True
+        if self.panel.dimension == 3:
+            return
+
         # This is for fast response when plot is being resized
         if not self.resizing:
@@ -191,8 +195,8 @@
         # Only draw if window is shown, otherwise graph will bleed through
         # on the notebook style AUI widgets.
+        #    raise
         fig = FigureCanvasWxAgg
-        if self.IsShownOnScreen():
+        if self.IsShownOnScreen() and self.ndraw != 1:
             self._isRendered = True
-            #self.panel.parent.refresh_floating(self.panel)
             self._get_axes_switch()
             #import time
@@ -207,5 +211,7 @@
         else:
             self._isRendered = False
-   
+        if self.ndraw <= 1:
+            self.ndraw += 1
+        
     def _onMouseWheel(self, evt):
         """Translate mouse wheel events into matplotlib events"""
Index: sansguiframe/src/sans/guiframe/local_perspectives/plotting/masking.py
===================================================================
--- sansguiframe/src/sans/guiframe/local_perspectives/plotting/masking.py	(revision 602645dd1f7689575ddc32a373329991f1732869)
+++ sansguiframe/src/sans/guiframe/local_perspectives/plotting/masking.py	(revision 4a4164c633bdb96dccfc304d13589ff77b7174e5)
@@ -18,4 +18,5 @@
 import wx
 import sys
+import time
 import pylab
 import math
@@ -43,5 +44,41 @@
     FONT_VARIANT = 1
     
-
+from data_util.calcthread import CalcThread
+
+class CalcPlot(CalcThread):
+    """
+    Compute Resolution
+    """
+    def __init__(self,
+                 id = -1,
+                 panel = None,
+                 image = None,
+                 completefn = None,
+                 updatefn   = None,
+                 elapsed = 0,
+                 yieldtime  = 0.01,
+                 worktime   = 0.01
+                 ):
+        """
+        """
+        CalcThread.__init__(self,completefn,
+                 updatefn,
+                 yieldtime,
+                 worktime)
+        self.starttime = 0
+        self.id = id 
+        self.panel = panel
+        self.image = image
+        
+        
+    def compute(self):
+        """
+        excuting computation
+        """
+        elapsed = time.time() - self.starttime
+       
+        self.complete(panel=self.panel, image=self.image, elapsed=elapsed)
+        
+        
 class MaskPanel(wx.Dialog):
     """
@@ -519,7 +556,8 @@
     window_caption = "Plot"
     ## Flag to tell the AUI manager to put this panel in the center pane
-    CENTER_PANE = True
+    CENTER_PANE = False
+    ID = wx.NewId()
     def __init__(self, parent=None, base=None, 
-                 data=None, dimension=1, id=-1, *args, **kwds):
+                 data=None, dimension=1, id=ID, *args, **kwds):
         kwds["style"] = wx.DEFAULT_DIALOG_STYLE
         kwds["size"] = wx.Size(_STATICBOX_WIDTH*1.5, PANEL_SIZE*1.5) 
@@ -552,10 +590,27 @@
                 self.newplot = Data2D(image=self.data.data)
                 self.newplot.setValues(self.data)
-                
-            self.plotpanel.add_image(self.newplot) 
+                    # Compute and get the image plot
+            self.get_plot()
+            #self.plotpanel.add_image(self.newplot) 
             self.Centre()
             self.Layout()
-
-            
+    
+    def get_plot(self):
+        """
+        Get Plot panel
+        """
+        cal_plot = CalcPlot(panel=self.plotpanel, 
+                                   image=self.newplot, 
+                                   completefn=self.complete)
+        cal_plot.queue()
+    
+    def complete(self, panel, image, elapsed=None):
+        """
+        Plot image
+        
+        :param image: newplot [plotpanel]
+        """
+        wx.CallAfter(panel.add_image, image) 
+        
     def _setup_layout(self):
         """
@@ -566,4 +621,6 @@
         if self.dimension == 3:
             note = "Note: I am very SLOW.     Please be PATIENT...\n"
+            if len(self.data.data) > 3600:
+                note += "Rotation disabled for pixels > 60x60."
             note_txt = wx.StaticText(self, -1, note) 
             note_txt.SetForegroundColour(wx.RED)
@@ -610,4 +667,5 @@
         try:
             self.plotpanel.subplot.figure.clf()
+            self.plotpanel.close()
         except:
             # when called by data panel
@@ -678,9 +736,7 @@
         self._status_info(msg, status_type)
         status_type = 'stop'           
-        
         self.graph.render(self)
-        if self.dimension == 3:
-            pass
-        else:
+        if self.dimension < 3:
+            self.graph.render(self)
             self.subplot.figure.canvas.draw_idle()
         msg = 'Plotting Completed.'
