diff --git a/tools/moldyn/moldyn.cpp b/tools/moldyn/moldyn.cpp
index 2294dd0fdf0c91e75515de3092efd2101f622845..3dfab9a4a49b18293f57e4d848ad96e2e3bcb06c 100644
--- a/tools/moldyn/moldyn.cpp
+++ b/tools/moldyn/moldyn.cpp
@@ -215,6 +215,7 @@ MolDynDlg::MolDynDlg(QWidget* pParent) : QMainWindow{pParent},
 			m::create<t_vec_gl>({1,0,0,0}), m::create<t_vec_gl>({0,0,1,0}));
 
 		connect(m_plot, &GlPlot::AfterGLInitialisation, this, &MolDynDlg::AfterGLInitialisation);
+		connect(m_plot, &GlPlot::GLInitialisationFailed, this, &MolDynDlg::GLInitialisationFailed);
 		connect(m_plot->GetImpl(), &GlPlot_impl::PickerIntersection, this, &MolDynDlg::PickerIntersection);
 		connect(m_plot, &GlPlot::MouseDown, this, &MolDynDlg::PlotMouseDown);
 		connect(m_plot, &GlPlot::MouseUp, this, &MolDynDlg::PlotMouseUp);
@@ -1146,6 +1147,15 @@ void MolDynDlg::AfterGLInitialisation()
 }
 
 
+void MolDynDlg::GLInitialisationFailed()
+{
+	std::string err = "GL initialisation failed.";
+	err += " Need GL version " + std::to_string(_GL_MAJ_VER) + "." + std::to_string(_GL_MIN_VER);
+	err += " and shader version " + std::to_string(_GLSL_MAJ_VER) + std::to_string(_GLSL_MIN_VER) + "0.";
+	QMessageBox::critical(this, PROG_NAME, err.c_str());
+}
+
+
 void MolDynDlg::closeEvent(QCloseEvent *evt)
 {
 	if(m_sett)
diff --git a/tools/moldyn/moldyn.h b/tools/moldyn/moldyn.h
index 12d4c66316d8e2e2c5720c04eac9939a176aea55..e499d951ebc9a370b26c43c2a1eac5c1d27da1c0 100644
--- a/tools/moldyn/moldyn.h
+++ b/tools/moldyn/moldyn.h
@@ -53,6 +53,7 @@ protected:
 	void PlotMouseClick(bool left, bool mid, bool right);
 	void PickerIntersection(const t_vec3_gl* pos, std::size_t objIdx, const t_vec3_gl* posSphere);
 	void AfterGLInitialisation();
+	void GLInitialisationFailed();
 
 	std::tuple<bool, std::size_t, std::size_t, std::size_t> GetAtomIndexFromHandle(std::size_t handle) const;