Index: src/sas/sasgui/guiframe/report_dialog.py
===================================================================
--- src/sas/sasgui/guiframe/report_dialog.py	(revision 91552b528f8c52835ef769f59e30707071f7f9b9)
+++ src/sas/sasgui/guiframe/report_dialog.py	(revision d0ce666faaf0f9284be2e607a0ac846cdd9a682b)
@@ -7,4 +7,5 @@
 import sys
 import wx.html as html
+from sas.sasgui.guiframe.report_image_handler import ReportImageHandler
 
 logger = logging.getLogger(__name__)
@@ -70,4 +71,6 @@
         button_close = wx.Button(self, wx.ID_OK, "Close")
         button_close.SetToolTipString("Close this report window.")
+        button_close.Bind(wx.EVT_BUTTON, self.onClose,
+                          id=button_close.GetId())
         hbox.Add(button_close)
         button_close.SetFocus()
@@ -117,5 +120,5 @@
 
 
-    def OnClose(self, event=None):
+    def onClose(self, event=None):
         """
         Close the Dialog
@@ -123,7 +126,7 @@
         """
         for fig in self.fig_urls:
-            self.imgRAM.RemoveFile(fig)
+            ReportImageHandler.remove_figure(fig)
 
-        self.Close()
+        self.Destroy()
 
     def HTML2PDF(self, data, filename):
Index: src/sas/sasgui/guiframe/report_image_handler.py
===================================================================
--- src/sas/sasgui/guiframe/report_image_handler.py	(revision d0ce666faaf0f9284be2e607a0ac846cdd9a682b)
+++ src/sas/sasgui/guiframe/report_image_handler.py	(revision d0ce666faaf0f9284be2e607a0ac846cdd9a682b)
@@ -0,0 +1,81 @@
+import wx
+import logging
+
+logger = logging.getLogger(__name__)
+
+
+class ReportImageHandler:
+    # Singleton class that manages all report plot images
+    # To call the handler, call the static method set_figs
+
+    class _ReportImageHandler:
+
+        def __init__(self):
+            wx.FileSystem.AddHandler(wx.MemoryFSHandler())
+            self.img_holder = wx.MemoryFSHandler()
+            self.refs = {}
+            self.indices = []
+
+        def set_figs(self, figs, bitmaps, perspective):
+            """
+            Save figures and images to memory and return refernces
+            :param figs: A list of matplotlib Figures
+            :param bitmaps: A list of bitmaps
+            :param perspective: A String with the perspective name
+            :return: A tuple of a list of Figures and a list of memory refs
+            """
+            imgs = []
+            refs = []
+            if figs is None or len(figs) == 0:
+                figs = [None]
+            for fig in figs:
+                if fig is not None:
+                    ind = figs.index(fig)
+                    bitmap = bitmaps[ind]
+
+                # name of the fig
+                name = self.create_unique_name(perspective)
+                # AddFile, image can be retrieved with 'memory:filename'
+                ref = 'memory:' + name
+                self.refs[ref] = fig
+                self.img_holder.AddFile(name, bitmap, wx.BITMAP_TYPE_PNG)
+                refs.append(ref)
+                imgs.append(fig)
+            return imgs, refs
+
+        def create_unique_name(self, perspective, index=None):
+            """
+            Create a unique key for each item in memory
+            :param perspective: The perspective name as a string
+            :param index: The base index used for incrementing the name
+            :return: A unique file name not currently in use
+            """
+            if not index:
+                index = len(self.indices)
+            if index in self.indices:
+                name = self.create_unique_name(index + 1)
+            else:
+                self.indices.append(index)
+                name = 'img_{}_{:03d}.png'.format(str(perspective), index)
+            return name
+
+    instance = None
+
+    @staticmethod
+    def check_for_empty_instance():
+        if ReportImageHandler.instance is None:
+            ReportImageHandler.instance = \
+                ReportImageHandler._ReportImageHandler()
+
+    @staticmethod
+    def set_figs(figs, bitmaps, perspective):
+        ReportImageHandler.check_for_empty_instance()
+        return ReportImageHandler.instance.set_figs(figs, bitmaps, perspective)
+
+    @staticmethod
+    def remove_figure(fig_url):
+        try:
+            ReportImageHandler.check_for_empty_instance()
+            ReportImageHandler.instance.refs.pop(fig_url)
+        except Exception as e:
+            logger.warn(e)
Index: src/sas/sasgui/perspectives/fitting/basepage.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/basepage.py	(revision b43988196e5c4f2dfbf3ec5c9b66703d5656b08d)
+++ src/sas/sasgui/perspectives/fitting/basepage.py	(revision b43988196e5c4f2dfbf3ec5c9b66703d5656b08d)
@@ -31,4 +31,5 @@
 
 from sas.sasgui.guiframe.panel_base import PanelBase
+from sas.sasgui.guiframe.report_image_handler import ReportImageHandler
 from sas.sasgui.guiframe.utils import format_number, check_float, IdList, \
     check_int
