--- VTK/CMakeLists.txt.orig	2006-08-14 23:35:39.000000000 +0900
+++ VTK/CMakeLists.txt	2007-01-17 02:30:58.000000000 +0900
@@ -1105,22 +1105,28 @@
 
 MACRO (VTK_INCLUDE_TCL_TK_MODULES)
   INCLUDE(${CMAKE_ROOT}/Modules/FindTCL.cmake)
-  SET(VTK_TCL_LIBRARIES ${TCL_LIBRARY})
+  IF(TCL_TK_STUBS)
+    SET(VTK_TCL_LIBRARIES ${TCL_STUB_LIBRARY})
+  ELSE(TCL_TK_STUBS)
+    SET(VTK_TCL_LIBRARIES ${TCL_LIBRARY})
+  ENDIF(TCL_TK_STUBS)
   IF(UNIX)
     # The tcl library needs the math library on unix.
     SET(VTK_TCL_LIBRARIES ${VTK_TCL_LIBRARIES} m)
   ENDIF(UNIX)
   IF(VTK_USE_TK)
-    SET(VTK_TK_LIBRARIES ${TK_LIBRARY} ${VTK_TCL_LIBRARIES})
+    IF(TCL_TK_STUBS)
+      SET(VTK_TK_LIBRARIES ${TK_STUB_LIBRARY} ${VTK_TCL_LIBRARIES})
+    ELSE(TCL_TK_STUBS)
+      SET(VTK_TK_LIBRARIES ${TK_LIBRARY} ${VTK_TCL_LIBRARIES})
+    ENDIF(TCL_TK_STUBS)
   ENDIF(VTK_USE_TK)
   INCLUDE(${VTK_SOURCE_DIR}/CMake/vtkTclTkMacros.cmake)
   # Hide useless settings provided by FindTCL.
   FOREACH(entry 
           TCL_LIBRARY_DEBUG
           TK_LIBRARY_DEBUG
-                  TCL_STUB_LIBRARY
                   TCL_STUB_LIBRARY_DEBUG
-                  TK_STUB_LIBRARY
                   TK_STUB_LIBRARY_DEBUG
           TK_WISH)
     SET(${entry} "${${entry}}" CACHE INTERNAL "This value is not used by VTK.")
@@ -1131,6 +1137,9 @@
   SET(VTK_WRAP_TCL3_INIT_DIR "${VTK_SOURCE_DIR}/Wrapping")
   INCLUDE("${VTK_SOURCE_DIR}/CMake/vtkWrapTcl.cmake")
 
+  OPTION(TCL_TK_STUBS "Build with stubs enabled Tcl/Tk support. TCL_STUB_LIBRARY and TK_STUB_LIBRARY must point to the corresponding Tcl/Tk stubs libraries (example, tclstub84.lib, tkstub84.lib)." OFF)
+  MARK_AS_ADVANCED(TCL_TK_STUBS)
+
   VTK_INCLUDE_TCL_TK_MODULES()
 
   # Wrapping executables.
--- VTK/CMake/KitCommonBlock.cmake.orig	2005-08-25 08:38:58.000000000 +0900
+++ VTK/CMake/KitCommonBlock.cmake	2007-01-16 23:03:03.000000000 +0900
@@ -20,6 +20,9 @@
   VTK_WRAP_TCL3(vtk${KIT}TCL KitTCL_SRCS
                 "${Kit_SRCS}"
                 "${Kit_TCL_EXTRA_CMDS}")
+  IF (TCL_TK_STUBS)
+    ADD_DEFINITIONS(-DUSE_TCL_STUBS)
+  ENDIF (TCL_TK_STUBS)
   ADD_LIBRARY(vtk${KIT}TCL ${KitTCL_SRCS} ${Kit_TCL_EXTRA_SRCS})
   SET(KIT_LIBRARY_TARGETS ${KIT_LIBRARY_TARGETS} vtk${KIT}TCL)
   TARGET_LINK_LIBRARIES (vtk${KIT}TCL vtk${KIT} ${KIT_TCL_LIBS})
--- VTK/Rendering/CMakeLists.txt.orig	2005-08-31 23:05:22.000000000 +0900
+++ VTK/Rendering/CMakeLists.txt	2007-01-16 23:03:03.000000000 +0900
@@ -388,6 +388,10 @@
     SET(Kit_TCL_EXTRA_CMDS 
       vtkTkRenderWidget 
       vtkTkImageViewerWidget)
