diff --git a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp
index a13343453c9d8876f1fc57ccb72c3df4efaeb493..1101ccb3f69f61d757615be1f2ca1c8866b0a6e0 100644
--- a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp
+++ b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp
@@ -2203,15 +2203,17 @@ void ApplicationWindow::updateTableNames(const QString& oldName, const QString&
 {
   QList<MdiSubWindow *> windows = windowsList();
   foreach (MdiSubWindow *w, windows) {
-    if (w->isA("MultiLayer")) {
-      QList<Graph *> layers = dynamic_cast<MultiLayer*>(w)->layersList();
+    auto ml = dynamic_cast<MultiLayer*>(w);
+    auto g3d = dynamic_cast<Graph3D*>(w);
+    if (ml) {
+      QList<Graph *> layers = ml->layersList();
       foreach(Graph *g, layers)
-      g->updateCurveNames(oldName, newName);
-    } else if (w->isA("Graph3D")) {
-      QString name = dynamic_cast<Graph3D*>(w)->formula();
+        g->updateCurveNames(oldName, newName);
+    } else if (g3d) {
+      QString name = g3d->formula();
       if (name.contains(oldName, true)) {
         name.replace(oldName,newName);
-        dynamic_cast<Graph3D*>(w)->setPlotAssociation(name);
+        g3d->setPlotAssociation(name);
       }
     }
   }
@@ -2221,13 +2223,18 @@ void ApplicationWindow::updateColNames(const QString& oldName, const QString& ne
 {
   QList<MdiSubWindow *> windows = windowsList();
   foreach (MdiSubWindow *w, windows){
-    if (w->isA("MultiLayer")){
-      QList<Graph *> layers = dynamic_cast<MultiLayer*>(w)->layersList();
+    auto ml = dynamic_cast<MultiLayer*>(w);
+    auto g3d = dynamic_cast<Graph3D*>(w);
+
+    if(ml)
+    {
+      QList<Graph *> layers = ml->layersList();
       foreach(Graph *g, layers)
-      g->updateCurveNames(oldName, newName, false);
+        g->updateCurveNames(oldName, newName, false);
     }
-    else if (w->isA("Graph3D")){
-      QString name = dynamic_cast<Graph3D*>(w)->formula();
+    else if(g3d)
+    {
+      QString name = g3d->formula();
       if (name.contains(oldName)){
         name.replace(oldName,newName);
         dynamic_cast<Graph3D*>(w)->setPlotAssociation(name);
@@ -2242,16 +2249,22 @@ void ApplicationWindow::changeMatrixName(const QString& oldName, const QString&
   foreach(MdiSubWindow *w, windows){
     if (w->isA("Graph3D"))
     {
-      QString s = dynamic_cast<Graph3D*>(w)->formula();
+      auto g3d = dynamic_cast<Graph3D*>(w);
+      if(!g3d)
+        return;
+      QString s = g3d->formula();
       if (s.contains(oldName))
       {
         s.replace(oldName, newName);
-        dynamic_cast<Graph3D*>(w)->setPlotAssociation(s);
+        g3d->setPlotAssociation(s);
       }
     }
     else if (w->isA("MultiLayer"))
     {
-      QList<Graph *> layers = dynamic_cast<MultiLayer*>(w)->layersList();
+      auto ml = dynamic_cast<MultiLayer*>(w);
+      if(!ml)
+        return;
+      QList<Graph *> layers = ml->layersList();
       foreach(Graph *g, layers){
         for (int i=0; i<g->curves(); i++){
           QwtPlotItem *sp = dynamic_cast<QwtPlotItem*>(g->plotItem(i));
@@ -2272,10 +2285,13 @@ void ApplicationWindow::remove3DMatrixPlots(Matrix *m)
 
   QList<MdiSubWindow *> windows = windowsList();
   foreach(MdiSubWindow *w, windows){
-    if (w->isA("Graph3D") && dynamic_cast<Graph3D*>(w)->matrix() == m)
-      dynamic_cast<Graph3D*>(w)->clearData();
-    else if (w->isA("MultiLayer")){
-      QList<Graph *> layers = dynamic_cast<MultiLayer*>(w)->layersList();
+    auto g3d = dynamic_cast<Graph3D*>(w);
+    if(g3d && g3d->matrix() == m)
+      g3d->clearData();
+    auto ml = dynamic_cast<MultiLayer*>(w);
+
+    if(ml) {
+      QList<Graph *> layers = ml->layersList();
       foreach(Graph *g, layers){
         for (int i=0; i<g->curves(); i++){
           if (g->curveType(i) == Graph::Histogram){
@@ -2304,10 +2320,17 @@ void ApplicationWindow::updateMatrixPlots(MdiSubWindow *window)
 
   QList<MdiSubWindow *> windows = windowsList();
   foreach(MdiSubWindow *w, windows){
-    if (w->isA("Graph3D") && dynamic_cast<Graph3D*>(w)->matrix() == m)
-      dynamic_cast<Graph3D*>(w)->updateMatrixData(m);
+    if (w->isA("Graph3D")) {
+      auto g3d = dynamic_cast<Graph3D*>(w);
+      if(g3d && g3d->matrix() == m)
+        g3d->updateMatrixData(m);
+    }
     else if (w->isA("MultiLayer")){
-      QList<Graph *> layers = dynamic_cast<MultiLayer*>(w)->layersList();
+      auto ml = dynamic_cast<MultiLayer*>(w);
+      if(!ml)
+        continue;
+
+      QList<Graph *> layers = ml->layersList();
       foreach(Graph *g, layers){
         for (int i=0; i<g->curves(); i++){
           if (g->curveType(i) == Graph::Histogram){
@@ -2418,7 +2441,10 @@ void ApplicationWindow::insert3DMatrixPlot(const QString& matrix_name)
   if (!w)
     return;
 
-  dynamic_cast<Graph3D*>(w)->addMatrixData(matrix(matrix_name));
+  auto g3d = dynamic_cast<Graph3D*>(w);
+  if(g3d)
+    g3d->addMatrixData(matrix(matrix_name));
+
   emit modified();
 }
 
@@ -2428,7 +2454,9 @@ void ApplicationWindow::insertNew3DData(const QString& colName)
   if (!w)
     return;
 
-  dynamic_cast<Graph3D*>(w)->insertNewData(table(colName),colName);
+  auto g3d = dynamic_cast<Graph3D*>(w);
+  if(g3d)
+    g3d->insertNewData(table(colName),colName);
   emit modified();
 }
 
@@ -2452,6 +2480,9 @@ void ApplicationWindow::editSurfacePlot()
     return;
 
   Graph3D* g = dynamic_cast<Graph3D*>(w);
+  if(!g)
+    return;
+
   SurfaceDialog* sd = new SurfaceDialog(this);
   sd->setAttribute(Qt::WA_DeleteOnClose);
 
@@ -3015,7 +3046,11 @@ void ApplicationWindow::customizeTables(const QColor& bgColor,const QColor& text
   QList<MdiSubWindow *> windows = windowsList();
   foreach(MdiSubWindow *w, windows){
     if (w->inherits("Table"))
-      customTable(dynamic_cast<Table*>(w));
+    {
+      auto table = dynamic_cast<Table*>(w);
+      if(table)
+        customTable(table);
+    }
   }
 }
 
@@ -3837,6 +3872,9 @@ void ApplicationWindow::removeErrorBars()
     return;
 
   MultiLayer* plot = dynamic_cast<MultiLayer*>(w);
+  if(!plot)
+    return;
+
   if (plot->isEmpty()){
     QMessageBox::warning(this,tr("MantidPlot - Warning"),//Mantid
         tr("<h4>There are no plot layers available in this window.</h4>"
@@ -3871,7 +3909,11 @@ void ApplicationWindow::removeErrorBars(const QString& name)
   if (!w)
     return;
 
-  Graph* g = dynamic_cast<MultiLayer*>(w)->activeGraph();
+  auto ml = dynamic_cast<MultiLayer*>(w);
+  if(!ml)
+    return;
+
+  Graph* g = ml->activeGraph();
   if (!g)
     return;
 
@@ -3885,7 +3927,11 @@ void ApplicationWindow::defineErrorBars(const QString& name, int type, const QSt
   if (!w)
     return;
 
-  Graph* g = dynamic_cast<MultiLayer*>(w)->activeGraph();
+  auto ml = dynamic_cast<MultiLayer*>(w);
+  if(!ml)
+    return;
+
+  Graph* g = ml->activeGraph();
   if (!g)
     return;
 
@@ -3903,6 +3949,9 @@ void ApplicationWindow::defineErrorBars(const QString& name, int type, const QSt
   }
 
   DataCurve *master_curve = dynamic_cast<DataCurve *>(g->curve(name));
+  if(!master_curve)
+    return;
+
   QString xColName = master_curve->xColumnName();
   if (xColName.isEmpty())
     return;
@@ -4004,14 +4053,18 @@ void ApplicationWindow::removeCurves(const QString& name)
   foreach(MdiSubWindow *w, windows){
     if (w->isA("MultiLayer"))
     {
-      QList<Graph *> layers = dynamic_cast<MultiLayer*>(w)->layersList();
+      auto ml = dynamic_cast<MultiLayer*>(w);
+      if(!ml)
+        return;
+      QList<Graph *> layers = ml->layersList();
       foreach(Graph *g, layers)
-      g->removeCurves(name);
+        g->removeCurves(name);
     }
     else if (w->isA("Graph3D"))
     {
-      if ( (dynamic_cast<Graph3D*>(w)->formula()).contains(name) )
-        dynamic_cast<Graph3D*>(w)->clearData();
+      auto g3d = dynamic_cast<Graph3D*>(w);
+      if(g3d && g3d->formula().contains(name))
+          g3d->clearData();
     }
   }
   QApplication::restoreOverrideCursor();
@@ -4022,12 +4075,16 @@ void ApplicationWindow::updateCurves(Table *t, const QString& name)
   QList<MdiSubWindow *> windows = windowsList();
   foreach(MdiSubWindow *w, windows){
     if (w->isA("MultiLayer")){
-      QList<Graph *> layers = dynamic_cast<MultiLayer*>(w)->layersList();
-      foreach(Graph *g, layers)
-      g->updateCurvesData(t, name);
+      MultiLayer* ml = dynamic_cast<MultiLayer*>(w);
+      if(ml)
+      {
+        QList<Graph *> layers = ml->layersList();
+        foreach(Graph *g, layers)
+          g->updateCurvesData(t, name);
+      }
     } else if (w->isA("Graph3D")){
       Graph3D* g = dynamic_cast<Graph3D*>(w);
-      if ((g->formula()).contains(name))
+      if (g && (g->formula()).contains(name))
         g->updateData(t);
     }
   }
@@ -4169,7 +4226,10 @@ void ApplicationWindow::setGraphDefaultSettings(bool autoscale, bool scaleFonts,
   foreach(MdiSubWindow *w, windows){
     if (w->isA("MultiLayer"))
     {
-      QList<Graph *> layers = dynamic_cast<MultiLayer*>(w)->layersList();
+      auto ml = dynamic_cast<MultiLayer*>(w);
+      if(!ml)
+        continue;
+      QList<Graph *> layers = ml->layersList();
       foreach(Graph *g, layers)
       {
         g->enableAutoscaling(autoscale2DPlots);
@@ -4509,7 +4569,11 @@ ApplicationWindow* ApplicationWindow::open(const QString& fn, bool factorySettin
 
   QFile f(fname);
   QTextStream t( &f );
-  f.open(QIODevice::ReadOnly);
+  if(!f.open(QIODevice::ReadOnly))
+  {
+    QMessageBox::critical(this, tr("MantidPlot - File opening error"),  tr("The file: <b> %1 </b> could not be opened!").arg(fn));
+    return 0;
+  }
   QString s = t.readLine();
   QStringList list = s.split(QRegExp("\\s"), QString::SkipEmptyParts);
   if (list.count() < 2 || list[0] != "MantidPlot"){
@@ -5894,6 +5958,8 @@ void ApplicationWindow::exportAllGraphs()
     if (w->isA("MultiLayer")) {
       plot3D = 0;
       plot2D = dynamic_cast<MultiLayer*>(w);
+      if(!plot2D)
+        continue;
       if (plot2D->isEmpty()) {
         QApplication::restoreOverrideCursor();
         QMessageBox::warning(this, tr("MantidPlot - Warning"),//Mantid
@@ -5905,6 +5971,8 @@ void ApplicationWindow::exportAllGraphs()
     } else if (w->isA("Graph3D")) {
       plot2D = 0;
       plot3D = dynamic_cast<Graph3D*>(w);
+      if(!plot3D)
+        continue;
     } else
       continue;
 
@@ -5915,8 +5983,7 @@ void ApplicationWindow::exportAllGraphs()
 
       QString msg = tr("A file called: <p><b>%1</b><p>already exists. ""Do you want to overwrite it?").arg(file_name);
       QMessageBox msgBox(QMessageBox::Question, tr("MantidPlot - Overwrite file?"), msg,//Mantid
-          QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::Cancel,
-          dynamic_cast<ApplicationWindow *>(this));
+          QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::Cancel, this);
       msgBox.exec();
       switch(msgBox.standardButton(msgBox.clickedButton())){
       case QMessageBox::Yes:
@@ -6057,7 +6124,11 @@ void ApplicationWindow::restoreWindowGeometry(ApplicationWindow *app, MdiSubWind
 
 Folder* ApplicationWindow::projectFolder() const
 {
-  return dynamic_cast<FolderListItem*>(folders->firstChild())->folder();
+  auto fli = dynamic_cast<FolderListItem*>(folders->firstChild());
+  if(fli)
+    return fli->folder();
+  else
+    throw std::runtime_error("Couldn't retrieve project folder");
 }
 
 bool ApplicationWindow::saveProject(bool compress)
@@ -6212,8 +6283,11 @@ void ApplicationWindow::saveProjectAs(const QString& fileName, bool compress)
       QFileInfo fi(fn);
       QString baseName = fi.baseName();
       FolderListItem *item = dynamic_cast<FolderListItem *>(folders->firstChild());
-      item->setText(0, baseName);
-      item->folder()->setObjectName(baseName);
+      if(item)
+      {
+        item->setText(0, baseName);
+        item->folder()->setObjectName(baseName);
+      }
     }
   }
 }
@@ -6241,6 +6315,9 @@ void ApplicationWindow::rename()
 void ApplicationWindow::renameWindow()
 {
   WindowListItem *it = dynamic_cast<WindowListItem *>(lv->currentItem());
+  if (!it)
+    return;
+
   MdiSubWindow *w = it->window();
   if (!w)
     return;
@@ -6256,8 +6333,15 @@ void ApplicationWindow::renameWindow(Q3ListViewItem *item, int, const QString &t
   if (!item)
     return;
 
-  MdiSubWindow *w = dynamic_cast<WindowListItem*>(item)->window();
-  if (!w || text == w->objectName())
+  WindowListItem *wli = dynamic_cast<WindowListItem*>(item);
+  if (!wli)
+    return;
+
+  MdiSubWindow *w = wli->window();
+  if (!w)
+    return;
+
+  if(text == w->objectName())
     return;
 
   if(!setWindowName(w, text))
@@ -6330,14 +6414,18 @@ void ApplicationWindow::showCurvesDialog()
   if (!w)
     return;
 
-  if (dynamic_cast<MultiLayer*>(w)->isEmpty()){
+  auto ml = dynamic_cast<MultiLayer*>(w);
+  if(!ml)
+    return;
+
+  if (ml->isEmpty()){
     QMessageBox::warning(this,tr("MantidPlot - Error"),//Mantid
         tr("<h4>There are no plot layers available in this window.</h4>"
             "<p><h4>Please add a layer and try again!</h4>"));
     return;
   }
 
-  Graph* g = dynamic_cast<MultiLayer*>(w)->activeGraph();
+  Graph* g = ml->activeGraph();
   if (!g)
     return;
 
@@ -6403,7 +6491,11 @@ AssociationsDialog* ApplicationWindow::showPlotAssociations(int curve)
   if (!w)
     return 0;
 
-  Graph *g = dynamic_cast<MultiLayer*>(w)->activeGraph();
+  auto ml = dynamic_cast<MultiLayer*>(w);
+  if(!ml)
+    return 0;
+
+  Graph *g = ml->activeGraph();
   if (!g)
     return 0;
 
@@ -6421,8 +6513,12 @@ void ApplicationWindow::showTitleDialog()
     return;
 
   if (w->isA("MultiLayer")){
-    Graph* g = dynamic_cast<MultiLayer*>(w)->activeGraph();
-    if (g){
+    auto ml = dynamic_cast<MultiLayer*>(w);
+    if(!ml)
+      return;
+
+    Graph* g = ml->activeGraph();
+    if (g) {
       TextDialog* td= new TextDialog(TextDialog::LayerTitle, this,0);
       td->setGraph(g);
       td->exec();
@@ -6440,7 +6536,11 @@ void ApplicationWindow::showAxisTitleDialog()
   if (!w)
     return;
 
-  Graph* g = dynamic_cast<MultiLayer*>(w)->activeGraph();
+  auto ml = dynamic_cast<MultiLayer*>(w);
+  if(!ml)
+    return;
+
+  Graph* g = ml->activeGraph();
   if (!g)
     return;
 
@@ -6478,35 +6578,28 @@ void ApplicationWindow::exportAllTables(const QString& sep, bool colNames, bool
       if (w->inherits("Table") || w->isA("Matrix")){
         QString fileName = dir + "/" + w->objectName() + ".txt";
         QFile f(fileName);
-        if (f.exists(fileName) && confirmOverwrite){
+        if (f.exists(fileName) && confirmOverwrite)
+        {
           QApplication::restoreOverrideCursor();
-          switch(QMessageBox::question(this, tr("MantidPlot - Overwrite file?"),//Mantid
+          auto result = QMessageBox::question(this, tr("MantidPlot - Overwrite file?"),
               tr("A file called: <p><b>%1</b><p>already exists. "
-                  "Do you want to overwrite it?").arg(fileName), tr("&Yes"), tr("&All"), tr("&Cancel"), 0, 1))
-          {
-          case 0:
-            if (w->inherits("Table"))
-              success = (dynamic_cast<Table*>(w))->exportASCII(fileName, sep, colNames, colComments, expSelection);
-            else if (w->isA("Matrix"))
-              success = (dynamic_cast<Matrix*>(w))->exportASCII(fileName, sep, expSelection);
-            break;
+                 "Do you want to overwrite it?").arg(fileName),
+              tr("&Yes"), tr("&All"), tr("&Cancel"), 0, 1);
 
-          case 1:
+          if(result == 1)
             confirmOverwrite = false;
-            if (w->inherits("Table"))
-              success = (dynamic_cast<Table*>(w))->exportASCII(fileName, sep, colNames, colComments, expSelection);
-            else if (w->isA("Matrix"))
-              success = (dynamic_cast<Matrix*>(w))->exportASCII(fileName, sep, expSelection);
-            break;
-
-          case 2:
+          else if(result == 2)
             return;
-            break;
-          }
-        } else if (w->inherits("Table"))
-          success = (dynamic_cast<Table*>(w))->exportASCII(fileName, sep, colNames, colComments, expSelection);
-        else if (w->isA("Matrix"))
-          success = (dynamic_cast<Matrix*>(w))->exportASCII(fileName, sep, expSelection);
+
+        }
+
+        auto table = dynamic_cast<Table*>(w);
+        auto matrix = dynamic_cast<Matrix*>(w);
+
+        if(table)
+          success = table->exportASCII(fileName, sep, colNames, colComments, expSelection);
+        else if(matrix)
+          success = matrix->exportASCII(fileName, sep, expSelection);
 
         if (!success)
           break;
@@ -6623,10 +6716,13 @@ void ApplicationWindow::recalculateTable()
   if (!w)
     return;
 
-  if (w->inherits("Table"))
-    (dynamic_cast<Table*>(w))->calculate();
-  else if (w->isA("Matrix"))
-    (dynamic_cast<Matrix*>(w))->calculate();
+  auto table = dynamic_cast<Table*>(w);
+  auto matrix = dynamic_cast<Matrix*>(w);
+
+  if(table)
+    table->calculate();
+  else if(matrix)
+    matrix->calculate();
 }
 
 void ApplicationWindow::sortActiveTable()
@@ -7147,32 +7243,18 @@ void ApplicationWindow::showAxisDialog()
   QDialog* gd = showScaleDialog();
   if (gd && plot->isA("MultiLayer"))
   {
-    MultiLayer* ml;
-    try
-    {
-      ml = dynamic_cast<MultiLayer*>(plot);
-    }
-    catch(std::runtime_error& )
-    {
-      g_log.error() << "Failed to open axis dialog for multi layer plot";
+    MultiLayer* ml = dynamic_cast<MultiLayer*>(plot);
+    if (!ml || (ml && !ml->layers()))
       return;
-    }
-    if (ml && ml->layers())
-      dynamic_cast<AxesDialog*>(gd)->showAxesPage();
+
+    auto ad = dynamic_cast<AxesDialog*>(gd);
+    if(ad)
+      ad->showAxesPage();
   }
   else if (gd && plot->isA("Graph3D"))
   {
-    Plot3DDialog* p3d;
-    try
-    {
-      p3d = dynamic_cast<Plot3DDialog*>(gd);
-    }
-    catch(std::runtime_error& )
-    {
-      g_log.error() << "Failed to open axis dialog for multi layer plot";
-      return;
-    }
-    if (p3d)
+    Plot3DDialog* p3d = dynamic_cast<Plot3DDialog*>(gd);
+    if(p3d)
       p3d->showAxisTab();
   }
 }
@@ -7191,20 +7273,14 @@ QDialog* ApplicationWindow::showScaleDialog()
     return 0;
 
   if (w->isA("MultiLayer")){
-    MultiLayer* ml;
-    try
-    {
-      ml = dynamic_cast<MultiLayer*>(w);
-    }
-    catch(std::runtime_error& )
-    {
-      g_log.error() << "Failed to open scale dialog for multi layer plot";
-      return 0;
-    }
+    auto ml = dynamic_cast<MultiLayer*>(w);
     if (!ml || ml->isEmpty())
       return 0;
 
-    Graph* g = dynamic_cast<MultiLayer*>(w)->activeGraph();
+    Graph* g = ml->activeGraph();
+    if(!g)
+      return 0;
+
     if (g->isPiePlot()){
       QMessageBox::warning(this, tr("MantidPlot - Warning"), tr("This functionality is not available for pie plots!"));//Mantid
       return 0;
@@ -7437,20 +7513,17 @@ void ApplicationWindow::showCurveWorksheet(Graph *g, int curveIndex)
   if (!it)
     return;
 
-  if (it->rtti() == QwtPlotItem::Rtti_PlotSpectrogram)
-  {
-    Spectrogram *sp = dynamic_cast<Spectrogram*>(it);
-    if (sp->matrix())
-      sp->matrix()->showMaximized();
-  }
-  else if (dynamic_cast<PlotCurve*>(it)->type() == Graph::Function)
-  {
-    g->createTable(dynamic_cast<PlotCurve*>(it));
-  }
-  else
-  {
+
+  auto sp = dynamic_cast<Spectrogram*>(it);
+  auto pc = dynamic_cast<PlotCurve*>(it);
+
+  if(sp && sp->matrix())
+    sp->matrix()->showMaximized();
+  if(pc && pc->type() == Graph::Function)
+    g->createTable(pc);
+
+  if(!pc && !sp)
     showTable(it->title().text());
-  }
 }
 
 void ApplicationWindow::showCurveWorksheet()
@@ -7623,7 +7696,9 @@ void ApplicationWindow::exportPDF()
   if (!w)
     return;
 
-  if (w->isA("MultiLayer") && (dynamic_cast<MultiLayer*>(w))->isEmpty()){
+  auto ml = dynamic_cast<MultiLayer*>(w);
+
+  if (w->isA("MultiLayer") && ml && ml->isEmpty()) {
     QMessageBox::warning(this,tr("MantidPlot - Warning"),//Mantid
         tr("<h4>There are no plot layers available in this window.</h4>"));
     return;
@@ -7658,7 +7733,8 @@ void ApplicationWindow::print()
   if (!w)
     return;
 
-  if (w->isA("MultiLayer") && (dynamic_cast<MultiLayer*>(w))->isEmpty()){
+  auto ml = dynamic_cast<MultiLayer*>(w);
+  if (w->isA("MultiLayer") && ml && ml->isEmpty()){
     QMessageBox::warning(this,tr("MantidPlot - Warning"),//Mantid
         tr("<h4>There are no plot layers available in this window.</h4>"));
     return;
@@ -7689,7 +7765,11 @@ void ApplicationWindow::printAllPlots()
 
     foreach(MdiSubWindow *w, windows){
       if (w->isA("MultiLayer") && printer.newPage())
-        dynamic_cast<MultiLayer*>(w)->printAllLayers(paint);
+      {
+        MultiLayer* ml = dynamic_cast<MultiLayer*>(w);
+        if (ml)
+          ml->printAllLayers(paint);
+      }
     }
     paint->end();
     delete paint;
@@ -7744,7 +7824,11 @@ void ApplicationWindow::showFitDialog()
   if(w->isA("MultiLayer"))
     plot = dynamic_cast<MultiLayer*>(w);
   else if(w->inherits("Table"))
-    plot = multilayerPlot(dynamic_cast<Table*>(w), dynamic_cast<Table*>(w)->drawableColumnSelection(), Graph::LineSymbols);
+  {
+    Table* t = dynamic_cast<Table*>(w);
+    if(t)
+      plot = multilayerPlot(t, t->drawableColumnSelection(), Graph::LineSymbols);
+  }
 
   if (!plot)
     return;
@@ -7806,20 +7890,33 @@ void ApplicationWindow::showFFTDialog()
 
   FFTDialog *sd = 0;
   if (w->isA("MultiLayer")) {
-    Graph* g = dynamic_cast<MultiLayer*>(w)->activeGraph();
-    if ( g && g->validCurvesDataSize() ){
+    MultiLayer* ml = dynamic_cast<MultiLayer*>(w);
+    if(!ml)
+      return;
+
+    Graph* g = ml->activeGraph();
+    if(!g)
+      return;
+
+    if (g->validCurvesDataSize() ){
       sd = new FFTDialog(FFTDialog::onGraph, this);
       sd->setAttribute(Qt::WA_DeleteOnClose);
       sd->setGraph(g);
     }
   } else if (w->inherits("Table")) {
+    Table* t = dynamic_cast<Table*>(w);
+    if(!t)
+      return;
     sd = new FFTDialog(FFTDialog::onTable, this);
     sd->setAttribute(Qt::WA_DeleteOnClose);
-    sd->setTable(dynamic_cast<Table*>(w));
+    sd->setTable(t);
   } else if (w->inherits("Matrix")) {
+    Matrix* m = dynamic_cast<Matrix*>(w);
+    if(!m)
+      return;
     sd = new FFTDialog(FFTDialog::onMatrix, this);
     sd->setAttribute(Qt::WA_DeleteOnClose);
-    sd->setMatrix(dynamic_cast<Matrix*>(w));
+    sd->setMatrix(m);
   }
 
   if (sd)
@@ -8338,22 +8435,36 @@ void ApplicationWindow::clearSelection()
     return;
 
   if (m->inherits("Table"))
-    dynamic_cast<Table*>(m)->clearSelection();
+  {
+    auto t = dynamic_cast<Table*>(m);
+    if(t)
+      t->clearSelection();
+  }
   else if (m->isA("Matrix"))
-    dynamic_cast<Matrix*>(m)->clearSelection();
+  {
+    auto matrix = dynamic_cast<Matrix*>(m);
+    if(matrix)
+      matrix->clearSelection();
+  }
   else if (m->isA("MultiLayer"))
   {
-    Graph* g = dynamic_cast<MultiLayer*>(m)->activeGraph();
+    auto ml = dynamic_cast<MultiLayer*>(m);
+    if(!ml)
+      return;
+
+    Graph* g = ml->activeGraph();
     if (!g)
       return;
 
     if (g->activeTool())
     {
-      if (g->activeTool()->rtti() == PlotToolInterface::Rtti_RangeSelector)
-        dynamic_cast<RangeSelectorTool*>(g->activeTool())->clearSelection();
+      auto rst = dynamic_cast<RangeSelectorTool*>(g->activeTool());
+      auto lbt = dynamic_cast<LabelTool*>(g->activeTool());
 
-      if (g->activeTool()->rtti() == PlotToolInterface::Rtti_LabelTool)
-        dynamic_cast<LabelTool*>(g->activeTool())->removeTextBox();
+      if(rst)
+        rst->clearSelection();
+      else if(lbt)
+        lbt->removeTextBox();
     }
 
     else if (g->titleSelected())
@@ -8362,7 +8473,11 @@ void ApplicationWindow::clearSelection()
       g->removeMarker();
   }
   else if (m->isA("Note"))
-    dynamic_cast<Note*>(m)->editor()->clear();
+  {
+    auto note = dynamic_cast<Note*>(m);
+    if(note)
+      note->editor()->clear();
+  }
   emit modified();
 }
 
@@ -8376,11 +8491,20 @@ void ApplicationWindow::copySelection()
   if (!m)
     return;
 
-    if (m->inherits("Table"))
-    dynamic_cast<Table*>(m)->copySelection();
+  if (m->inherits("Table"))
+  {
+    Table* table = dynamic_cast<Table*>(m);
+    if(table)
+      table->copySelection();
+  }
   else if (m->isA("Matrix"))
-    dynamic_cast<Matrix*>(m)->copySelection();
-  else if (m->isA("MultiLayer")){
+  {
+    Matrix* matrix = dynamic_cast<Matrix*>(m);
+    if(matrix)
+      matrix->copySelection();
+  }
+  else if (m->isA("MultiLayer"))
+  {
     MultiLayer* plot = dynamic_cast<MultiLayer*>(m);
     if (!plot || plot->layers() == 0)
       return;
@@ -8392,7 +8516,9 @@ void ApplicationWindow::copySelection()
     if (g->activeTool()){
       if (g->activeTool()->rtti() == PlotToolInterface::Rtti_RangeSelector)
       {
-        dynamic_cast<RangeSelectorTool*>(g->activeTool())->copySelection();
+        RangeSelectorTool* rst = dynamic_cast<RangeSelectorTool*>(g->activeTool());
+        if(rst)
+          rst->copySelection();
       }
     } else if (g->markerSelected()){
       copyMarker();
@@ -8404,7 +8530,11 @@ void ApplicationWindow::copySelection()
     plot->copyAllLayers();
   }
   else if (m->isA("Note"))
-    dynamic_cast<Note*>(m)->editor()->copy();
+  {
+    Note* note = dynamic_cast<Note*>(m);
+    if(note)
+      note->editor()->copy();
+  }
   else
     mantidUI->copyValues();//Mantid
 }
@@ -8479,11 +8609,23 @@ void ApplicationWindow::pasteSelection()
     return;
 
   if (m->inherits("Table"))
-    dynamic_cast<Table*>(m)->pasteSelection();
+  {
+    auto table = dynamic_cast<Table*>(m);
+    if(table)
+      table->pasteSelection();
+  }
   else if (m->isA("Matrix"))
-    dynamic_cast<Matrix*>(m)->pasteSelection();
+  {
+    auto matrix = dynamic_cast<Matrix*>(m);
+    if(matrix)
+      matrix->pasteSelection();
+  }
   else if (m->isA("Note"))
-    dynamic_cast<Note*>(m)->editor()->paste();
+  {
+    auto note = dynamic_cast<Note*>(m);
+    if(note)
+      note->editor()->paste();
+  }
   else if (m->isA("MultiLayer")){
     MultiLayer* plot = dynamic_cast<MultiLayer*>(m);
     if (!plot)
@@ -8558,18 +8700,26 @@ MdiSubWindow* ApplicationWindow::clone(MdiSubWindow* w)
 
   if (w->isA("MultiLayer")){
     MultiLayer *g = dynamic_cast<MultiLayer*>(w);
+    if(!g)
+      return NULL;
     nw = multilayerPlot(generateUniqueName(tr("Graph")), 0, g->getRows(), g->getCols());
-    dynamic_cast<MultiLayer*>(nw)->copy(g);
+    auto nwg = dynamic_cast<MultiLayer*>(nw);
+    if(nwg)
+      nwg->copy(g);
   } else if (w->inherits("Table")){
     Table *t = dynamic_cast<Table*>(w);
+    if(!t)
+      return NULL;
     QString caption = generateUniqueName(tr("Table"));
     nw = newTable(caption, t->numRows(), t->numCols());
   } else if (w->isA("Graph3D")){
     Graph3D *g = dynamic_cast<Graph3D*>(w);
+    if(!g)
+      return NULL;
     if (!g->hasData()){
       QApplication::restoreOverrideCursor();
       QMessageBox::warning(this, tr("MantidPlot - Duplicate error"), tr("Empty 3D surface plots cannot be duplicated!"));//Mantid
-      return 0;
+      return NULL;
     }
 
     QString caption = generateUniqueName(tr("Graph"));
@@ -8602,15 +8752,32 @@ MdiSubWindow* ApplicationWindow::clone(MdiSubWindow* w)
 
     if (status == MdiSubWindow::Maximized)
       nw->hide();
-    dynamic_cast<Graph3D*>(nw)->copy(g);
+    auto g3d = dynamic_cast<Graph3D*>(nw);
+    if(g3d)
+      g3d->copy(g);
     customToolBars(nw);
   } else if (w->isA("Matrix")){
-    nw = newMatrix((dynamic_cast<Matrix*>(w))->numRows(), (dynamic_cast<Matrix*>(w))->numCols());
-    dynamic_cast<Matrix*>(nw)->copy(dynamic_cast<Matrix*>(w));
+    auto matrix = dynamic_cast<Matrix*>(w);
+    if(!matrix)
+      return NULL;
+    nw = newMatrix(matrix->numRows(), matrix->numCols());
+    auto nwmatrix = dynamic_cast<Matrix*>(nw);
+    if(nwmatrix)
+      nwmatrix->copy(matrix);
   } else if (w->isA("Note")){
+    auto note = dynamic_cast<Note*>(w);
+    if(!note)
+      return NULL;
+
     nw = newNote();
-    if (nw)
-      dynamic_cast<Note*>(nw)->setText(dynamic_cast<Note*>(w)->text());
+    if(!nw)
+      return NULL;
+
+    auto nwnote = dynamic_cast<Note*>(nw);
+    if(!nwnote)
+      return NULL;
+
+    nwnote->setText(note->text());
   }
 
   if (nw){
@@ -8618,13 +8785,16 @@ MdiSubWindow* ApplicationWindow::clone(MdiSubWindow* w)
       if (status == MdiSubWindow::Maximized)
         nw->showMaximized();
     } else if (w->isA("Graph3D")){
-      dynamic_cast<Graph3D*>(nw)->setIgnoreFonts(true);
+      auto g3d = dynamic_cast<Graph3D*>(nw);
+      if(!g3d)
+        return NULL;
+      g3d->setIgnoreFonts(true);
       if (status != MdiSubWindow::Maximized){
         nw->resize(w->size());
         nw->showNormal();
       } else
         nw->showMaximized();
-      dynamic_cast<Graph3D*>(nw)->setIgnoreFonts(false);
+      g3d->setIgnoreFonts(false);
     } else {
       nw->resize(w->size());
       nw->showNormal();
@@ -8647,10 +8817,14 @@ void ApplicationWindow::undo()
 
   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
 
-  if (qobject_cast<Note*>(w))
-    dynamic_cast<Note*>(w)->editor()->undo();
-  else if (qobject_cast<Matrix*>(w)){
-    QUndoStack *stack = (dynamic_cast<Matrix*>(w))->undoStack();
+  auto note = dynamic_cast<Note*>(w);
+  auto matrix = dynamic_cast<Matrix*>(w);
+
+  if(note)
+    note->editor()->undo();
+  else if(matrix)
+  {
+    QUndoStack *stack = matrix->undoStack();
     if (stack && stack->canUndo())
       stack->undo();
   }
@@ -8665,10 +8839,14 @@ void ApplicationWindow::redo()
 
   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
 
-  if (qobject_cast<Note*>(w))
-    dynamic_cast<Note*>(w)->editor()->redo();
-  else if (qobject_cast<Matrix*>(w)){
-    QUndoStack *stack = (dynamic_cast<Matrix*>(w))->undoStack();
+  auto note = dynamic_cast<Note*>(w);
+  auto matrix = dynamic_cast<Matrix*>(w);
+
+  if(note)
+    note->editor()->redo();
+  else if(matrix)
+  {
+    QUndoStack *stack = matrix->undoStack();
     if (stack && stack->canRedo())
       stack->redo();
   }
@@ -8746,6 +8924,9 @@ void ApplicationWindow::resizeActiveWindow()
 void ApplicationWindow::resizeWindow()
 {
   WindowListItem *it = dynamic_cast<WindowListItem*>(lv->currentItem());
+  if (!it)
+    return;
+
   MdiSubWindow *w = it->window();
   if (!w)
     return;
@@ -8824,7 +9005,8 @@ void ApplicationWindow::setActiveWindow(MdiSubWindow* w)
 void ApplicationWindow::activateWindow()
 {
   WindowListItem *it = dynamic_cast<WindowListItem*>(lv->currentItem());
-  activateWindow(it->window());
+  if(it)
+    activateWindow(it->window());
 }
 
 /**
@@ -8906,7 +9088,9 @@ void ApplicationWindow::activateWindow(Q3ListViewItem * lbi)
   if (!lbi || lbi->rtti() == FolderListItem::RTTI)
     return;
 
-  activateWindow(dynamic_cast<WindowListItem*>(lbi)->window());
+  auto wli = dynamic_cast<WindowListItem*>(lbi);
+  if(wli)
+    activateWindow(wli->window());
 }
 
 void ApplicationWindow::maximizeWindow(Q3ListViewItem * lbi)
@@ -8917,7 +9101,9 @@ void ApplicationWindow::maximizeWindow(Q3ListViewItem * lbi)
   if (!lbi || lbi->rtti() == FolderListItem::RTTI)
     return;
 
-  maximizeWindow(dynamic_cast<WindowListItem*>(lbi)->window());
+  auto wli = dynamic_cast<WindowListItem*>(lbi);
+  if(wli)
+    maximizeWindow(wli->window());
 }
 
 void ApplicationWindow::maximizeWindow(MdiSubWindow *w)
@@ -8940,8 +9126,10 @@ void ApplicationWindow::maximizeWindow(MdiSubWindow *w)
 
 void ApplicationWindow::minimizeWindow(MdiSubWindow *w)
 {
+  auto wli = dynamic_cast<WindowListItem*>(lv->currentItem());
+
   if (!w)
-    w = (dynamic_cast<WindowListItem*>(lv->currentItem()))->window();
+    w = wli->window();
 
   if (!w)
     return;
@@ -8974,23 +9162,28 @@ void ApplicationWindow::removeWindowFromLists(MdiSubWindow* w)
 
   QString caption = w->objectName();
   if (w->inherits("Table")){
-    Table* m=dynamic_cast<Table*>(w);
+    Table* m = dynamic_cast<Table*>(w);
+    if(!m)
+      return;
     for (int i=0; i<m->numCols(); i++){
       QString name=m->colName(i);
       removeCurves(name);
     }
   } else if (w->isA("MultiLayer")){
-    MultiLayer *ml =  dynamic_cast<MultiLayer*>(w);
+    MultiLayer *ml = dynamic_cast<MultiLayer*>(w);
+    if(!ml)
+      return;
     Graph *g = ml->activeGraph();
-    if (g)
-      btnPointer->setChecked(true);
+    if(!g)
+      return;
+    btnPointer->setChecked(true);
   } else if (w->isA("Matrix"))
   {
-    remove3DMatrixPlots(dynamic_cast<Matrix*>(w));
+    auto matrix = dynamic_cast<Matrix*>(w);
+    if(matrix)
+      remove3DMatrixPlots(matrix);
   }
 
-  else  {  }
-
   if (hiddenWindows->contains(w))
   {
     hiddenWindows->takeAt(hiddenWindows->indexOf(w));
@@ -9565,7 +9758,11 @@ void ApplicationWindow::savedProject()
     foreach(MdiSubWindow *w, folderWindows)
     {
       if (w->isA("Matrix"))
-        (dynamic_cast<Matrix*>(w))->undoStack()->setClean();
+      {
+        Matrix* m = dynamic_cast<Matrix*>(w);
+        if (m)
+          m->undoStack()->setClean();
+      }
     }
     f = f->folderBelow();
   }
@@ -9724,11 +9921,17 @@ void ApplicationWindow::deleteSelectedItems()
   folders->blockSignals(true);
   foreach(item, lst){
     if (item->rtti() == FolderListItem::RTTI){
-      Folder *f = dynamic_cast<FolderListItem*>(item)->folder();
+      auto fli = dynamic_cast<FolderListItem*>(item);
+      if(!fli)
+        continue;
+      Folder *f = fli->folder();
       if (deleteFolder(f))
         delete item;
-    } else
-      dynamic_cast<WindowListItem*>(item)->window()->close();
+    } else {
+      auto wli = dynamic_cast<WindowListItem*>(item);
+      if(wli)
+        wli->window()->close();
+    }
   }
   folders->blockSignals(false);
 }
@@ -9786,12 +9989,20 @@ void ApplicationWindow::showWindowPopupMenu(Q3ListViewItem *it, const QPoint &p,
   }
 
   if (it->rtti() == FolderListItem::RTTI){
-    d_current_folder = dynamic_cast<FolderListItem*>(it)->folder();
-    showFolderPopupMenu(it, p, false);
+    auto fli = dynamic_cast<FolderListItem*>(it);
+    if(fli)
+    {
+      d_current_folder = fli->folder();
+      showFolderPopupMenu(it, p, false);
+    }
     return;
   }
 
-  MdiSubWindow *w= dynamic_cast<WindowListItem*>(it)->window();
+  auto wli = dynamic_cast<WindowListItem*>(it);
+  if(!wli)
+    return;
+
+  MdiSubWindow *w = wli->window();
   if (w){
     QMenu cm(this);
     QMenu plots(this);
@@ -9842,6 +10053,8 @@ void ApplicationWindow::showWindowPopupMenu(Q3ListViewItem *it, const QPoint &p,
       }
     } else if (w->isA("Graph3D")) {
       Graph3D *sp=dynamic_cast<Graph3D*>(w);
+      if(!sp)
+        return;
       Matrix *m = sp->matrix();
       QString formula = sp->formula();
       if (!formula.isEmpty()){
@@ -9903,8 +10116,12 @@ QStringList ApplicationWindow::depending3DPlots(Matrix *m)
   QStringList plots;
   QList<MdiSubWindow *> windows = windowsList();
   foreach(MdiSubWindow *w, windows){
-    if (w->isA("Graph3D") && dynamic_cast<Graph3D*>(w)->matrix() == m)
-      plots << w->objectName();
+    if (w->isA("Graph3D"))
+    {
+      auto g3d = dynamic_cast<Graph3D*>(w);
+      if(g3d && g3d->matrix() == m)
+        plots << w->objectName();
+    }
   }
   return plots;
 }
@@ -9916,7 +10133,10 @@ QStringList ApplicationWindow::dependingPlots(const QString& name)
   QList<MdiSubWindow *> windows = windowsList();
   foreach(MdiSubWindow *w, windows){
     if (w->isA("MultiLayer")){
-      QList<Graph *> layers = dynamic_cast<MultiLayer*>(w)->layersList();
+      auto ml = dynamic_cast<MultiLayer*>(w);
+      if(!ml)
+        return plots;
+      QList<Graph *> layers = ml->layersList();
       foreach(Graph *g, layers){
         onPlot = g->curvesList();
         onPlot = onPlot.grep (name,TRUE);
@@ -9924,7 +10144,8 @@ QStringList ApplicationWindow::dependingPlots(const QString& name)
           plots << w->objectName();
       }
     }else if (w->isA("Graph3D")){
-      if ((dynamic_cast<Graph3D*>(w)->formula()).contains(name,TRUE) && plots.contains(w->objectName())<=0)
+      auto g3d = dynamic_cast<Graph3D*>(w);
+      if (g3d && (g3d->formula()).contains(name,TRUE) && !plots.contains(w->objectName()))
         plots << w->objectName();
     }
   }
@@ -9934,14 +10155,17 @@ QStringList ApplicationWindow::dependingPlots(const QString& name)
 QStringList ApplicationWindow::multilayerDependencies(QWidget *w)
 {
   QStringList tables;
-  MultiLayer *g=dynamic_cast<MultiLayer*>(w);
+  MultiLayer* g = dynamic_cast<MultiLayer*>(w);
+  if(!g)
+    return tables;
+
   QList<Graph *> layers = g->layersList();
   foreach(Graph *ag, layers){
     QStringList onPlot=ag->curvesList();
     for (int j=0; j<onPlot.count(); j++)
     {
       QStringList tl = onPlot[j].split("_", QString::SkipEmptyParts);
-      if (tables.contains(tl[0])<=0)
+      if (!tables.contains(tl[0]))
         tables << tl[0];
     }
   }
@@ -9956,10 +10180,15 @@ void ApplicationWindow::showGraphContextMenu()
 
   QMenu cm(this);
   Graph* ag = dynamic_cast<Graph*>(plot->activeGraph());
+  if(!ag)
+    return;
   PlotToolInterface* tool = ag->activeTool();
   if (dynamic_cast<PeakPickerTool*>(tool))
   {
-    dynamic_cast<PeakPickerTool*>(tool)->prepareContextMenu(cm);
+    auto ppt = dynamic_cast<PeakPickerTool*>(tool);
+    if(!ppt)
+      return;
+    ppt->prepareContextMenu(cm);
     cm.exec(QCursor::pos());
     return;
   }
@@ -10062,6 +10291,8 @@ void ApplicationWindow::showWindowContextMenu()
   QMenu plot3D(this);
   if (w->isA("MultiLayer")){
     MultiLayer *g = dynamic_cast<MultiLayer*>(w);
+    if(!g)
+      return;
     if (lastCopiedLayer){
       cm.insertItem(getQPixmap("paste_xpm"), tr("&Paste Layer"), this, SLOT(pasteSelection()));
       cm.insertSeparator();
@@ -10083,6 +10314,8 @@ void ApplicationWindow::showWindowContextMenu()
     cm.addAction(actionCloseWindow);
   } else if (w->isA("Graph3D")){
     Graph3D *g=dynamic_cast<Graph3D*>(w);
+    if(!g)
+      return;
     if (!g->hasData()){
       cm.insertItem(tr("3D &Plot"), &plot3D);
       plot3D.addAction(actionAdd3DData);
@@ -10109,6 +10342,8 @@ void ApplicationWindow::showWindowContextMenu()
     cm.addAction(actionCloseWindow);
   } else if (w->isA("Matrix")) {
     Matrix *t = dynamic_cast<Matrix*>(w);
+    if(!t)
+      return;
     if (t->viewType() == Matrix::TableView){
       cm.insertItem(getQPixmap("cut_xpm"),tr("Cu&t"), t, SLOT(cutSelection()));
       cm.insertItem(getQPixmap("copy_xpm"),tr("&Copy"), t, SLOT(copySelection()));
@@ -10740,6 +10975,8 @@ void ApplicationWindow::custom3DActions(MdiSubWindow *w)
   if (w && w->isA("Graph3D"))
   {
     Graph3D* plot = dynamic_cast<Graph3D*>(w);
+    if(!plot)
+      return;
     actionAnimate->setOn(plot->isAnimated());
     actionPerspective->setOn(!plot->isOrthogonal());
     switch(plot->plotStyle())
@@ -11667,11 +11904,16 @@ void ApplicationWindow::integrate()
 
   if (w->isA("MultiLayer"))
     analysis(Integrate);
-  else if (w->isA("Matrix")){
+  else if (w->isA("Matrix"))
+  {
+    auto matrix = dynamic_cast<Matrix*>(w);
+    if(!matrix)
+      return;
+
     QDateTime dt = QDateTime::currentDateTime ();
     QString info = dt.toString(Qt::LocalDate);
     info += "\n" + tr("Integration of %1 from zero is").arg(QString(w->objectName())) + ":\t";
-    info += QString::number((dynamic_cast<Matrix*>(w))->integrate()) + "\n";
+    info += QString::number(matrix->integrate()) + "\n";
     info += "-------------------------------------------------------------\n";
     currentFolder()->appendLogInfo(info);
     showResults(true);
@@ -11839,6 +12081,8 @@ void ApplicationWindow::setPlot3DOptions()
   foreach(MdiSubWindow *w, windows){
     if (w->isA("Graph3D")){
       Graph3D *g = dynamic_cast<Graph3D*>(w);
+      if(!g)
+        continue;
       g->setOrthogonal(orthogonal3DPlots);
       g->setAutoscale(autoscale3DPlots);
       g->setAntialiasing(smooth3DMesh);
@@ -13495,12 +13739,24 @@ void ApplicationWindow::deleteFitTables()
 
   foreach(QWidget *ml, *mLst){
     if (ml->isA("MultiLayer")){
-      QList<Graph *> layers = dynamic_cast<MultiLayer*>(ml)->layersList();
+      auto cml = dynamic_cast<MultiLayer*>(ml);
+      if(!cml)
+        continue;
+
+      QList<Graph *> layers = cml->layersList();
       foreach(Graph *g, layers){
         QList<QwtPlotCurve *> curves = g->fitCurvesList();
         foreach(QwtPlotCurve *c, curves){
-          if (dynamic_cast<PlotCurve*>(c)->type() != Graph::Function){
-            Table *t = dynamic_cast<DataCurve*>(c)->table();
+          auto curve = dynamic_cast<PlotCurve*>(c);
+          if(!curve)
+            continue;
+
+          if(curve->type() != Graph::Function)
+          {
+            auto dc = dynamic_cast<DataCurve*>(c);
+            if(!dc)
+              continue;
+            Table *t = dc->table();
             if (!t)
               continue;
 
@@ -14127,7 +14383,12 @@ Folder* ApplicationWindow::appendProject(const QString& fn, Folder* parentFolder
   QFile file(fn);
   QFileInfo fileInfo(fn);
 
-  file.open(QIODevice::ReadOnly);
+  if(!file.open(QIODevice::ReadOnly))
+  {
+    QMessageBox::critical(this, tr("MantidPlot - File opening error"),  tr("The file: <b> %1 </b> could not be opened!").arg(fn));
+    return 0;
+  }
+
   QTextStream fileTS(&file);
   fileTS.setEncoding(QTextStream::UnicodeUTF8);
 
@@ -14274,7 +14535,12 @@ void ApplicationWindow::showFolderPopupMenu(Q3ListViewItem *it, const QPoint &p,
   cm.insertItem(tr("&Find..."), this, SLOT(showFindDialogue()));
   cm.insertSeparator();
   cm.insertItem(tr("App&end Project..."), this, SLOT(appendProject()));
-  if (dynamic_cast<FolderListItem*>(it)->folder()->parent())
+
+  auto fli = dynamic_cast<FolderListItem*>(it);
+  if(!fli)
+    return;
+
+  if (fli->folder()->parent())
     cm.insertItem(tr("Save &As Project..."), this, SLOT(saveAsProject()));
   else
     cm.insertItem(tr("Save Project &As..."), this, SLOT(saveProjectAs()));
@@ -14287,7 +14553,7 @@ void ApplicationWindow::showFolderPopupMenu(Q3ListViewItem *it, const QPoint &p,
     cm.insertSeparator();
   }
 
-  if (dynamic_cast<FolderListItem*>(it)->folder()->parent())
+  if (fli->folder()->parent())
   {
     cm.insertItem(getQPixmap("close_xpm"), tr("&Delete Folder"), this, SLOT(deleteFolder()), Qt::Key_F8);
     cm.insertItem(tr("&Rename"), this, SLOT(startRenameFolder()), Qt::Key_F2);
@@ -14364,8 +14630,12 @@ void ApplicationWindow::startRenameFolder(Q3ListViewItem *item)
     return;
 
   if (item->listView() == lv && item->rtti() == FolderListItem::RTTI) {
+    auto fli = dynamic_cast<FolderListItem*>(item);
+    if(!fli)
+      return;
+
     disconnect(folders, SIGNAL(currentChanged(Q3ListViewItem *)), this, SLOT(folderItemChanged(Q3ListViewItem *)));
-    d_current_folder = dynamic_cast<FolderListItem*>(item)->folder();
+    d_current_folder = fli->folder();
     FolderListItem *it = d_current_folder->folderListItem();
     it->setRenameEnabled (0, true);
     it->startRename (0);
@@ -14379,8 +14649,8 @@ void ApplicationWindow::renameFolder(Q3ListViewItem *it, int col, const QString
 {
   Q_UNUSED(col)
 
-		    if (!it)
-		      return;
+  if (!it)
+    return;
 
   Folder *parent = dynamic_cast<Folder *>(currentFolder()->parent());
   if (!parent)//the parent folder is the project folder (it always exists)
@@ -14446,10 +14716,15 @@ void ApplicationWindow::showAllFolderWindows()
 
   FolderListItem *fi = currentFolder()->folderListItem();
   FolderListItem *item = dynamic_cast<FolderListItem *>(fi->firstChild());
+  if(!item)
+    return;
   int initial_depth = item->depth();
   while (item && item->depth() >= initial_depth)
   {// show/hide windows in all subfolders
-    lst = dynamic_cast<Folder *>(item->folder())->windowsList();
+    auto fld = dynamic_cast<Folder*>(item->folder());
+    if(!fld)
+      break;
+    lst = fld->windowsList();
     foreach(MdiSubWindow *w, lst){
       if (w && show_windows_policy == SubFolders){
         updateWindowLists(w);
@@ -14693,7 +14968,11 @@ void ApplicationWindow::folderItemDoubleClicked(Q3ListViewItem *it)
   if (!it || it->rtti() != FolderListItem::RTTI)
     return;
 
-  FolderListItem *item = dynamic_cast<FolderListItem*>(it)->folder()->folderListItem();
+  auto fli = dynamic_cast<FolderListItem*>(it);
+  if(!fli)
+    return;
+
+  FolderListItem *item = fli->folder()->folderListItem();
   folders->setCurrentItem(item);
 }
 
@@ -14703,7 +14982,13 @@ void ApplicationWindow::folderItemChanged(Q3ListViewItem *it)
     return;
 
   it->setOpen(true);
-  changeFolder (dynamic_cast<FolderListItem*>(it)->folder());
+
+  auto fli = dynamic_cast<FolderListItem*>(it);
+
+  if(!fli)
+    return;
+
+  changeFolder(fli->folder());
   folders->setFocus();
 }
 
@@ -14885,6 +15170,9 @@ void ApplicationWindow::addListViewItem(MdiSubWindow *w)
 void ApplicationWindow::windowProperties()
 {
   WindowListItem *it = dynamic_cast<WindowListItem*>(lv->currentItem());
+  if(!it)
+    return;
+
   MdiSubWindow *w = it->window();
   if (!w)
     return;
@@ -14989,21 +15277,27 @@ void ApplicationWindow::dropFolderItems(Q3ListViewItem *dest)
   if (!dest || draggedItems.isEmpty ())
     return;
 
-  Folder *dest_f = dynamic_cast<FolderListItem *>(dest)->folder();
+  auto dfli = dynamic_cast<FolderListItem*>(dest);
+  if(!dfli)
+    return;
+  Folder *dest_f = dfli->folder();
 
   Q3ListViewItem *it;
   QStringList subfolders = dest_f->subfolders();
 
   foreach(it, draggedItems){
     if (it->rtti() == FolderListItem::RTTI){
-      Folder *f = dynamic_cast<FolderListItem*>(it)->folder();
+      auto itfli = dynamic_cast<FolderListItem*>(it);
+      if(!itfli)
+        continue;
+      Folder *f = itfli->folder();
       FolderListItem *src = f->folderListItem();
       if (dest_f == f){
         QMessageBox::critical(this, "MantidPlot - Error", tr("Cannot move an object to itself!"));//Mantid
         return;
       }
 
-      if (dynamic_cast<FolderListItem *>(dest)->isChildOf(src)){
+      if (dfli->isChildOf(src)){
         QMessageBox::critical(this,"MantidPlot - Error",tr("Cannot move a parent folder into a child folder!"));//Mantid
         draggedItems.clear();
         folders->setCurrentItem(currentFolder()->folderListItem());
@@ -15020,17 +15314,22 @@ void ApplicationWindow::dropFolderItems(Q3ListViewItem *dest)
         QMessageBox::critical(this, tr("MantidPlot") +" - " + tr("Skipped moving folder"),//Mantid
             tr("The destination folder already contains a folder called '%1'! Folder skipped!").arg(f->objectName()));
       } else
-        moveFolder(src, dynamic_cast<FolderListItem *>(dest));
+        moveFolder(src, dfli);
     } else {
       if (dest_f == currentFolder())
         return;
 
-      MdiSubWindow *w = dynamic_cast<WindowListItem*>(it)->window();
-      if (w){
-        currentFolder()->removeWindow(w);
-        w->hide();
-        dest_f->addWindow(w);
-        delete it;
+      auto wli = dynamic_cast<WindowListItem*>(it);
+      if(wli)
+      {
+        MdiSubWindow *w = wli->window();
+        if (w)
+        {
+          currentFolder()->removeWindow(w);
+          w->hide();
+          dest_f->addWindow(w);
+          delete it;
+        }
       }
     }
   }
@@ -15174,10 +15473,13 @@ void ApplicationWindow::goToRow()
     if ( !ok )
       return;
 
-    if (w->inherits("Table"))
-      dynamic_cast<Table*>(w)->goToRow(row);
-    else if (w->isA("Matrix"))
-      (dynamic_cast<Matrix*>(w))->goToRow(row);
+    auto table = dynamic_cast<Table*>(w);
+    auto matrix = dynamic_cast<Matrix*>(w);
+
+    if(table)
+      table->goToRow(row);
+    else if(matrix)
+      matrix->goToRow(row);
   }
 }
 
@@ -15598,7 +15900,11 @@ void ApplicationWindow::hideSelectedWindows()
   folders->blockSignals(true);
   foreach(item, lst){
     if (item->rtti() != FolderListItem::RTTI)
-      hideWindow(dynamic_cast<WindowListItem*>(item)->window());
+    {
+      auto wli = dynamic_cast<WindowListItem*>(item);
+      if(wli)
+        hideWindow(wli->window());
+    }
   }
   folders->blockSignals(false);
 }
@@ -15615,7 +15921,11 @@ void ApplicationWindow::showSelectedWindows()
   folders->blockSignals(true);
   foreach(item, lst){
     if (item->rtti() != FolderListItem::RTTI)
-      activateWindow(dynamic_cast<WindowListItem*>(item)->window());
+    {
+      auto wli = dynamic_cast<WindowListItem*>(item);
+      if(wli)
+        activateWindow(wli->window());
+    }
   }
   folders->blockSignals(false);
 }
@@ -16291,7 +16601,10 @@ void ApplicationWindow::setMatrixUndoStackSize(int size)
     QList<MdiSubWindow *> folderWindows = f->windowsList();
     foreach(MdiSubWindow *w, folderWindows){
       if (w->isA("Matrix")){
-        QUndoStack *stack = (dynamic_cast<Matrix*>(w))->undoStack();
+        auto matrix = dynamic_cast<Matrix*>(w);
+        if(!matrix)
+          continue;
+        QUndoStack *stack = matrix->undoStack();
         if (!stack->count())// undo limit can only be changed for empty stacks
           stack->setUndoLimit(size);
       }