diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3c6ad000e3..4af0907d48 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -364,6 +364,7 @@ if (MSVC)
 endif()
 
 # whether use optional 3rdparty or not
+set (USE_TK        ON  CACHE BOOL "${USE_TK_DESCR}")
 set (USE_FREETYPE  ON  CACHE BOOL "${USE_FREETYPE_DESCR}")
 set (USE_FREEIMAGE OFF CACHE BOOL "${USE_FREEIMAGE_DESCR}")
 set (USE_FFMPEG    OFF CACHE BOOL "${USE_FFMPEG_DESCR}")
@@ -501,6 +502,7 @@ endif()
 # search for CSF variable in EXTERNLIB of each being used toolkit
 OCCT_IS_PRODUCT_REQUIRED (CSF_FreeImagePlus CAN_USE_FREEIMAGE)
 OCCT_IS_PRODUCT_REQUIRED (CSF_TclLibs USE_TCL)
+OCCT_IS_PRODUCT_REQUIRED (CSF_TclTkLibs CAN_USE_TK)
 OCCT_IS_PRODUCT_REQUIRED (CSF_FREETYPE CAN_USE_FREETYPE)
 OCCT_IS_PRODUCT_REQUIRED (CSF_OpenGlLibs CAN_USE_OPENGL)
 OCCT_IS_PRODUCT_REQUIRED (CSF_OpenGlesLibs CAN_USE_GLES2)
@@ -510,17 +512,28 @@ OCCT_IS_PRODUCT_REQUIRED (CSF_EIGEN CAN_USE_EIGEN)
 # define CSF variable
 OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_csf")
 
+# Tcl (mandatory for Draw Harness)
 if (USE_TCL)
   message (STATUS "Info: TCL is used by OCCT")
   OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/tcl")
-
-  message (STATUS "Info: TK is used by OCCT")
-  OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/tk")
 else()
   OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TCL")
-  OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TK")
-
   OCCT_CHECK_AND_UNSET ("INSTALL_TCL")
+endif()
+
+# Tk (optional for Draw Harness)
+if (CAN_USE_TK)
+  if (USE_TK)
+    message (STATUS "Info: TK is used by OCCT")
+    add_definitions (-DHAVE_TK)
+    OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/tk")
+  else()
+    OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TK")
+    OCCT_CHECK_AND_UNSET ("INSTALL_TK")
+  endif()
+else()
+  OCCT_CHECK_AND_UNSET ("USE_TK")
+  OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TK")
   OCCT_CHECK_AND_UNSET ("INSTALL_TK")
 endif()
 
diff --git a/adm/cmake/occt_csf.cmake b/adm/cmake/occt_csf.cmake
index c283e6c601..5b96a61d93 100644
--- a/adm/cmake/occt_csf.cmake
+++ b/adm/cmake/occt_csf.cmake
@@ -49,18 +49,28 @@ else()
   set (CSF_OpenVR)
 endif()
 
-# TCL/TK
+# TCL
 if (USE_TCL)
   if (WIN32)
     set (CSF_TclLibs     "tcl86")
+  else()
+    if(APPLE)
+      set (CSF_TclLibs   Tcl)
+    elseif(UNIX)
+      set (CSF_TclLibs   "tcl8.6")
+    endif()
+  endif()
+endif()
+
+# TK
+if (USE_TK)
+  if (WIN32)
     set (CSF_TclTkLibs   "tk86")
   else()
     if(APPLE)
       set (CSF_TclTkLibs Tk)
-      set (CSF_TclLibs   Tcl)
     elseif(UNIX)
-      set (CSF_TclLibs     "tcl8.6")
-      set (CSF_TclTkLibs   "tk8.6")
+      set (CSF_TclTkLibs "tk8.6")
     endif()
   endif()
 endif()