+
+    IF (TCL_TK_STUBS)
+      ADD_DEFINITIONS(-DUSE_TK_STUBS)
+    ENDIF (TCL_TK_STUBS)
   ENDIF (VTK_USE_TK)
 ENDIF (VTK_WRAP_TCL)
 
--- VTK/Wrapping/vtkWrapTclInit.c.orig	2005-06-25 03:11:31.000000000 +0900
+++ VTK/Wrapping/vtkWrapTclInit.c	2007-01-17 02:10:18.000000000 +0900
@@ -42,6 +42,12 @@
     }
 
   fprintf(fout,"#include \"vtkTclUtil.h\"\n");
+  if (!strcmp(kitName,"Vtkrenderingtcl"))
+    {
+    fprintf(fout,"#ifdef USE_TK_STUBS\n");
+    fprintf(fout,"#include \"vtkTk.h\"\n");
+    fprintf(fout,"#endif\n");
+    }
   fprintf(fout,"#include \"vtkVersion.h\"\n");
   fprintf(fout,"#define VTK_TCL_TO_STRING(x) VTK_TCL_TO_STRING0(x)\n");
   fprintf(fout,"#define VTK_TCL_TO_STRING0(x) #x\n");
@@ -113,6 +119,23 @@
 
   fprintf(fout,"\n\nint VTK_EXPORT %s_Init(Tcl_Interp *interp)\n{\n",
     kitName);