@@ -651,34 +652,10 @@
         by plotting, putting it into wx.FileSystem image object
         """
-        images = []
-        refs = []
-
-        # For no figures in the list, prepare empty plot
-        if figs is None or len(figs) == 0:
-            figs = [None]
-
-        # Loop over the list of figures
-        # use wx.MemoryFSHandler
-        imgRAM = wx.MemoryFSHandler()
-        for fig in figs:
-            if fig is not None:
-                ind = figs.index(fig)
-                canvas = canvases[ind]
-
-            # store the image in wx.FileSystem Object
-            wx.FileSystem.AddHandler(wx.MemoryFSHandler())
-
-            # index of the fig
-            ind = figs.index(fig)
-
-            # AddFile, image can be retrieved with 'memory:filename'
-            name = 'img_fit%s.png' % ind
-            refs.append('memory:' + name)
-            imgRAM.AddFile(name, canvas.bitmap, wx.BITMAP_TYPE_PNG)
-            # append figs
-            images.append(fig)
-
-        return imgRAM, images, refs
-
+        bitmaps = []
+        for canvas in canvases:
+            bitmaps.append(canvas.bitmap)
+        imgs, refs = ReportImageHandler.set_figs(figs, bitmaps, 'fit')
+
+        return ReportImageHandler.instance, imgs, refs
 
     def on_save(self, event):
Index: src/sas/sasgui/perspectives/fitting/report_dialog.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/report_dialog.py	(revision 69a68979fe94b8f135a602e7f02b162e34616d53)
+++ src/sas/sasgui/perspectives/fitting/report_dialog.py	(revision 44e8f48e6ada97db8eb483009edc07705c6329a2)
@@ -72,14 +72,12 @@
         filename = basename + ext
 
-        # save figures
-        pictures = []
-        for num in range(self.nimages):
-            pic_name = basename + '_img%s.png' % num
-            # save the image for use with pdf writer
-            self.report_list[2][num].savefig(pic_name)
-            pictures.append(pic_name)
+        # save the images for use with pdf writer
+        pictures = [
+            '_'.join((basename, url.split(':')[1])) for url in self.fig_urls]
+        for i, pic in enumerate(pictures):
+            self.report_list[2][i].savefig(pic)
 
         # translate png references int html from in-memory name to on-disk name
-        html = self.report_html.replace("memory:img_fit", basename+'_img')
+        html = self.report_html.replace("memory:", basename+'_')
 
         #set file extensions
Index: src/sas/sasgui/perspectives/invariant/invariant_panel.py
===================================================================
--- src/sas/sasgui/perspectives/invariant/invariant_panel.py	(revision 2469df7fc9ffa047115c5bffe589ed307b12c363)
+++ src/sas/sasgui/perspectives/invariant/invariant_panel.py	(revision 44e8f48e6ada97db8eb483009edc07705c6329a2)
@@ -24,4 +24,5 @@
 from sas.sasgui.guiframe.panel_base import PanelBase
 from sas.sasgui.guiframe.documentation_window import DocumentationWindow
+from sas.sasgui.guiframe.report_image_handler import ReportImageHandler
 
 logger = logging.getLogger(__name__)
@@ -783,5 +784,8 @@
         report_img = self.state.image
         report_list = [report_html_str, report_text_str, report_img]
-        dialog = ReportDialog(report_list, None, -1, "")
+        ReportImageHandler.check_for_empty_instance()
+        imgRAM = ReportImageHandler.instance.img_holder
+        refs = [self.state.wximgbmp]
+        dialog = ReportDialog(report_list, imgRAM, refs, None, wx.ID_ANY, "")
         dialog.Show()
 
Index: src/sas/sasgui/perspectives/invariant/invariant_state.py
===================================================================
--- src/sas/sasgui/perspectives/invariant/invariant_state.py	(revision 2469df7fc9ffa047115c5bffe589ed307b12c363)
+++ src/sas/sasgui/perspectives/invariant/invariant_state.py	(revision fa412df39d3c5338c2c5f69fed935b428f385ebe)
@@ -12,4 +12,5 @@
 from lxml import etree
 from sas.sascalc.dataloader.readers.cansas_reader import Reader as CansasReader
+from sas.sasgui.guiframe.report_image_handler import ReportImageHandler
 from sas.sascalc.dataloader.readers.cansas_reader import get_content
 from sas.sasgui.guiframe.utils import format_number
@@ -611,12 +612,8 @@
         wximgbmp = wx.BitmapFromImage(wximg)
         # store the image in wx.FileSystem Object
-        wx.FileSystem.AddHandler(wx.MemoryFSHandler())
-        # use wx.MemoryFSHandler
-        self.imgRAM = wx.MemoryFSHandler()
-        # AddFile, image can be retrieved with 'memory:filename'
-        self.imgRAM.AddFile('img_inv.png', wximgbmp, wx.BITMAP_TYPE_PNG)
-
-        self.wximgbmp = 'memory:img_inv.png'
-        self.image = fig
+        imgs, refs = ReportImageHandler.set_figs([fig], [wximgbmp], 'inv')
+
+        self.wximgbmp = refs[0]
+        self.image = imgs[0]
 
 class Reader(CansasReader):
Index: src/sas/sasgui/perspectives/invariant/report_dialog.py
===================================================================
--- src/sas/sasgui/perspectives/invariant/report_dialog.py	(revision 959eb0181ad06828a748f04512f953aad5b31659)
+++ src/sas/sasgui/perspectives/invariant/report_dialog.py	(revision d0ce666faaf0f9284be2e607a0ac846cdd9a682b)
@@ -41,5 +41,5 @@
 
         # put image path in the report string
-        self.report_html = self.report_list[0] % "memory:img_inv.png"
+        self.report_html = self.report_list[0] % self.fig_urls[0]
         # layout
         self._setup_layout()