diff --git a/adm/cmake/vardescr.cmake b/adm/cmake/vardescr.cmake
index f04395ca92..2d07950501 100644
--- a/adm/cmake/vardescr.cmake
+++ b/adm/cmake/vardescr.cmake
@@ -155,6 +155,9 @@ set (3RDPARTY_DIR_DESCR
 third-party product have been found - corresponding CMake variables will be specified
 (VTK: 3RDPARTY_VTK_DIR, 3RDPARTY_VTK_INCLUDE_DIR, 3RDPARTY_VTK_LIBRARY_DIR)")
 
+set (USE_TK_DESCR
+"Indicates whether Tk product should be used by Draw Harness for user interface")
+
 set (USE_FREETYPE_DESCR
 "Indicates whether FreeType product should be used in OCCT for text rendering using external font files")
 
diff --git a/adm/genconfdeps.tcl b/adm/genconfdeps.tcl
index 0054c92b60..8dc5925019 100644
--- a/adm/genconfdeps.tcl
+++ b/adm/genconfdeps.tcl
@@ -68,8 +68,9 @@ if { [info exists ::env(SHORTCUT_HEADERS)] } {
 }
 
 # fetch environment variables (e.g. set by custom.sh or custom.bat) and set them as tcl variables with the same name
-set THE_ENV_VARIABLES {HAVE_FREETYPE HAVE_FREEIMAGE HAVE_FFMPEG HAVE_TBB HAVE_GLES2 HAVE_D3D HAVE_VTK HAVE_ZLIB HAVE_LIBLZMA HAVE_E57 HAVE_RAPIDJSON HAVE_OPENVR HAVE_OPENCL CHECK_QT4 CHECK_JDK MACOSX_USE_GLX HAVE_RelWithDebInfo BUILD_Inspector}
+set THE_ENV_VARIABLES {HAVE_TK HAVE_FREETYPE HAVE_FREEIMAGE HAVE_FFMPEG HAVE_TBB HAVE_GLES2 HAVE_D3D HAVE_VTK HAVE_ZLIB HAVE_LIBLZMA HAVE_E57 HAVE_RAPIDJSON HAVE_OPENVR HAVE_OPENCL CHECK_QT4 CHECK_JDK MACOSX_USE_GLX HAVE_RelWithDebInfo BUILD_Inspector}
 foreach anEnvIter $THE_ENV_VARIABLES { set ${anEnvIter} "false" }
+set HAVE_TK       "true"
 set HAVE_FREETYPE "true"
 foreach anEnvIter $THE_ENV_VARIABLES {
   if { [info exists ::env(${anEnvIter})] } {
diff --git a/adm/genproj.tcl b/adm/genproj.tcl
index 64e0eb2b27..68032c10db 100644
--- a/adm/genproj.tcl
+++ b/adm/genproj.tcl
@@ -1416,7 +1416,9 @@ proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap theRelease} {
     set aLibsMap(CSF_FREETYPE) "freetype"
   }
   set aLibsMap(CSF_TclLibs)   "tcl8.6"
-  set aLibsMap(CSF_TclTkLibs) "tk8.6"
+  if { "$::HAVE_TK" == "true" } {
+    set aLibsMap(CSF_TclTkLibs) "tk8.6"
+  }
   if { "$::HAVE_FREEIMAGE" == "true" } {
     if { "$theOS" == "wnt" } {
       set aLibsMap(CSF_FreeImagePlus) "FreeImage"
@@ -1472,7 +1474,9 @@ proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap theRelease} {
 
     # the naming is different on Windows
     set aLibsMap(CSF_TclLibs)      "tcl86"
-    set aLibsMap(CSF_TclTkLibs)    "tk86"
+    if { "$::HAVE_TK" == "true" } {
+      set aLibsMap(CSF_TclTkLibs)  "tk86"
+    }
     if { "$theRelease" == "true" } {
       set aLibsMap(CSF_QT)         "Qt5Gui Qt5Widgets Qt5Xml Qt5Core"
     } else {
@@ -1501,10 +1505,12 @@ proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap theRelease} {
         set aFrmsMap(CSF_Appkit)   "AppKit"
       }
       set aFrmsMap(CSF_IOKit)      "IOKit"
-      set aFrmsMap(CSF_TclLibs)    "Tcl"
       set aLibsMap(CSF_TclLibs)    ""
-      set aFrmsMap(CSF_TclTkLibs)  "Tk"
       set aLibsMap(CSF_TclTkLibs)  ""
+      set aFrmsMap(CSF_TclLibs)    "Tcl"
+      if { "$::HAVE_TK" == "true" } {
+        set aFrmsMap(CSF_TclTkLibs) "Tk"
+      }
       set aLibsMap(CSF_QT)         "QtCore QtGui"
     } elseif { "$theOS" == "android" } {
       set aLibsMap(CSF_androidlog) "log"
@@ -1516,7 +1522,9 @@ proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap theRelease} {
         # CSF_ThreadLibs - pthread API is part of libc on QNX
       } else {
         set aLibsMap(CSF_ThreadLibs) "pthread rt"
-        set aLibsMap(CSF_TclTkLibs)  "X11 tk8.6"
+        if { "$::HAVE_TK" == "true" } {
+          set aLibsMap(CSF_TclTkLibs) "tk8.6"
+        }
         set aLibsMap(CSF_XwLibs)     "X11 Xext Xmu Xi"
         set aLibsMap(CSF_MotifLibs)  "X11"
       }
diff --git a/adm/templates/env.bat b/adm/templates/env.bat
index 1a53234c76..78dfa0eec4 100644
--- a/adm/templates/env.bat
+++ b/adm/templates/env.bat
@@ -17,6 +17,7 @@ set "ARCH=64"
 set "VCVARS="
 set "HAVE_TBB=false"
 set "HAVE_OPENCL=false"
+set "HAVE_TK=true"
 set "HAVE_FREETYPE=true"
 set "HAVE_FREEIMAGE=false"
 set "HAVE_FFMPEG=false"
@@ -183,6 +184,7 @@ set "CSF_OPT_CMPL="
 set "PRODUCTS_DEFINES="
 if ["%HAVE_TBB%"]       == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_TBB"       & set "CSF_DEFINES=HAVE_TBB;%CSF_DEFINES%"
 if ["%HAVE_OPENCL%"]    == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_OPENCL"    & set "CSF_DEFINES=HAVE_OPENCL;%CSF_DEFINES%"
+if ["%HAVE_TK%"]        == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_TK"        & set "CSF_DEFINES=HAVE_TK;%CSF_DEFINES%"
 if ["%HAVE_FREETYPE%"]  == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_FREEIMAGE" & set "CSF_DEFINES=HAVE_FREETYPE;%CSF_DEFINES%"
 if ["%HAVE_FREEIMAGE%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_FREEIMAGE" & set "CSF_DEFINES=HAVE_FREEIMAGE;%CSF_DEFINES%"
 if ["%HAVE_FFMPEG%"]    == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_FFMPEG"    & set "CSF_DEFINES=HAVE_FFMPEG;%CSF_DEFINES%"
diff --git a/adm/templates/env.sh b/adm/templates/env.sh
index e3f1483eda..01cdab82f2 100644
--- a/adm/templates/env.sh
+++ b/adm/templates/env.sh
@@ -9,6 +9,7 @@ export CASDEB=""
 export PRJFMT="";
 export HAVE_TBB="false";
 export HAVE_OPENCL="false";
+export HAVE_TK="true";
 export HAVE_FREETYPE="true";
 export HAVE_FREEIMAGE="false";
 export HAVE_FFMPEG="false";
@@ -101,6 +102,7 @@ export CSF_OPT_CMPL=""
 # Optiona 3rd-parties should be enabled by HAVE macros
 if [ "$HAVE_TBB"       == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_TBB"; fi
 if [ "$HAVE_OPENCL"    == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_OPENCL"; fi
+if [ "$HAVE_TK"        == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_TK"; fi
 if [ "$HAVE_FREETYPE"  == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_FREETYPE"; fi
 if [ "$HAVE_FREEIMAGE" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_FREEIMAGE"; fi
 if [ "$HAVE_FFMPEG"    == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_FFMPEG"; fi
diff --git a/src/Draw/Draw_BasicCommands.cxx b/src/Draw/Draw_BasicCommands.cxx
index 4657d70c1f..d1441dad5a 100644
--- a/src/Draw/Draw_BasicCommands.cxx
+++ b/src/Draw/Draw_BasicCommands.cxx
@@ -343,6 +343,11 @@ static Standard_Integer dversion(Draw_Interpretor& di, Standard_Integer, const c
 #elif defined(_DEBUG)
   di << "Debug mode\n";
 #endif
+#ifdef HAVE_TK
+  di << "Tk enabled (HAVE_TK)\n";
+#else
+  di << "Tk disabled\n";
+#endif
 #ifdef HAVE_TBB
   di << "TBB enabled (HAVE_TBB)\n";
 #else 
diff --git a/src/Draw/Draw_Window.cxx b/src/Draw/Draw_Window.cxx
index e2191f23f0..e0f3be4882 100644
--- a/src/Draw/Draw_Window.cxx
+++ b/src/Draw/Draw_Window.cxx
@@ -28,6 +28,7 @@
 #include <TCollection_AsciiString.hxx>
 #include <TCollection_ExtendedString.hxx>
 #include <Image_AlienPixMap.hxx>
+#include <Message.hxx>
 #include <NCollection_List.hxx>
 
 extern Standard_Boolean Draw_Batch;
@@ -109,6 +110,7 @@ defaultPrompt:
 #include <Draw_Window.hxx>
 #include <unistd.h>
 
+#ifdef HAVE_TK
 #if defined(__APPLE__) && !defined(MACOSX_USE_GLX)
   // use forward declaration for small subset of used Tk functions
   // to workaround broken standard Tk framework installation within OS X SDKs
@@ -127,6 +129,7 @@ defaultPrompt:
 #else
   #include <tk.h>
 #endif
+#endif
 
 /*
  * Global variables used by the main program:
@@ -926,41 +929,38 @@ void Draw_Window::WConfigureNotify(const Standard_Integer,
 //function : WUnmapNotify
 //purpose  :
 //=======================================================================
-
 void Draw_Window::WUnmapNotify()
 {
 }
 
-
 //======================================================
 // function : ProcessEvents
 // purpose  : process pending X events
 //======================================================
-
 static void ProcessEvents(ClientData,int)
 {
   // test for X Event
+  while (XPending (Draw_WindowDisplay))
+  {
+    XEvent anEvent = {};
+    XNextEvent (Draw_WindowDisplay, &anEvent);
 
-  while (XPending(Draw_WindowDisplay)) {
-
-    XEvent xev;
-    xev.type = 0;
-
-    XNextEvent(Draw_WindowDisplay,&xev);
-
-    /* search the window in the window list */
-    Draw_Window* w = Draw_Window::firstWindow;
-    Standard_Integer found=0;
-    while (w) {
-      if (xev.xany.window == w->win) {
-        ProcessEvent(*w, xev);
-        found=1;
+    // search the window in the window list
+    bool isFound = false;
+    for (Draw_Window* aWinIter = Draw_Window::firstWindow; aWinIter != NULL; aWinIter = aWinIter->next)
+    {
+      if (anEvent.xany.window == aWinIter->win)
+      {
+        ProcessEvent (*aWinIter, anEvent);
+        isFound = true;
         break;
       }
-      w = w->next;
     }
-    if (found==0) {
-      Tk_HandleEvent(&xev);
+    if (!isFound)
+    {
+    #ifdef _TK
+      Tk_HandleEvent (&anEvent);
+    #endif
     }
   }
 }
@@ -998,96 +998,59 @@ void GetNextEvent(Event& ev)
 // function :Run_Appli
 // purpose :
 //======================================================
-
-
 static Standard_Boolean(*Interprete) (const char*);
 
 void Run_Appli(Standard_Boolean (*interprete) (const char*))
 {
-  Tcl_Channel outChannel, inChannel ;
   Interprete = interprete;
 
-#ifdef _TK
-
-    /*
-     * Commands will come from standard input, so set up an event
-     * handler for standard input.  If the input device is aEvaluate the
-     * .rc file, if one has been specified, set up an event handler
-     * for standard input, and print a prompt if the input
-     * device is a terminal.
-     */
-  inChannel = Tcl_GetStdChannel(TCL_STDIN);
-  if (inChannel) {
-            Tcl_CreateChannelHandler(inChannel, TCL_READABLE, StdinProc,
-                    (ClientData) inChannel);
-        }
+  // Commands will come from standard input, so set up an event handler for standard input.
+  // If the input device is aEvaluate the .rc file, if one has been specified,
+  // set up an event handler for standard input, and print a prompt if the input device is a terminal.
+  Tcl_Channel anInChannel = Tcl_GetStdChannel(TCL_STDIN);
+  if (anInChannel)
+  {
+    Tcl_CreateChannelHandler (anInChannel, TCL_READABLE, StdinProc, (ClientData )anInChannel);
+  }
 
   // Create a handler for the draw display
-
-  // Adding of the casting into void* to be able to compile on AO1
-  // ConnectionNumber(Draw_WindowDisplay) is an int 32 bits
-  //                    (void*) is a pointer      64 bits ???????
-
 #if !defined(__APPLE__) || defined(MACOSX_USE_GLX)
-#if TCL_MAJOR_VERSION  < 8
-    Tk_CreateFileHandler((void*) ConnectionNumber(Draw_WindowDisplay),
-                         TK_READABLE, ProcessEvents,(ClientData) 0 );
-#else
-    Tk_CreateFileHandler(ConnectionNumber(Draw_WindowDisplay),
-                         TK_READABLE, ProcessEvents,(ClientData) 0 );
-#endif
+  Tcl_CreateFileHandler (ConnectionNumber(Draw_WindowDisplay), TCL_READABLE, ProcessEvents, (ClientData) 0);
 #endif // __APPLE__
 
-#endif
-
   Draw_Interpretor& aCommands = Draw::GetInterpretor();
 
-  if (tty) Prompt(aCommands.Interp(), 0);
-  Prompt(aCommands.Interp(), 0);
+  if (tty) { Prompt (aCommands.Interp(), 0); }
+  Prompt (aCommands.Interp(), 0);
 
-  outChannel = Tcl_GetStdChannel(TCL_STDOUT);
-  if (outChannel) {
-        Tcl_Flush(outChannel);
-    }
-  Tcl_DStringInit(&command);
-
-  /*
-   * Loop infinitely, waiting for commands to execute.  When there
-   * are no windows left, Tk_MainLoop returns and we exit.
-   */
+  Tcl_Channel anOutChannel = Tcl_GetStdChannel(TCL_STDOUT);
+  if (anOutChannel)
+  {
+    Tcl_Flush (anOutChannel);
+  }
+  Tcl_DStringInit (&command);
 
 #ifdef _TK
-
-  if (Draw_VirtualWindows) {
+  if (Draw_VirtualWindows)
+  {
     // main window will never shown
     // but main loop will parse all Xlib messages
     Tcl_Eval(aCommands.Interp(), "wm withdraw .");
   }
+  // Loop infinitely, waiting for commands to execute.
+  // When there are no windows left, Tk_MainLoop returns and we exit.
   Tk_MainLoop();
-
 #else
-
-  fd_set readset;
-  Standard_Integer count = ConnectionNumber(Draw_WindowDisplay);
-  Standard_Integer numfd;
-  while (1) {
-      FD_ZERO(&readset);
-      FD_SET(0,&readset);
-      FD_SET(count,&readset);
-#ifdef HPUX
-      numfd = select(count+1,(Integer*)&readset,NULL,NULL,NULL);
-#else
-      numfd = select(count+1,&readset,NULL,NULL,NULL);
-#endif
-      if (FD_ISSET(0,&readset))     StdinProc((ClientData)0,0);
-      if (FD_ISSET(count,&readset)) ProcessEvents((ClientData)0,0);
-    }
-
-#endif
-  NCollection_List<Draw_Window::FCallbackBeforeTerminate>::Iterator Iter(MyCallbacks);
-  for(; Iter.More(); Iter.Next())
+  for (;;)
   {
-      (*Iter.Value())();
+    Tcl_DoOneEvent (0); // practically the same as Tk_MainLoop()
+  }
+#endif
+
+  for (NCollection_List<Draw_Window::FCallbackBeforeTerminate>::Iterator anIter (MyCallbacks);
+       anIter.More(); anIter.Next())
+  {
+    (*anIter.Value())();
   }
 }
 
@@ -1102,11 +1065,15 @@ Standard_Boolean Init_Appli()
   Tcl_Interp *interp = aCommands.Interp();
   Tcl_Init (interp);
 
-  try {
+#ifdef _TK
+  try
+  {
     OCC_CATCH_SIGNALS
-    Tk_Init(interp) ;
-  } catch  (Standard_Failure const&) {
-    std::cout <<" Pb au lancement de TK_Init "<<std::endl;
+    Tk_Init (interp);
+  }
+  catch (Standard_Failure const& theFail)
+  {
+    Message::SendFail() << "TK_Init() failed with " << theFail;
   }
 
   Tcl_StaticPackage(interp, "Tk", Tk_Init, (Tcl_PackageInitProc *) NULL);
@@ -1127,6 +1094,7 @@ Standard_Boolean Init_Appli()
 #endif
 
   Tk_GeometryRequest (aMainWindow, 200, 200);
+#endif
 
 #if !defined(__APPLE__) || defined(MACOSX_USE_GLX)
   if (Draw_DisplayConnection.IsNull())
@@ -1135,9 +1103,9 @@ Standard_Boolean Init_Appli()
     {
       Draw_DisplayConnection = new Aspect_DisplayConnection();
     }
-    catch (Standard_Failure const&)
+    catch (Standard_Failure const& theFail)
     {
-      std::cout << "Cannot open display. Interpret commands in batch mode." << std::endl;
+      std::cout << "Cannot open display (" << theFail << "). Interpret commands in batch mode." << std::endl;
       return Standard_False;
     }
   }
@@ -1313,7 +1281,9 @@ prompt:
 #include <Draw_Appli.hxx>
 #include <OSD.hxx>
 
-#include <tk.h>
+#ifdef HAVE_TK
+  #include <tk.h>
+#endif
 
 #define PENWIDTH 1
 #define CLIENTWND 0
diff --git a/src/IVtkDraw/IVtkDraw.cxx b/src/IVtkDraw/IVtkDraw.cxx
index e71826b5ef..5ec039e011 100644
--- a/src/IVtkDraw/IVtkDraw.cxx
+++ b/src/IVtkDraw/IVtkDraw.cxx
@@ -83,7 +83,6 @@
   #include <Xw_Window.hxx>
   #include <vtkXRenderWindowInteractor.h>
   #include <vtkXOpenGLRenderWindow.h>
-  #include <tk.h>
 #endif
 #include <Standard_WarningsRestore.hxx>
 
diff --git a/src/IVtkDraw/IVtkDraw_Interactor.cxx b/src/IVtkDraw/IVtkDraw_Interactor.cxx
index c4deb0a89a..94fdf3b56f 100644
--- a/src/IVtkDraw/IVtkDraw_Interactor.cxx
+++ b/src/IVtkDraw/IVtkDraw_Interactor.cxx
@@ -202,13 +202,8 @@ void IVtkDraw_Interactor::Enable()
   SetWindowLongPtr(this->myWindowId, GWLP_USERDATA, (LONG_PTR)this);
   SetWindowLongPtr(this->myWindowId, GWLP_WNDPROC, (LONG_PTR)WndProc);
 #else
-  #if TCL_MAJOR_VERSION  < 8
-    Tk_CreateFileHandler((void*)ConnectionNumber(this->myDisplayId),
-      TK_READABLE, ProcessEvents, (ClientData) this);
-  #else
-    Tk_CreateFileHandler(ConnectionNumber(this->myDisplayId),
-      TK_READABLE, ProcessEvents, (ClientData) this);
-  #endif
+  Tcl_CreateFileHandler (ConnectionNumber(this->myDisplayId),
+                         TCL_READABLE, ProcessEvents, (ClientData) this);
 #endif
 
   this->Enabled = 1;
diff --git a/src/TKIVtkDraw/EXTERNLIB b/src/TKIVtkDraw/EXTERNLIB
index bf40a7d852..d9f63df45d 100644
--- a/src/TKIVtkDraw/EXTERNLIB
+++ b/src/TKIVtkDraw/EXTERNLIB
@@ -1,6 +1,5 @@
 CSF_VTK
 CSF_TclLibs
-CSF_TclTkLibs
 CSF_XwLibs
 CSF_user32
 TKernel
diff --git a/src/TKViewerTest/EXTERNLIB b/src/TKViewerTest/EXTERNLIB
index 69ed86ef20..56c9446045 100755
--- a/src/TKViewerTest/EXTERNLIB
+++ b/src/TKViewerTest/EXTERNLIB
@@ -18,7 +18,6 @@ TKMesh
 TKV3d
 TKDraw
 CSF_TclLibs
-CSF_TclTkLibs
 CSF_XwLibs
 CSF_user32
 CSF_gdi32
diff --git a/src/ViewerTest/ViewerTest_ViewerCommands.cxx b/src/ViewerTest/ViewerTest_ViewerCommands.cxx
index 0bad61bb81..e67e667bba 100644
--- a/src/ViewerTest/ViewerTest_ViewerCommands.cxx
+++ b/src/ViewerTest/ViewerTest_ViewerCommands.cxx
@@ -107,7 +107,6 @@
   #include <Xw_Window.hxx>
   #include <X11/Xlib.h> /* contains some dangerous #defines such as Status, True etc. */
   #include <X11/Xutil.h>
-  #include <tk.h>
 #endif
 
 //==============================================================================
@@ -2086,9 +2085,8 @@ static int VDriver (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const c
 //==============================================================================
 //function : Vinit
 //purpose  : Create the window viewer and initialize all the global variable
-//    Use Tk_CreateFileHandler on UNIX to catch the X11 Viewer event
+//    Use Tcl_CreateFileHandler on UNIX to catch the X11 Viewer event
 //==============================================================================
-
 static int VInit (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const char** theArgVec)
 {
   TCollection_AsciiString aViewName, aDisplayName;