+
+  /* for stubs enabled vtk libraries... */
+  fprintf(fout,"\n  #ifdef USE_TCL_STUBS\n"
+          "    if (Tcl_InitStubs(interp, \"8.1\", 0) == NULL) {\n"
+          "      return TCL_ERROR;\n"
+          "    }\n"
+          "  #endif\n");
+
+  if (!strcmp(kitName,"Vtkrenderingtcl"))
+    {
+    fprintf(fout,"\n  #ifdef USE_TK_STUBS\n"
+          "    if (Tk_InitStubs(interp, \"8.1\", 0) == NULL) {\n"
+          "      return TCL_ERROR;\n"
+          "    }\n"
+          "  #endif\n\n");
+    }
+
   if (!strcmp(kitName,"Vtkcommontcl"))
     {
     fprintf(fout,
--- VTK/Rendering/vtkXRenderWindowTclInteractor.cxx.orig	2005-08-25 22:27:06.000000000 +0900
+++ VTK/Rendering/vtkXRenderWindowTclInteractor.cxx	2007-01-17 00:53:45.000000000 +0900
@@ -43,8 +43,43 @@
 #if ((TK_MAJOR_VERSION <= 4)||((TK_MAJOR_VERSION == 8)&&(TK_MINOR_VERSION == 0)))
 extern TkMainInfo *tkMainWindowList;
 #else
+#if USE_TK_STUBS
+struct TkIntStubs
+{
+  int magic; struct TkIntStubHooks *hooks;
+  void *dummy0; void *dummy1; void *dummy2; void *dummy3; void *dummy4;
+  void *dummy5; void *dummy6; void *dummy7; void *dummy8; void *dummy9;
+  void *dummy10; void *dummy11; void *dummy12; void *dummy13; void *dummy14;
+  void *dummy15; void *dummy16; void *dummy17; void *dummy18; void *dummy19;
+  void *dummy20; void *dummy21; void *dummy22; void *dummy23; void *dummy24;
+  void *dummy25; void *dummy26; void *dummy27; void *dummy28; void *dummy29;
+  void *dummy30; void *dummy31; void *dummy32; void *dummy33; void *dummy34;
+  void *dummy35; void *dummy36; void *dummy37; void *dummy38; void *dummy39;
+  void *dummy40; void *dummy41; void *dummy42; void *dummy43; void *dummy44;
+  void *dummy45; void *dummy46; void *dummy47; void *dummy48; void *dummy49;
+  void *dummy50; void *dummy51; void *dummy52; void *dummy53; void *dummy54;
+  void *dummy55; void *dummy56; void *dummy57; void *dummy58; void *dummy59;
+  void *dummy60; void *dummy61; void *dummy62; void *dummy63; void *dummy64;
+  void *dummy65; void *dummy66; void *dummy67; void *dummy68; void *dummy69;
+  void *dummy70; void *dummy71; void *dummy72; void *dummy73; void *dummy74;
+  void *dummy75; void *dummy76; void *dummy77; void *dummy78; void *dummy79;
+  void *dummy80; void *dummy81; void *dummy82; void *dummy83; void *dummy84;
+  void *dummy85; void *dummy86; void *dummy87; void *dummy88; void *dummy89;
+  void *dummy90; void *dummy91; void *dummy92; void *dummy93; void *dummy94;
+  void *dummy95; void *dummy96; void *dummy97; void *dummy98; void *dummy99;
+  void *dummy100; void *dummy101; void *dummy102; void *dummy103;
+  void *dummy104; void *dummy105; void *dummy106;
+  TkMainInfo * (*tkGetMainInfoList) _ANSI_ARGS_((void));
+};
+extern "C" {
+extern TkIntStubs *tkIntStubsPtr;
+}
+#define TkGetMainInfoList \
+        (tkIntStubsPtr->tkGetMainInfoList)
+#else
 extern "C" {TkMainInfo *TkGetMainInfoList();}
 #endif
+#endif
 
 // returns 1 if done
 static int vtkTclEventProc(XtPointer clientData,XEvent *event)
--- VTK/Rendering/vtkTkRenderWidget.cxx.orig	2006-05-11 02:52:08.000000000 +0900
+++ VTK/Rendering/vtkTkRenderWidget.cxx	2007-01-16 23:03:03.000000000 +0900
@@ -22,6 +22,18 @@
 #include "vtkToolkits.h"
 
 #ifdef _WIN32
+  #ifdef USE_TK_STUBS
+  /*
+   * OK, since TkWinChildProc is not explicitly exported in the
+   * dynamic libraries (stubs table), we have to retrieve it from
+   * the class info registered with windows.
+   * kudos: http://togl.cvs.sourceforge.net/togl/Togl/togl.c?revision=1.57
+   */
+    static WNDCLASS childClass;           /* Window class for child windows. */
+    static LRESULT (CALLBACK *tkWinChildProc)(HWND hwnd, UINT message,
+                                WPARAM wParam, LPARAM lParam) = NULL;
+    #define TK_WIN_CHILD_CLASS_NAME "TkChild"
+  #endif
 #include "vtkWin32OpenGLRenderWindow.h"
 #else
 #ifdef VTK_USE_CARBON
@@ -797,8 +809,18 @@
   vtkSetWindowLong(hWnd,4,(LONG)((TkWindow *)self->TkWin)->window);
   if (((TkWindow *)self->TkWin)->parentPtr)
     {
+#ifndef USE_TK_STUBS
     vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc);
     rval = TkWinChildProc(hWnd,message,wParam,lParam);
+#else
+    if (tkWinChildProc == NULL)
+      {
+      GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass);
+      tkWinChildProc = childClass.lpfnWndProc;
+      }
+    vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)tkWinChildProc);
+    rval = tkWinChildProc(hWnd,message,wParam,lParam);
+#endif
     }
   else
     {
@@ -850,8 +872,18 @@
             Tcl_ServiceAll();
             return 0;
       }
+#ifndef USE_TK_STUBS
     vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc);
     rval = TkWinChildProc(hWnd,message,wParam,lParam);
+#else
+    if (tkWinChildProc == NULL)
+      {
+      GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass);
+      tkWinChildProc = childClass.lpfnWndProc;
+      }
+    vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)tkWinChildProc);
+    rval = tkWinChildProc(hWnd,message,wParam,lParam);
+#endif
 #endif
     }
 
--- VTK/Rendering/vtkTkImageViewerWidget.cxx.orig	2005-09-01 07:55:26.000000000 +0900
+++ VTK/Rendering/vtkTkImageViewerWidget.cxx	2007-01-16 23:03:03.000000000 +0900
@@ -18,6 +18,20 @@
 #include "vtkRenderWindowInteractor.h"
 #include "vtkTkInternals.h"
 
+#ifdef _WIN32
+  #ifdef USE_TK_STUBS
+  /*
+   * OK, since TkWinChildProc is not explicitly exported in the
+   * dynamic libraries (stubs table), we have to retrieve it from
+   * the class info registered with windows.
+   * kudos: http://togl.cvs.sourceforge.net/togl/Togl/togl.c?revision=1.57
+   */
+    static WNDCLASS childClass;           /* Window class for child windows. */
+    static LRESULT (CALLBACK *tkWinChildProc)(HWND hwnd, UINT message,
+                                WPARAM wParam, LPARAM lParam) = NULL;
+    #define TK_WIN_CHILD_CLASS_NAME "TkChild"
+  #endif
+#endif
 #ifdef _MSC_VER
  #pragma warning ( disable : 4273 )
 #else
