//======================================================
 Draw_Window* Draw_Window::firstWindow = NULL;
 
+// X11 specific part
 #if !defined(__APPLE__) || defined(MACOSX_USE_GLX)
+#include <Aspect_DisplayConnection.hxx>
+
+static Handle(Aspect_DisplayConnection) Draw_DisplayConnection;
+
 //=======================================================================
 //function : Draw_Window
 //purpose  :
   Tk_GeometryRequest(mainWindow, 200, 200);
 
 #if !defined(__APPLE__) || defined(MACOSX_USE_GLX)
-  if (Draw_WindowDisplay == NULL) {
-    Draw_WindowDisplay = XOpenDisplay(NULL);
-    // Replaced Tk_Display(mainWindow) with XOpenDisplay; On Mac OS X Tk_Display
-    // returns a pointer to Display structure defined in system Tcl/Tk libraries.
-    // This structure differs from structure defined in X11 library and
-    // this caused DRAWEXE crash on startup.
+  if (Draw_DisplayConnection.IsNull())
+  {
+    try
+    {
+      Draw_DisplayConnection = new Aspect_DisplayConnection();
+    }
+    catch (Standard_Failure)
+    {
+      std::cout << "Cannot open display. Interpret commands in batch mode." << std::endl;
+      return Standard_False;      
+    }
   }
-  if (Draw_WindowDisplay == NULL) {
-    cout << "Cannot open display : "<<XDisplayName(NULL)<<endl;
-    cout << "Interpret commands in batch mode."<<endl;
-    return Standard_False;
+  if (Draw_WindowDisplay == NULL)
+  {
+    Draw_WindowDisplay = Draw_DisplayConnection->GetDisplay();
   }
   //
   // synchronize the display server : could be done within Tk_Init