@@ -402,8 +416,18 @@
           {
           SetWindowLong((HWND)self->ImageViewer->GetRenderWindow()->GetGenericWindowId(),
                         GWL_USERDATA,(LONG)((TkWindow *)self->TkWin)->window);
+#ifndef USE_TK_STUBS
           SetWindowLong((HWND)self->ImageViewer->GetRenderWindow()->GetGenericWindowId(),
                         GWL_WNDPROC,(LONG)TkWinChildProc);
+#else
+          if (tkWinChildProc == NULL)
+            {
+            GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass);
+            tkWinChildProc = childClass.lpfnWndProc;
+            }
+          SetWindowLong((HWND)self->ImageViewer->GetRenderWindow()->GetGenericWindowId(),
+                        GWL_WNDPROC,(LONG)tkWinChildProc);
+#endif
           }
 #endif
         Tcl_EventuallyFree( (ClientData) self, vtkTkImageViewerWidget_Destroy );
@@ -469,8 +493,18 @@
   vtkSetWindowLong(hWnd,GWL_USERDATA,(LONG)((TkWindow *)self->TkWin)->window);
   if (((TkWindow *)self->TkWin)->parentPtr)
     {
+#ifndef USE_TK_STUBS
     vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc);
     rval = TkWinChildProc(hWnd,message,wParam,lParam);
+#else
+    if (tkWinChildProc == NULL)
+      {
+      GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass);
+      tkWinChildProc = childClass.lpfnWndProc;
+      }
+    vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)tkWinChildProc);
+    rval = tkWinChildProc(hWnd,message,wParam,lParam);
+#endif
     }
   else
     {
@@ -526,8 +560,18 @@
             Tcl_ServiceAll();
             return 0;
       }
+#ifndef USE_TK_STUBS
     vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc);
     rval = TkWinChildProc(hWnd,message,wParam,lParam);
+#else
+    if (tkWinChildProc == NULL)
+      {
+      GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass);
+      tkWinChildProc = childClass.lpfnWndProc;
+      }
+    vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)tkWinChildProc);
+    rval = tkWinChildProc(hWnd,message,wParam,lParam);
+#endif
 #endif
     }
 
--- VTK/Wrapping/Tcl/CMakeLists.txt.orig	2005-12-15 23:39:27.000000000 +0900
+++ VTK/Wrapping/Tcl/CMakeLists.txt	2007-01-17 02:44:39.000000000 +0900
@@ -45,6 +45,10 @@
   ENDIF (NOT BORLAND)
 ENDIF (WIN32)
 
+IF(TCL_TK_STUBS)
+  SET(VTK_TCL_LIBRARIES ${VTK_TCL_LIBRARIES} ${TK_LIBRARY} ${TCL_LIBRARY})
+ENDIF(TCL_TK_STUBS)
+
 # Create the vtk Tcl wrapper executable.
 ADD_EXECUTABLE(vtk vtkTkAppInit.cxx ${VTK_EXE_RESOURCE_FILES})
 TARGET_LINK_LIBRARIES (vtk
@@ -53,6 +57,7 @@
   vtkGraphicsTCL
   vtkImagingTCL
   vtkIOTCL
+  ${VTK_TCL_LIBRARIES}
 )
 
 IF(VTK_USE_CARBON)
@@ -113,6 +118,7 @@
       vtkImagingTCL
       vtkIOTCL
       vtkParallelTCL
+      ${VTK_TCL_LIBRARIES}
     )
 
     IF (VTK_USE_RENDERING)
--- VTK/Common/vtkTclUtil.cxx.orig	2006-05-26 13:11:03.000000000 +0900
+++ VTK/Common/vtkTclUtil.cxx	2007-01-17 13:39:51.000000000 +0900
@@ -738,7 +738,9 @@
                                      const char* const argv[])
 {
   vtkstd::string av0 = vtksys::SystemTools::CollapseFullPath(argv[0]);
+#ifndef USE_TCL_STUBS
   Tcl_FindExecutable(av0.c_str());
+#endif
 }
 
 // We need two internal Tcl functions.  They usually are declared in
