diff --git a/runtime/doc/if_sniff.txt b/runtime/doc/if_sniff.txt
index a3d5208..6feaa53 100644
--- a/runtime/doc/if_sniff.txt
+++ b/runtime/doc/if_sniff.txt
@@ -1,95 +1,11 @@
-*if_sniff.txt*	For Vim version 7.4.  Last change: 2005 Mar 29
+*if_sniff.txt*	For Vim version 7.4.  Last change: 2016 Feb 27
 
 
 		  VIM REFERENCE MANUAL
 		by Anton Leherbauer (toni@takefive.co.at)
 
 
-SNiFF+ and Vim				    *sniff*
-
-1. Introduction				    |sniff-intro|
-2. Commands				    |sniff-commands|
-3. Compiling Vim with SNiFF+ interface	    |sniff-compiling|
-
-{Vi does not have any of these commands}  *E275* *E274* *E276* *E278* *E279*
-
-The SNiFF+ interface only works, when Vim was compiled with the |+sniff|
-feature.
-
-==============================================================================
-1. Introduction					*sniff-intro*
-
-The following features for the use with SNiFF+ are available:
-
-   * Vim can be used for all editing requests
-   * SNiFF+ recognizes and updates all browsers when a file is saved in Vim
-   * SNiFF+ commands can be issued directly from Vim
-
-How to use Vim with SNiFF+
-   1. Make sure SNiFF+ is running.
-   2. In the Editor view of the Preferences dialog set the Field named
-      'External Editor' to 'Emacs/Vim'.
-   4. Start Vim
-   5. Connect to SNiFF+ (:sniff connect)
-
-Once a connection is established, SNiFF+ uses Vim for all requests to show or
-edit source code.  On the other hand, you can send queries to SNiFF+ with the
-:sniff command.
-
-==============================================================================
-2. Commands				    *sniff-commands*
-
-			    *:sniff* *:sni*
-:sni[ff] request [symbol]   Send request to sniff with optional symbol.
-			    {not in Vi}
-:sni[ff]		    Display all possible requests and the connection
-			    status
-
-Most requests require a symbol (identifier) as parameter.  If it is omitted,
-Vim will use the current word under the cursor.
-The available requests are listed below:
-
-request		      mapping	description
--------------------------------------------------------------------------------
-connect			sc	Establish connection with SNiFF+.
-				Make sure SNiFF+ is prepared for this in the
-				Preferences
-disconnect		sq	Disconnect from SNiFF+.  You can reconnect any
-				time with :sniff connect (or 'sc')
-toggle			st	Toggle between implementation
-				and definition file
-find-symbol		sf	Load the symbol into a Symbol Browser
-browse-class		sb	Loads the class into a Class Browser
-superclass		ss	Edit superclass of symbol
-overridden		so	Edit overridden method of symbol
-retrieve-file		srf	Retrieve symbol in current file
-retrieve-project	srp	Retrieve symbol in current project
-retrieve-all-projects	srP	Retrieve symbol in all projects
-retrieve-next		sR	Retrieve symbol using current Retriever
-				settings
-goto-symbol		sg	Goto definition or implementation of symbol
-hierarchy		sh	Load symbol into the Hierarchy Browser
-restr-hier		sH	same as above but show only related classes
-xref-to			sxt	Start a refers-to query on symbol and
-				load the results into the Cross Referencer
-xref-by			sxb	Start a referred-by query on symbol
-xref-has		sxh	Start a refers-to components query on symbol
-xref-used-by		sxu	Start a referred-by as component query on
-				symbol
-show-docu		sd	Show documentation of symbol
-gen-docu		sD	Generate documentation of symbol
-
-The mappings are defined in a file 'sniff.vim', which is part of every SNiFF+
-product ($SNIFF_DIR/config/sniff.vim).  This file is sourced whenever Vim
-connects to SNiFF+.
-
-==============================================================================
-3. Compiling Vim with SNiFF+ interface		*sniff-compiling*
-
-To compile Vim with SNiFF+ support, you need two source files of the extra
-archive: if_sniff.c and if_sniff.h.
-On Unix: Edit the Makefile and uncomment the line "--enable-sniff".  Or run
-configure manually with this argument.
-On NT: Specify SNIFF=yes with your make command.
+The SNiFF+ support was removed at patch 7.4.1433.  If you want to check it out
+sync to before that.
 
  vim:tw=78:ts=8:ft=help:norl:
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index 0843d25..4378e00 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -82,8 +82,6 @@
 #	  TCL_VER_LONG=[Tcl version, eg 8.3] (default is 8.3)
 #	    You must set TCL_VER_LONG when you set TCL_VER.
 #
-#	SNiFF+ interface: SNIFF=yes
-#
 #	Cscope support: CSCOPE=yes
 #
 #	Iconv library support (always dynamically loaded):
@@ -269,16 +267,6 @@
 CTAGS = ctags
 !endif
 
-!if "$(SNIFF)" == "yes"
-# SNIFF - Include support for SNiFF+.
-SNIFF_INCL  = if_sniff.h
-SNIFF_OBJ   = $(OBJDIR)/if_sniff.obj
-SNIFF_LIB   = shell32.lib
-SNIFF_DEFS  = -DFEAT_SNIFF
-# The SNiFF integration needs multithreaded libraries!
-MULTITHREADED = yes
-!endif
-
 !ifndef CSCOPE
 CSCOPE = yes
 !endif
@@ -380,7 +368,7 @@
 #VIMRUNTIMEDIR = somewhere
 
 CFLAGS = -c /W3 /nologo $(CVARS) -I. -Iproto -DHAVE_PATHDEF -DWIN32 \
-		$(SNIFF_DEFS) $(CSCOPE_DEFS) $(NETBEANS_DEFS) $(CHANNEL_DEFS) \
+		$(CSCOPE_DEFS) $(NETBEANS_DEFS) $(CHANNEL_DEFS) \
 		$(NBDEBUG_DEFS) $(XPM_DEFS) \
 		$(DEFINES) -DWINVER=$(WINVER) -D_WIN32_WINNT=$(WINVER) \
 		/Fo$(OUTDIR)/ 
@@ -528,7 +516,7 @@
 !endif # DEBUG
 
 INCL =	vim.h os_win32.h ascii.h feature.h globals.h keymap.h macros.h \
-	proto.h option.h structs.h term.h $(SNIFF_INCL) $(CSCOPE_INCL) \
+	proto.h option.h structs.h term.h $(CSCOPE_INCL) \
 	$(NBDEBUG_INCL)
 
 OBJ = \
@@ -997,7 +985,7 @@
 !ENDIF
 
 LINKARGS1 = $(linkdebug) $(conflags)
-LINKARGS2 = $(CON_LIB) $(GUI_LIB) $(NODEFAULTLIB) $(LIBC) $(OLE_LIB) user32.lib $(SNIFF_LIB) \
+LINKARGS2 = $(CON_LIB) $(GUI_LIB) $(NODEFAULTLIB) $(LIBC) $(OLE_LIB) user32.lib \
 		$(LUA_LIB) $(MZSCHEME_LIB) $(PERL_LIB) $(PYTHON_LIB) $(PYTHON3_LIB) $(RUBY_LIB) \
 		$(TCL_LIB) $(NETBEANS_LIB) $(XPM_LIB) $(LINK_PDB)
 
@@ -1020,12 +1008,12 @@
 
 $(VIM).exe: $(OUTDIR) $(OBJ) $(GUI_OBJ) $(OLE_OBJ) $(OLE_IDL) $(MZSCHEME_OBJ) \
 		$(LUA_OBJ) $(PERL_OBJ) $(PYTHON_OBJ) $(PYTHON3_OBJ) $(RUBY_OBJ) $(TCL_OBJ) \
-		$(SNIFF_OBJ) $(CSCOPE_OBJ) $(NETBEANS_OBJ) $(CHANNEL_OBJ) $(XPM_OBJ) \
+		$(CSCOPE_OBJ) $(NETBEANS_OBJ) $(CHANNEL_OBJ) $(XPM_OBJ) \
 		version.c version.h
 	$(CC) $(CFLAGS) version.c
 	$(link) $(LINKARGS1) -out:$(VIM).exe $(OBJ) $(GUI_OBJ) $(OLE_OBJ) \
 		$(LUA_OBJ) $(MZSCHEME_OBJ) $(PERL_OBJ) $(PYTHON_OBJ) $(PYTHON3_OBJ) $(RUBY_OBJ) \
-		$(TCL_OBJ) $(SNIFF_OBJ) $(CSCOPE_OBJ) $(NETBEANS_OBJ) $(CHANNEL_OBJ) \
+		$(TCL_OBJ) $(CSCOPE_OBJ) $(NETBEANS_OBJ) $(CHANNEL_OBJ) \
 		$(XPM_OBJ) $(OUTDIR)\version.obj $(LINKARGS2)
 	if exist $(VIM).exe.manifest mt.exe -nologo -manifest $(VIM).exe.manifest -updateresource:$(VIM).exe;1
 
@@ -1212,9 +1200,6 @@
 $(OUTDIR)/if_ruby.obj: $(OUTDIR) if_ruby.c  $(INCL)
 	$(CC) $(CFLAGS) $(RUBY_INC) if_ruby.c
 
-$(OUTDIR)/if_sniff.obj:	$(OUTDIR) if_sniff.c  $(INCL)
-	$(CC) $(CFLAGS) if_sniff.c
-
 $(OUTDIR)/if_tcl.obj: $(OUTDIR) if_tcl.c  $(INCL)
 	$(CC) $(CFLAGS) $(TCL_INC) if_tcl.c
 
diff --git a/src/Make_vms.mms b/src/Make_vms.mms
index da535b9..35167cb 100644
--- a/src/Make_vms.mms
+++ b/src/Make_vms.mms
@@ -2,7 +2,7 @@
 # Makefile for Vim on OpenVMS
 #
 # Maintainer:   Zoltan Arpadffy <arpadffy@polarhome.com>
-# Last change:  2016 Jan 22
+# Last change:  2016 Feb 27
 #
 # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64
 # with MMS and MMK
@@ -66,7 +66,6 @@
 # VIM_PERL   = YES
 # VIM_PYTHON = YES
 # VIM_RUBY   = YES
-# VIM_SNIFF  = YES
 
 # X Input Method.  For entering special languages like chinese and
 # Japanese. Please define just one: VIM_XIM or VIM_HANGULIN
@@ -228,15 +227,6 @@
 TCL_INC = ,dka0:[tcl80.generic]
 .ENDIF
 
-.IFDEF VIM_SNIFF
-# SNIFF related setup.
-SNIFF_DEF = ,"FEAT_SNIFF"
-SNIFF_SRC = if_sniff.c
-SNIFF_OBJ = if_sniff.obj
-SNIFF_LIB =
-SNIFF_INC =
-.ENDIF
-
 .IFDEF VIM_RUBY
 # RUBY related setup.
 RUBY_DEF = ,"FEAT_RUBY"
@@ -293,7 +283,7 @@
 .SUFFIXES : .obj .c
 
 ALL_CFLAGS = /def=($(MODEL_DEF)$(DEFS)$(DEBUG_DEF)$(PERL_DEF)$(PYTHON_DEF) -
- $(TCL_DEF)$(SNIFF_DEF)$(RUBY_DEF)$(XIM_DEF)$(HANGULIN_DEF)$(TAG_DEF)$(MZSCH_DEF)$(ICONV_DEF)) -
+ $(TCL_DEF)$(RUBY_DEF)$(XIM_DEF)$(HANGULIN_DEF)$(TAG_DEF)$(MZSCH_DEF)$(ICONV_DEF)) -
  $(CFLAGS)$(GUI_FLAG) -
  /include=($(C_INC)$(GUI_INC_DIR)$(GUI_INC)$(PERL_INC)$(PYTHON_INC)$(TCL_INC))
 
@@ -302,12 +292,12 @@
 # as $(GUI_INC) - replaced with $(GUI_INC_VER)
 # Otherwise should not be any other difference.
 ALL_CFLAGS_VER = /def=($(MODEL_DEF)$(DEFS)$(DEBUG_DEF)$(PERL_DEF)$(PYTHON_DEF) -
- $(TCL_DEF)$(SNIFF_DEF)$(RUBY_DEF)$(XIM_DEF)$(HANGULIN_DEF)$(TAG_DEF)$(MZSCH_DEF)$(ICONV_DEF)) -
+ $(TCL_DEF)$(RUBY_DEF)$(XIM_DEF)$(HANGULIN_DEF)$(TAG_DEF)$(MZSCH_DEF)$(ICONV_DEF)) -
  $(CFLAGS)$(GUI_FLAG) -
  /include=($(C_INC)$(GUI_INC_DIR)$(GUI_INC_VER)$(PERL_INC)$(PYTHON_INC)$(TCL_INC))
 
 ALL_LIBS = $(LIBS) $(GUI_LIB_DIR) $(GUI_LIB) \
-	   $(PERL_LIB) $(PYTHON_LIB) $(TCL_LIB) $(SNIFF_LIB) $(RUBY_LIB)
+	   $(PERL_LIB) $(PYTHON_LIB) $(TCL_LIB) $(RUBY_LIB)
 
 SRC =	blowfish.c buffer.c charset.c crypt.c, crypt_zip.c diff.c digraph.c edit.c eval.c ex_cmds.c ex_cmds2.c \
 	ex_docmd.c ex_eval.c ex_getln.c if_xcmdsrv.c fileio.c fold.c getchar.c \
@@ -315,7 +305,7 @@
 	misc2.c move.c normal.c ops.c option.c popupmnu.c quickfix.c regexp.c search.c sha256.c\
 	spell.c syntax.c tag.c term.c termlib.c ui.c undo.c version.c screen.c \
 	window.c os_unix.c os_vms.c pathdef.c \
-	$(GUI_SRC) $(PERL_SRC) $(PYTHON_SRC) $(TCL_SRC) $(SNIFF_SRC) \
+	$(GUI_SRC) $(PERL_SRC) $(PYTHON_SRC) $(TCL_SRC) \
 	$(RUBY_SRC) $(HANGULIN_SRC) $(MZSCH_SRC)
 
 OBJ =	blowfish.obj buffer.obj charset.obj crypt.obj, crypt_zip.obj diff.obj digraph.obj edit.obj eval.obj \
@@ -326,7 +316,7 @@
 	regexp.obj search.obj sha256.obj spell.obj syntax.obj tag.obj term.obj termlib.obj \
 	ui.obj undo.obj screen.obj version.obj window.obj os_unix.obj \
 	os_vms.obj pathdef.obj if_mzsch.obj\
-	$(GUI_OBJ) $(PERL_OBJ) $(PYTHON_OBJ) $(TCL_OBJ) $(SNIFF_OBJ) \
+	$(GUI_OBJ) $(PERL_OBJ) $(PYTHON_OBJ) $(TCL_OBJ) \
 	$(RUBY_OBJ) $(HANGULIN_OBJ) $(MZSCH_OBJ)
 
 # Default target is making the executable
@@ -778,10 +768,6 @@
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h gui_beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
  globals.h farsi.h arabic.h version.h
-if_sniff.obj : if_sniff.c vim.h [.auto]config.h feature.h os_unix.h \
- ascii.h keymap.h term.h macros.h structs.h regexp.h \
- gui.h gui_beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h os_unixx.h
 gui_beval.obj : gui_beval.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h gui_beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
diff --git a/src/Makefile b/src/Makefile
index 1326cf0..f460a61 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -466,9 +466,6 @@
 # Uncomment this when you do not want inter process communication.
 #CONF_OPT_CHANNEL = --disable-channel
 
-# SNIFF - Include support for SNiFF+.
-#CONF_OPT_SNIFF = --enable-sniff
-
 # MULTIBYTE - To edit multi-byte characters.
 # Uncomment this when you want to edit a multibyte language.
 # It's automatically enabled with normal features, GTK or IME support.
@@ -1391,7 +1388,7 @@
 
 LINT_CFLAGS = -DLINT -I. $(PRE_DEFS) $(POST_DEFS) $(RUBY_CFLAGS) $(LUA_CFLAGS) $(PERL_CFLAGS) $(PYTHON_CFLAGS) $(PYTHON3_CFLAGS) $(TCL_CFLAGS) -Dinline= -D__extension__= -Dalloca=alloca
 
-LINT_EXTRA = -DUSE_SNIFF -DHANGUL_INPUT -D"__attribute__(x)="
+LINT_EXTRA = -DHANGUL_INPUT -D"__attribute__(x)="
 
 DEPEND_CFLAGS = -DPROTO -DDEPEND -DFEAT_GUI $(LINT_CFLAGS)
 
@@ -1532,14 +1529,13 @@
 	$(PYTHON_SRC) $(PYTHON3_SRC) \
 	$(TCL_SRC) \
 	$(RUBY_SRC) \
-	$(SNIFF_SRC) \
 	$(WORKSHOP_SRC) \
 	$(WSDEBUG_SRC)
 
 TAGS_SRC = *.c *.cpp if_perl.xs
 
 EXTRA_SRC = hangulin.c if_lua.c if_mzsch.c auto/if_perl.c if_perlsfio.c \
-	    if_python.c if_python3.c if_tcl.c if_ruby.c if_sniff.c \
+	    if_python.c if_python3.c if_tcl.c if_ruby.c \
 	    gui_beval.c workshop.c wsdebug.c integration.c \
 	    netbeans.c channel.c \
 	    $(GRESOURCE_SRC)
@@ -1561,7 +1557,7 @@
 # The perl sources also don't work well with lint.
 LINT_SRC = $(BASIC_SRC) $(GUI_SRC) $(HANGULIN_SRC) \
 	   $(PYTHON_SRC) $(PYTHON3_SRC) $(TCL_SRC) \
-	   $(SNIFF_SRC) $(WORKSHOP_SRC) $(WSDEBUG_SRC) \
+	   $(WORKSHOP_SRC) $(WSDEBUG_SRC) \
 	   $(NETBEANS_SRC) $(CHANNEL_SRC)
 #LINT_SRC = $(SRC)
 #LINT_SRC = $(ALL_SRC)
@@ -1611,7 +1607,6 @@
 	objects/sha256.o \
 	objects/spell.o \
 	objects/syntax.o \
-	$(SNIFF_OBJ) \
 	objects/tag.o \
 	objects/term.o \
 	objects/ui.o \
@@ -1750,7 +1745,7 @@
 		$(CONF_OPT_TCL) $(CONF_OPT_RUBY) $(CONF_OPT_NLS) \
 		$(CONF_OPT_CSCOPE) $(CONF_OPT_MULTIBYTE) $(CONF_OPT_INPUT) \
 		$(CONF_OPT_OUTPUT) $(CONF_OPT_GPM) $(CONF_OPT_WORKSHOP) \
-		$(CONF_OPT_SNIFF) $(CONF_OPT_FEAT) $(CONF_TERM_LIB) \
+		$(CONF_OPT_FEAT) $(CONF_TERM_LIB) \
 		$(CONF_OPT_COMPBY) $(CONF_OPT_ACL) $(CONF_OPT_NETBEANS) \
 		$(CONF_OPT_CHANNEL) \
 		$(CONF_ARGS) $(CONF_OPT_MZSCHEME) $(CONF_OPT_PLTHOME) \
@@ -2815,9 +2810,6 @@
 objects/if_ruby.o: if_ruby.c
 	$(CCC) $(RUBY_CFLAGS) -o $@ if_ruby.c
 
-objects/if_sniff.o: if_sniff.c
-	$(CCC) -o $@ if_sniff.c
-
 objects/if_tcl.o: if_tcl.c
 	$(CCC) $(TCL_CFLAGS) -o $@ if_tcl.c
 
@@ -3364,10 +3356,6 @@
  ascii.h keymap.h term.h macros.h option.h structs.h regexp.h gui.h \
  gui_beval.h proto/gui_beval.pro alloc.h ex_cmds.h proto.h globals.h \
  farsi.h arabic.h version.h
-objects/if_sniff.o: if_sniff.c vim.h auto/config.h feature.h os_unix.h \
- auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \
- regexp.h gui.h gui_beval.h proto/gui_beval.pro alloc.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h os_unixx.h
 objects/gui_beval.o: gui_beval.c vim.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \
  regexp.h gui.h gui_beval.h proto/gui_beval.pro alloc.h ex_cmds.h proto.h \
diff --git a/src/auto/configure b/src/auto/configure
index a528ccb..861fe4d 100755
--- a/src/auto/configure
+++ b/src/auto/configure
@@ -653,8 +653,6 @@
 X_CFLAGS
 XMKMF
 xmkmfpath
-SNIFF_OBJ
-SNIFF_SRC
 CHANNEL_OBJ
 CHANNEL_SRC
 NETBEANS_OBJ
@@ -812,7 +810,6 @@
 enable_workshop
 enable_netbeans
 enable_channel
-enable_sniff
 enable_multibyte
 enable_hangulinput
 enable_xim
@@ -1477,7 +1474,6 @@
   --enable-workshop       Include Sun Visual Workshop support.
   --disable-netbeans      Disable NetBeans integration support.
   --disable-channel      Disable process communication support.
-  --enable-sniff          Include Sniff interface.
   --enable-multibyte      Include multibyte editing support.
   --enable-hangulinput    Include Hangul input support.
   --enable-xim            Include XIM input support.
@@ -7439,26 +7435,6 @@
 
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking --enable-sniff argument" >&5
-$as_echo_n "checking --enable-sniff argument... " >&6; }
-# Check whether --enable-sniff was given.
-if test "${enable_sniff+set}" = set; then :
-  enableval=$enable_sniff;
-else
-  enable_sniff="no"
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_sniff" >&5
-$as_echo "$enable_sniff" >&6; }
-if test "$enable_sniff" = "yes"; then
-  $as_echo "#define FEAT_SNIFF 1" >>confdefs.h
-
-  SNIFF_SRC="if_sniff.c"
-
-  SNIFF_OBJ="objects/if_sniff.o"
-
-fi
-
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking --enable-multibyte argument" >&5
 $as_echo_n "checking --enable-multibyte argument... " >&6; }
 # Check whether --enable-multibyte was given.
diff --git a/src/charset.c b/src/charset.c
index 2414b2a..ad3f8bc 100644
--- a/src/charset.c
+++ b/src/charset.c
@@ -1761,8 +1761,7 @@
     return p;
 }
 
-#if defined(FEAT_LISTCMDS) || defined(FEAT_SIGNS) || defined(FEAT_SNIFF) \
-	|| defined(PROTO)
+#if defined(FEAT_LISTCMDS) || defined(FEAT_SIGNS) || defined(PROTO)
 /*
  * skiptowhite_esc: Like skiptowhite(), but also skip escaped chars
  */
diff --git a/src/config.h.in b/src/config.h.in
index fd45c73..dc0e9b2 100644
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -362,9 +362,6 @@
 /* Define for linking via dlopen() or LoadLibrary() */
 #undef DYNAMIC_TCL
 
-/* Define if you want to include the Sniff interface. */
-#undef FEAT_SNIFF
-
 /* Define if you want to add support for ACL */
 #undef HAVE_POSIX_ACL
 #undef HAVE_SOLARIS_ZFS_ACL
diff --git a/src/config.mk.in b/src/config.mk.in
index b514f2b..7c0726c 100644
--- a/src/config.mk.in
+++ b/src/config.mk.in
@@ -99,9 +99,6 @@
 RUBY_CFLAGS	= @RUBY_CFLAGS@
 RUBY_LIBS	= @RUBY_LIBS@
 
-SNIFF_SRC	= @SNIFF_SRC@
-SNIFF_OBJ	= @SNIFF_OBJ@
-
 AWK		= @AWK@
 
 STRIP		= @STRIP@
diff --git a/src/configure.in b/src/configure.in
index acbccde..fbfa37f 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -2021,19 +2021,6 @@
   AC_SUBST(CHANNEL_OBJ)
 fi
 
-AC_MSG_CHECKING(--enable-sniff argument)
-AC_ARG_ENABLE(sniff,
-	[  --enable-sniff          Include Sniff interface.], ,
-	[enable_sniff="no"])
-AC_MSG_RESULT($enable_sniff)
-if test "$enable_sniff" = "yes"; then
-  AC_DEFINE(FEAT_SNIFF)
-  SNIFF_SRC="if_sniff.c"
-  AC_SUBST(SNIFF_SRC)
-  SNIFF_OBJ="objects/if_sniff.o"
-  AC_SUBST(SNIFF_OBJ)
-fi
-
 AC_MSG_CHECKING(--enable-multibyte argument)
 AC_ARG_ENABLE(multibyte,
 	[  --enable-multibyte      Include multibyte editing support.], ,
diff --git a/src/edit.c b/src/edit.c
index 60b6523..626d327 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -1052,12 +1052,6 @@
 	case K_SELECT:	/* end of Select mode mapping - ignore */
 	    break;
 
-#ifdef FEAT_SNIFF
-	case K_SNIFF:	/* Sniff command received */
-	    stuffcharReadbuff(K_SNIFF);
-	    goto doESCkey;
-#endif
-
 	case K_HELP:	/* Help key works like <ESC> <Help> */
 	case K_F1:
 	case K_XF1:
diff --git a/src/eval.c b/src/eval.c
index a648637..f69e814 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -13930,9 +13930,6 @@
 #ifdef FEAT_SMARTINDENT
 	"smartindent",
 #endif
-#ifdef FEAT_SNIFF
-	"sniff",
-#endif
 #ifdef STARTUPTIME
 	"startuptime",
 #endif
diff --git a/src/ex_cmds.h b/src/ex_cmds.h
index 23c26fa..d17f4d5 100644
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -1281,9 +1281,6 @@
 EX(CMD_snext,		"snext",	ex_next,
 			RANGE|NOTADR|BANG|FILES|EDITCMD|ARGOPT|TRLBAR,
 			ADDR_LINES),
-EX(CMD_sniff,		"sniff",	ex_sniff,
-			EXTRA|TRLBAR,
-			ADDR_LINES),
 EX(CMD_snomagic,	"snomagic",	ex_submagic,
 			RANGE|WHOLEFOLD|EXTRA|CMDWIN,
 			ADDR_LINES),
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 3f8c508..88257cc 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -131,9 +131,6 @@
     redir_off = TRUE;		/* don't redirect debug commands */
 
     State = NORMAL;
-#ifdef FEAT_SNIFF
-    want_sniff_request = 0;    /* No K_SNIFF wanted */
-#endif
 
     if (!debug_did_msg)
 	MSG(_("Entering Debug mode.  Type \"cont\" to continue."));
@@ -151,9 +148,7 @@
     {
 	msg_scroll = TRUE;
 	need_wait_return = FALSE;
-#ifdef FEAT_SNIFF
-	ProcessSniffRequests();
-#endif
+
 	/* Save the current typeahead buffer and replace it with an empty one.
 	 * This makes sure we get input from the user here and don't interfere
 	 * with the commands being executed.  Reset "ex_normal_busy" to avoid
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 1f493ad..9900c1b 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -296,9 +296,6 @@
 # define ex_rubydo		ex_ni
 # define ex_rubyfile		ex_ni
 #endif
-#ifndef FEAT_SNIFF
-# define ex_sniff		ex_ni
-#endif
 #ifndef FEAT_KEYMAP
 # define ex_loadkeymap		ex_ni
 #endif
@@ -641,9 +638,6 @@
     /* Ignore scrollbar and mouse events in Ex mode */
     ++hold_gui_events;
 #endif
-#ifdef FEAT_SNIFF
-    want_sniff_request = 0;    /* No K_SNIFF wanted */
-#endif
 
     MSG(_("Entering Ex mode.  Type \"visual\" to go to Normal mode."));
     while (exmode_active)
@@ -661,9 +655,6 @@
 	changedtick = curbuf->b_changedtick;
 	prev_msg_row = msg_row;
 	prev_line = curwin->w_cursor.lnum;
-#ifdef FEAT_SNIFF
-	ProcessSniffRequests();
-#endif
 	if (improved)
 	{
 	    cmdline_row = msg_row;
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 6741e11..8db37d9 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -206,9 +206,6 @@
     struct cmdline_info save_ccline;
 #endif
 
-#ifdef FEAT_SNIFF
-    want_sniff_request = 0;
-#endif
 #ifdef FEAT_EVAL
     if (firstc == -1)
     {
diff --git a/src/feature.h b/src/feature.h
index 4150f07..f753227 100644
--- a/src/feature.h
+++ b/src/feature.h
@@ -1221,7 +1221,6 @@
  * +perl		Perl interface: "--enable-perlinterp"
  * +python		Python interface: "--enable-pythoninterp"
  * +tcl			TCL interface: "--enable-tclinterp"
- * +sniff		Sniff interface: "--enable-sniff"
  * +sun_workshop	Sun Workshop integration
  * +netbeans_intg	Netbeans integration
  * +channel		Inter process communication
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c
index 440b401..69e4e18 100644
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -6460,22 +6460,6 @@
     return FALSE;		/* don't happen again */
 }
 
-#ifdef FEAT_SNIFF
-/*
- * Callback function, used when data is available on the SNiFF connection.
- */
-    static void
-sniff_request_cb(
-    gpointer	data UNUSED,
-    gint	source_fd UNUSED,
-    GdkInputCondition condition UNUSED)
-{
-    static char_u bytes[3] = {CSI, (int)KS_EXTRA, (int)KE_SNIFF};
-
-    add_to_input_buf(bytes, 3);
-}
-#endif
-
 /*
  * GUI input routine called by gui_wait_for_chars().  Waits for a character
  * from the keyboard.
@@ -6491,26 +6475,6 @@
     int focus;
     guint timer;
     static int timed_out;
-#ifdef FEAT_SNIFF
-    static int	sniff_on = 0;
-    static gint	sniff_input_id = 0;
-#endif
-
-#ifdef FEAT_SNIFF
-    if (sniff_on && !want_sniff_request)
-    {
-	if (sniff_input_id)
-	    gdk_input_remove(sniff_input_id);
-	sniff_on = 0;
-    }
-    else if (!sniff_on && want_sniff_request)
-    {
-	/* Add fd_from_sniff to watch for available data in main loop. */
-	sniff_input_id = gdk_input_add(fd_from_sniff,
-			       GDK_INPUT_READ, sniff_request_cb, NULL);
-	sniff_on = 1;
-    }
-#endif
 
     timed_out = FALSE;
 
diff --git a/src/gui_w32.c b/src/gui_w32.c
index aff0ba2..6cc2e06 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -326,7 +326,7 @@
 #endif
 
 static HINSTANCE	s_hinst = NULL;
-#if !defined(FEAT_SNIFF) && !defined(FEAT_GUI)
+#if !defined(FEAT_GUI)
 static
 #endif
 HWND			s_hwnd = NULL;
@@ -1927,23 +1927,6 @@
     }
 #endif
 
-#ifdef FEAT_SNIFF
-    if (sniff_request_waiting && want_sniff_request)
-    {
-	static char_u bytes[3] = {CSI, (char_u)KS_EXTRA, (char_u)KE_SNIFF};
-	add_to_input_buf(bytes, 3); /* K_SNIFF */
-	sniff_request_waiting = 0;
-	want_sniff_request = 0;
-	/* request is handled in normal.c */
-    }
-    if (msg.message == WM_USER)
-    {
-	MyTranslateMessage(&msg);
-	pDispatchMessage(&msg);
-	return;
-    }
-#endif
-
 #ifdef MSWIN_FIND_REPLACE
     /* Don't process messages used by the dialog */
     if (s_findrep_hwnd != NULL && pIsDialogMessage(s_findrep_hwnd, &msg))
diff --git a/src/gui_x11.c b/src/gui_x11.c
index 5a0fe8d..b525cf7 100644
--- a/src/gui_x11.c
+++ b/src/gui_x11.c
@@ -145,9 +145,6 @@
 static void gui_x11_enter_cb(Widget w, XtPointer data, XEvent *event, Boolean *dum);
 static void gui_x11_leave_cb(Widget w, XtPointer data, XEvent *event, Boolean *dum);
 static void gui_x11_mouse_cb(Widget w, XtPointer data, XEvent *event, Boolean *dum);
-#ifdef FEAT_SNIFF
-static void gui_x11_sniff_request_cb(XtPointer closure, int *source, XtInputId *id);
-#endif
 static void gui_x11_check_copy_area(void);
 #ifdef FEAT_CLIENTSERVER
 static void gui_x11_send_event_handler(Widget, XtPointer, XEvent *, Boolean *);
@@ -1163,20 +1160,6 @@
     gui_send_mouse_event(button, x, y, repeated_click, vim_modifiers);
 }
 
-#ifdef FEAT_SNIFF
-/* ARGSUSED */
-    static void
-gui_x11_sniff_request_cb(
-    XtPointer	closure UNUSED,
-    int		*source UNUSED,
-    XtInputId	*id UNUSED)
-{
-    static char_u bytes[3] = {CSI, (int)KS_EXTRA, (int)KE_SNIFF};
-
-    add_to_input_buf(bytes, 3);
-}
-#endif
-
 /*
  * End of call-back routines
  */
@@ -2818,28 +2801,9 @@
     static int	    timed_out;
     XtIntervalId    timer = (XtIntervalId)0;
     XtInputMask	    desired;
-#ifdef FEAT_SNIFF
-    static int	    sniff_on = 0;
-    static XtInputId sniff_input_id = 0;
-#endif
 
     timed_out = FALSE;
 
-#ifdef FEAT_SNIFF
-    if (sniff_on && !want_sniff_request)
-    {
-	if (sniff_input_id)
-	    XtRemoveInput(sniff_input_id);
-	sniff_on = 0;
-    }
-    else if (!sniff_on && want_sniff_request)
-    {
-	sniff_input_id = XtAppAddInput(app_context, fd_from_sniff,
-		     (XtPointer)XtInputReadMask, gui_x11_sniff_request_cb, 0);
-	sniff_on = 1;
-    }
-#endif
-
     if (wtime > 0)
 	timer = XtAppAddTimeOut(app_context, (long_u)wtime, gui_x11_timer_cb,
 								  &timed_out);
diff --git a/src/if_sniff.c b/src/if_sniff.c
deleted file mode 100644
index 85c4755..0000000
--- a/src/if_sniff.c
+++ /dev/null
@@ -1,1201 +0,0 @@
-/* vi:set ts=8 sts=4 sw=4:
- *
- * if_sniff.c Interface between Vim and SNiFF+
- *
- * See README.txt for an overview of the Vim source code.
- */
-
-#include "vim.h"
-
-#ifdef WIN32
-# include <stdio.h>
-# include <process.h>
-# include <string.h>
-# include <assert.h>
-#else
-# ifdef FEAT_GUI_X11
-#  include "gui_x11.pro"
-# endif
-# include "os_unixx.h"
-#endif
-
-static int sniffemacs_pid;
-
-int fd_from_sniff;
-int sniff_connected = 0;
-int sniff_request_waiting = 0;
-int want_sniff_request = 0;
-
-#define MAX_REQUEST_LEN 512
-
-#define NEED_SYMBOL	2
-#define EMPTY_SYMBOL	4
-#define NEED_FILE	8
-#define SILENT		16
-#define DISCONNECT	32
-#define CONNECT		64
-
-#define RQ_NONE		0
-#define RQ_SIMPLE	1
-#define RQ_CONTEXT	NEED_FILE + NEED_SYMBOL
-#define RQ_SCONTEXT	NEED_FILE + NEED_SYMBOL + EMPTY_SYMBOL
-#define RQ_NOSYMBOL	NEED_FILE
-#define RQ_SILENT	RQ_NOSYMBOL + SILENT
-#define RQ_CONNECT	RQ_NONE + CONNECT
-#define RQ_DISCONNECT	RQ_SIMPLE + DISCONNECT
-
-struct sn_cmd
-{
-    char *cmd_name;
-    char cmd_code;
-    char *cmd_msg;
-    int  cmd_type;
-};
-
-struct sn_cmd_list
-{
-    struct sn_cmd* sniff_cmd;
-    struct sn_cmd_list* next_cmd;
-};
-
-static struct sn_cmd sniff_cmds[] =
-{
-    { "toggle",		'e', N_("Toggle implementation/definition"),RQ_SCONTEXT },
-    { "superclass",	's', N_("Show base class of"),		RQ_CONTEXT },
-    { "overridden",	'm', N_("Show overridden member function"),RQ_SCONTEXT },
-    { "retrieve-file",	'r', N_("Retrieve from file"),		RQ_CONTEXT },
-    { "retrieve-project",'p', N_("Retrieve from project"),	RQ_CONTEXT },
-    { "retrieve-all-projects",
-			'P', N_("Retrieve from all projects"),	RQ_CONTEXT },
-    { "retrieve-next",	'R', N_("Retrieve"),	RQ_CONTEXT },
-    { "goto-symbol",	'g', N_("Show source of"),		RQ_CONTEXT },
-    { "find-symbol",	'f', N_("Find symbol"),			RQ_CONTEXT },
-    { "browse-class",	'w', N_("Browse class"),		RQ_CONTEXT },
-    { "hierarchy",	't', N_("Show class in hierarchy"),	RQ_CONTEXT },
-    { "restr-hier",	'T', N_("Show class in restricted hierarchy"),RQ_CONTEXT },
-    { "xref-to",	'x', N_("Xref refers to"),		RQ_CONTEXT },
-    { "xref-by",	'X', N_("Xref referred by"),		RQ_CONTEXT },
-    { "xref-has",	'c', N_("Xref has a"),			RQ_CONTEXT },
-    { "xref-used-by",	'C', N_("Xref used by"),		RQ_CONTEXT },
-    { "show-docu",	'd', N_("Show docu of"),		RQ_CONTEXT },
-    { "gen-docu",	'D', N_("Generate docu for"),		RQ_CONTEXT },
-    { "connect",	'y', NULL,				RQ_CONNECT },
-    { "disconnect",	'q', NULL,				RQ_DISCONNECT },
-    { "font-info",	'z', NULL,				RQ_SILENT },
-    { "update",		'u', NULL,				RQ_SILENT },
-    { NULL,		'\0', NULL, 0}
-};
-
-
-static char *SniffEmacs[2] = {"sniffemacs", (char *)NULL};  /* Yes, Emacs! */
-static int fd_to_sniff;
-static int sniff_will_disconnect = 0;
-static char msg_sniff_disconnect[] = N_("Cannot connect to SNiFF+. Check environment (sniffemacs must be found in $PATH).\n");
-static char sniff_rq_sep[] = " ";
-static struct sn_cmd_list *sniff_cmd_ext = NULL;
-
-/* Initializing vim commands
- * executed each time vim connects to Sniff
- */
-static char *init_cmds[]= {
-    "augroup sniff",
-    "autocmd BufWritePost * sniff update",
-    "autocmd BufReadPost * sniff font-info",
-    "autocmd VimLeave * sniff disconnect",
-    "augroup END",
-
-    "let g:sniff_connected = 1",
-
-    "if ! exists('g:sniff_mappings_sourced')|"
-	"if ! exists('g:sniff_mappings')|"
-	    "if exists('$SNIFF_DIR4')|"
-		"let g:sniff_mappings='$SNIFF_DIR4/config/integrations/vim/sniff.vim'|"
-	    "else|"
-		"let g:sniff_mappings='$SNIFF_DIR/config/sniff.vim'|"
-	    "endif|"
-	"endif|"
-	"let g:sniff_mappings=expand(g:sniff_mappings)|"
-	"if filereadable(g:sniff_mappings)|"
-	    "execute 'source' g:sniff_mappings|"
-	    "let g:sniff_mappings_sourced=1|"
-	"endif|"
-    "endif",
-
-    NULL
-};
-
-/*-------- Function Prototypes ----------------------------------*/
-
-static int ConnectToSniffEmacs(void);
-static void sniff_connect(void);
-static void HandleSniffRequest(char* buffer);
-static int get_request(int fd, char *buf, int maxlen);
-static void WriteToSniff(char *str);
-static void SendRequest(struct sn_cmd *command, char* symbol);
-static void vi_msg(char *);
-static void vi_error_msg(char *);
-static char *vi_symbol_under_cursor(void);
-static void vi_open_file(char *);
-static char *vi_buffer_name(void);
-static buf_T *vi_find_buffer(char *);
-static void vi_exec_cmd(char *);
-static void vi_set_cursor_pos(long char_nr);
-static long vi_cursor_pos(void);
-
-/* debug trace */
-#if 0
-static FILE* _tracefile = NULL;
-#define SNIFF_TRACE_OPEN(file) if (!_tracefile) _tracefile = fopen(file, "w")
-#define SNIFF_TRACE(msg) fprintf(_tracefile, msg); fflush(_tracefile);
-#define SNIFF_TRACE1(msg, arg) fprintf(_tracefile, msg,arg); fflush(_tracefile);
-#define SNIFF_TRACE_CLOSE fclose(_tracefile); _tracefile=NULL;
-#else
-#define SNIFF_TRACE_OPEN(file)
-#define SNIFF_TRACE(msg)
-#define SNIFF_TRACE1(msg, arg)
-#define SNIFF_TRACE_CLOSE
-#endif
-
-/*-------- Windows Only Declarations -----------------------------*/
-#ifdef WIN32
-
-static int  sniff_request_processed=1;
-static HANDLE sniffemacs_handle=NULL;
-static HANDLE readthread_handle=NULL;
-static HANDLE handle_to_sniff=NULL;
-static HANDLE handle_from_sniff=NULL;
-
-struct sniffBufNode
-{
-    struct sniffBufNode *next;
-    int    bufLen;
-    char   buf[MAX_REQUEST_LEN];
-};
-static struct sniffBufNode *sniffBufStart=NULL;
-static struct sniffBufNode *sniffBufEnd=NULL;
-static HANDLE hBufferMutex=NULL;
-
-# ifdef FEAT_GUI_W32
-    extern HWND s_hwnd;       /* gvim's Window handle */
-# endif
-/*
- * some helper functions for Windows port only
- */
-
-    static HANDLE
-ExecuteDetachedProgram(char *szBinary, char *szCmdLine,
-    HANDLE hStdInput, HANDLE hStdOutput)
-{
-    BOOL bResult;
-    DWORD nError;
-    PROCESS_INFORMATION aProcessInformation;
-    PROCESS_INFORMATION *pProcessInformation= &aProcessInformation;
-    STARTUPINFO aStartupInfo;
-    STARTUPINFO *pStartupInfo= &aStartupInfo;
-    DWORD dwCreationFlags= 0;
-    char szPath[512];
-    HINSTANCE hResult;
-
-    hResult = FindExecutable(szBinary, ".", szPath);
-    if ((int)hResult <= 32)
-    {
-	/* can't find the exe file */
-	return NULL;
-    }
-
-    ZeroMemory(pStartupInfo, sizeof(*pStartupInfo));
-    pStartupInfo->dwFlags= STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
-    pStartupInfo->hStdInput = hStdInput;
-    pStartupInfo->hStdOutput = hStdOutput;
-    pStartupInfo->wShowWindow= SW_HIDE;
-    pStartupInfo->cb = sizeof(STARTUPINFO);
-
-    bResult= CreateProcess(
-	szPath,
-	szCmdLine,
-	NULL,    /* security attr for process */
-	NULL,    /* security attr for primary thread */
-	TRUE,    /* DO inherit stdin and stdout */
-	dwCreationFlags, /* creation flags */
-	NULL,    /* environment */
-	".",    /* current directory */
-	pStartupInfo,   /* startup info: NULL crashes  */
-	pProcessInformation /* process information: NULL crashes */
-    );
-    nError= GetLastError();
-    if (bResult)
-    {
-	CloseHandle(pProcessInformation->hThread);
-	CloseHandle(hStdInput);
-	CloseHandle(hStdOutput);
-	return(pProcessInformation->hProcess);
-    }
-    else
-	return(NULL);
-}
-
-/*
- * write to the internal Thread / Thread communications buffer.
- * Return TRUE if successful, FALSE else.
- */
-    static BOOL
-writeToBuffer(char *msg, int len)
-{
-    DWORD dwWaitResult;     /* Request ownership of mutex. */
-    struct sniffBufNode *bn;
-    int bnSize;
-
-    SNIFF_TRACE1("writeToBuffer %d\n", len);
-    bnSize = sizeof(struct sniffBufNode) - MAX_REQUEST_LEN + len + 1;
-    if (bnSize < 128) bnSize = 128; /* minimum length to avoid fragmentation */
-    bn = (struct sniffBufNode *)malloc(bnSize);
-    if (!bn)
-	return FALSE;
-
-    memcpy(bn->buf, msg, len);
-    bn->buf[len]='\0';    /* terminate CString for added safety */
-    bn->next = NULL;
-    bn->bufLen = len;
-    /* now, acquire a Mutex for adding the string to our linked list */
-    dwWaitResult = WaitForSingleObject(
-	hBufferMutex,   /* handle of mutex */
-	1000L);   /* one-second time-out interval */
-    if (dwWaitResult == WAIT_OBJECT_0)
-    {
-	/* The thread got mutex ownership. */
-	if (sniffBufEnd)
-	{
-	    sniffBufEnd->next = bn;
-	    sniffBufEnd = bn;
-	}
-	else
-	    sniffBufStart = sniffBufEnd = bn;
-	/* Release ownership of the mutex object. */
-	if (! ReleaseMutex(hBufferMutex))
-	{
-	    /* Deal with error. */
-	}
-	return TRUE;
-    }
-
-    /* Cannot get mutex ownership due to time-out or mutex object abandoned. */
-    free(bn);
-    return FALSE;
-}
-
-/*
- * read from the internal Thread / Thread communications buffer.
- * Return TRUE if successful, FALSE else.
- */
-    static int
-ReadFromBuffer(char *buf, int maxlen)
-{
-    DWORD dwWaitResult;     /* Request ownership of mutex. */
-    int   theLen;
-    struct sniffBufNode *bn;
-
-    dwWaitResult = WaitForSingleObject(
-	hBufferMutex,   /* handle of mutex */
-	1000L);		/* one-second time-out interval */
-    if (dwWaitResult == WAIT_OBJECT_0)
-    {
-	if (!sniffBufStart)
-	{
-	    /* all pending Requests Processed */
-	    theLen = 0;
-	}
-	else
-	{
-	    bn = sniffBufStart;
-	    theLen = bn->bufLen;
-	    SNIFF_TRACE1("ReadFromBuffer %d\n", theLen);
-	    if (theLen >= maxlen)
-	    {
-		/* notify the user of buffer overflow? */
-		theLen = maxlen-1;
-	    }
-	    memcpy(buf, bn->buf, theLen);
-	    buf[theLen] = '\0';
-	    if (! (sniffBufStart = bn->next))
-	    {
-		sniffBufEnd = NULL;
-		sniff_request_processed = 1;
-	    }
-	    free(bn);
-	}
-	if (! ReleaseMutex(hBufferMutex))
-	{
-	    /* Deal with error. */
-	}
-	return theLen;
-    }
-
-    /* Cannot get mutex ownership due to time-out or mutex object abandoned. */
-    return -1;
-}
-
-/* on Win32, a separate Thread reads the input pipe. get_request is not needed here. */
-    static void __cdecl
-SniffEmacsReadThread(void *dummy)
-{
-    static char	ReadThreadBuffer[MAX_REQUEST_LEN];
-    int		ReadThreadLen=0;
-    int		result=0;
-    int		msgLen=0;
-    char	*msgStart, *msgCur;
-
-    SNIFF_TRACE("begin thread\n");
-    /* Read from the pipe to SniffEmacs */
-    while (sniff_connected)
-    {
-	if (!ReadFile(handle_from_sniff,
-		ReadThreadBuffer + ReadThreadLen,    /* acknowledge rest in buffer */
-		MAX_REQUEST_LEN - ReadThreadLen,
-		&result,
-		NULL))
-	{
-	    DWORD err = GetLastError();
-	    result = -1;
-	}
-
-	if (result < 0)
-	{
-	    /* probably sniffemacs died... log the Error? */
-	    sniff_disconnect(1);
-	}
-	else if (result > 0)
-	{
-	    ReadThreadLen += result-1;   /* total length of valid chars */
-	    for(msgCur=msgStart=ReadThreadBuffer; ReadThreadLen > 0; msgCur++, ReadThreadLen--)
-	    {
-		if (*msgCur == '\0' || *msgCur == '\r' || *msgCur == '\n')
-		{
-		    msgLen = msgCur-msgStart; /* don't add the CR/LF chars */
-		    if (msgLen > 0)
-			writeToBuffer(msgStart, msgLen);
-		    msgStart = msgCur + 1; /* over-read single CR/LF chars */
-		}
-	    }
-
-	/* move incomplete message to beginning of buffer */
-	ReadThreadLen = msgCur - msgStart;
-	if (ReadThreadLen > 0)
-	    mch_memmove(ReadThreadBuffer, msgStart, ReadThreadLen);
-
-	if (sniff_request_processed)
-	{
-	    /* notify others that new data has arrived */
-	    sniff_request_processed = 0;
-	    sniff_request_waiting = 1;
-#ifdef FEAT_GUI_W32
-	    PostMessage(s_hwnd, WM_USER, (WPARAM)0, (LPARAM)0);
-#endif
-	    }
-	}
-    }
-    SNIFF_TRACE("end thread\n");
-}
-#endif /* WIN32 */
-/*-------- End of Windows Only Declarations ------------------------*/
-
-
-/* ProcessSniffRequests
- * Function that should be called from outside
- * to process the waiting sniff requests
- */
-    void
-ProcessSniffRequests(void)
-{
-    static char buf[MAX_REQUEST_LEN];
-    int len;
-
-    while (sniff_connected)
-    {
-#ifdef WIN32
-	len = ReadFromBuffer(buf, sizeof(buf));
-#else
-	len = get_request(fd_from_sniff, buf, sizeof(buf));
-#endif
-	if (len < 0)
-	{
-	    vi_error_msg(_("E274: Sniff: Error during read. Disconnected"));
-	    sniff_disconnect(1);
-	    break;
-	}
-	else if (len > 0)
-	    HandleSniffRequest( buf );
-	else
-	    break;
-    }
-
-    if (sniff_will_disconnect)	/* Now the last msg has been processed */
-	sniff_disconnect(1);
-}
-
-    static struct sn_cmd *
-find_sniff_cmd(char *cmd)
-{
-    struct sn_cmd *sniff_cmd = NULL;
-    int i;
-    for(i=0; sniff_cmds[i].cmd_name; i++)
-    {
-	if (!strcmp(cmd, sniff_cmds[i].cmd_name))
-	{
-	    sniff_cmd = &sniff_cmds[i];
-	    break;
-	}
-    }
-    if (!sniff_cmd)
-    {
-	struct sn_cmd_list *list = sniff_cmd_ext;
-	while (list)
-	{
-	    if (!strcmp(cmd, list->sniff_cmd->cmd_name))
-	    {
-		sniff_cmd = list->sniff_cmd;
-		break;
-	    }
-	    list = list->next_cmd;
-	}
-    }
-    return sniff_cmd;
-}
-
-    static int
-add_sniff_cmd(char *cmd, char *def, char *msg)
-{
-    int rc = 0;
-    if (def != NULL && def[0] != NUL && find_sniff_cmd(cmd) == NULL)
-    {
-	struct sn_cmd_list *list = sniff_cmd_ext;
-	struct sn_cmd *sniff_cmd = (struct sn_cmd*)malloc(sizeof(struct sn_cmd));
-	struct sn_cmd_list *cmd_node = (struct sn_cmd_list*)malloc(sizeof(struct sn_cmd_list));
-	int rq_type = 0;
-
-	/* unescape message text */
-	char *p = msg;
-	char *end = p+strlen(msg);
-	while (*p)
-	{
-	    if (*p == '\\')
-		mch_memmove(p,p+1,end-p);
-	    p++;
-	}
-	SNIFF_TRACE1("request name = %s\n",cmd);
-	SNIFF_TRACE1("request def = %s\n",def);
-	SNIFF_TRACE1("request msg = %s\n",msg);
-
-	while (list && list->next_cmd)
-	    list = list->next_cmd;
-	if (!list)
-	    sniff_cmd_ext = cmd_node;
-	else
-	    list->next_cmd = cmd_node;
-
-	sniff_cmd->cmd_name = cmd;
-	sniff_cmd->cmd_code = def[0];
-	sniff_cmd->cmd_msg = msg;
-	switch(def[1])
-	{
-	    case 'f':
-		rq_type = RQ_NOSYMBOL;
-		break;
-	    case 's':
-		rq_type = RQ_CONTEXT;
-		break;
-	    case 'S':
-		rq_type = RQ_SCONTEXT;
-		break;
-	    default:
-		rq_type = RQ_SIMPLE;
-		break;
-	}
-	sniff_cmd->cmd_type = rq_type;
-	cmd_node->sniff_cmd = sniff_cmd;
-	cmd_node->next_cmd = NULL;
-	rc = 1;
-    }
-    return rc;
-}
-
-/* ex_sniff
- * Handle ":sniff" command
- */
-    void
-ex_sniff(exarg_T *eap)
-{
-    char_u	*arg = eap->arg;
-    char_u *symbol = NULL;
-    char_u *cmd = NULL;
-
-    SNIFF_TRACE_OPEN("if_sniff.log");
-    if (ends_excmd(*arg))	/* no request: print available commands */
-    {
-	int i;
-	msg_start();
-	msg_outtrans_attr((char_u *)"-- SNiFF+ commands --", hl_attr(HLF_T));
-	for(i=0; sniff_cmds[i].cmd_name; i++)
-	{
-	    msg_putchar('\n');
-	    msg_outtrans((char_u *)":sniff ");
-	    msg_outtrans((char_u *)sniff_cmds[i].cmd_name);
-	}
-	msg_putchar('\n');
-	msg_outtrans((char_u *)_("SNiFF+ is currently "));
-	if (!sniff_connected)
-	    msg_outtrans((char_u *)_("not "));
-	msg_outtrans((char_u *)_("connected"));
-	msg_end();
-    }
-    else	/* extract command name and symbol if present */
-    {
-	symbol = skiptowhite(arg);
-	cmd  = vim_strnsave(arg, (int)(symbol-arg));
-	symbol = skipwhite(symbol);
-	if (ends_excmd(*symbol))
-	    symbol = NULL;
-	if (!strcmp((char *)cmd, "addcmd"))
-	{
-	    char_u *def = skiptowhite(symbol);
-	    char_u *name = vim_strnsave(symbol, (int)(def-symbol));
-	    char_u *msg;
-	    def = skipwhite(def);
-	    msg = skiptowhite(def);
-	    def = vim_strnsave(def, (int)(msg-def));
-	    msg = skipwhite(msg);
-	    if (ends_excmd(*msg))
-		msg = vim_strsave(name);
-	    else
-		msg = vim_strnsave(msg, (int)(skiptowhite_esc(msg)-msg));
-	    if (!add_sniff_cmd((char*)name, (char*)def, (char*)msg))
-	    {
-		vim_free(msg);
-		vim_free(def);
-		vim_free(name);
-	    }
-	}
-	else
-	{
-	    struct sn_cmd* sniff_cmd = find_sniff_cmd((char*)cmd);
-	    if (sniff_cmd)
-		SendRequest(sniff_cmd, (char *)symbol);
-	    else
-		EMSG2(_("E275: Unknown SNiFF+ request: %s"), cmd);
-	}
-	vim_free(cmd);
-    }
-}
-
-
-    static void
-sniff_connect(void)
-{
-    if (sniff_connected)
-	return;
-    if (ConnectToSniffEmacs())
-	vi_error_msg(_("E276: Error connecting to SNiFF+"));
-    else
-    {
-	int i;
-
-	for (i = 0; init_cmds[i]; i++)
-	    vi_exec_cmd(init_cmds[i]);
-    }
-}
-
-    void
-sniff_disconnect(int immediately)
-{
-    if (!sniff_connected)
-	return;
-    if (immediately)
-    {
-	vi_exec_cmd("augroup sniff");
-	vi_exec_cmd("au!");
-	vi_exec_cmd("augroup END");
-	vi_exec_cmd("unlet g:sniff_connected");
-	sniff_connected = 0;
-	want_sniff_request = 0;
-	sniff_will_disconnect = 0;
-#ifdef FEAT_GUI
-	if (gui.in_use)
-	    gui_mch_wait_for_chars(0L);
-#endif
-#ifdef WIN32
-	while (sniffBufStart != NULL)
-	{
-	    struct sniffBufNode *node = sniffBufStart;
-	    sniffBufStart = sniffBufStart->next;
-	    free(node);
-	}
-	sniffBufStart = sniffBufEnd = NULL;
-	sniff_request_processed = 1;
-	CloseHandle(handle_to_sniff);
-	CloseHandle(handle_from_sniff);
-	WaitForSingleObject(sniffemacs_handle, 1000L);
-	CloseHandle(sniffemacs_handle);
-	sniffemacs_handle = NULL;
-	WaitForSingleObject(readthread_handle, 1000L);
-	readthread_handle = NULL;
-	CloseHandle(hBufferMutex);
-	hBufferMutex = NULL;
-	SNIFF_TRACE_CLOSE;
-#else
-	close(fd_to_sniff);
-	close(fd_from_sniff);
-	wait(NULL);
-#endif
-    }
-    else
-    {
-#ifdef WIN32
-# if (defined(_MSC_VER) && _MSC_VER >= 1400)
-        Sleep(2);
-# else
-	_sleep(2);
-# endif
-	if (!sniff_request_processed)
-	    ProcessSniffRequests();
-#else
-	sleep(2);		    /* Incoming msg could disturb edit */
-#endif
-	sniff_will_disconnect = 1;  /* We expect disconnect msg in 2 secs */
-    }
-}
-
-
-/* ConnectToSniffEmacs
- * Connect to Sniff: returns 1 on error
- */
-    static int
-ConnectToSniffEmacs(void)
-{
-#ifdef WIN32		/* Windows Version of the Code */
-    HANDLE ToSniffEmacs[2], FromSniffEmacs[2];
-    SECURITY_ATTRIBUTES sa;
-
-    sa.nLength = sizeof(sa);
-    sa.lpSecurityDescriptor = NULL;
-    sa.bInheritHandle = TRUE;
-
-    if (! CreatePipe(&ToSniffEmacs[0], &ToSniffEmacs[1], &sa, 0))
-	return 1;
-    if (! CreatePipe(&FromSniffEmacs[0], &FromSniffEmacs[1], &sa, 0))
-	return 1;
-
-    sniffemacs_handle = ExecuteDetachedProgram(SniffEmacs[0], SniffEmacs[0],
-	ToSniffEmacs[0], FromSniffEmacs[1]);
-
-    if (sniffemacs_handle)
-    {
-	handle_to_sniff  = ToSniffEmacs[1];
-	handle_from_sniff = FromSniffEmacs[0];
-	sniff_connected = 1;
-	hBufferMutex = CreateMutex(
-	    NULL,			/* no security attributes */
-	    FALSE,			/* initially not owned */
-	    "SniffReadBufferMutex");    /* name of mutex */
-	if (hBufferMutex == NULL)
-	{
-	    /* Check for error. */
-	}
-	readthread_handle = (HANDLE)_beginthread(SniffEmacsReadThread, 0, NULL);
-	return 0;
-    }
-    else
-    {
-	/* error in spawn() */
-	return 1;
-    }
-
-#else		/* UNIX Version of the Code */
-    int ToSniffEmacs[2], FromSniffEmacs[2];
-
-    if (pipe(ToSniffEmacs) != 0)
-	return 1;
-    if (pipe(FromSniffEmacs) != 0)
-	return 1;
-
-    /* fork */
-    if ((sniffemacs_pid=fork()) == 0)
-    {
-	/* child */
-
-	/* prepare communication pipes */
-	close(ToSniffEmacs[1]);
-	close(FromSniffEmacs[0]);
-
-	dup2(ToSniffEmacs[0],fileno(stdin));   /* write to ToSniffEmacs[1] */
-	dup2(FromSniffEmacs[1],fileno(stdout));/* read from FromSniffEmacs[0] */
-
-	close(ToSniffEmacs[0]);
-	close(FromSniffEmacs[1]);
-
-	/* start sniffemacs */
-	execvp (SniffEmacs[0], SniffEmacs);
-	{
-/*	    FILE *out = fdopen(FromSniffEmacs[1], "w"); */
-	    sleep(1);
-	    fputs(_(msg_sniff_disconnect), stdout);
-	    fflush(stdout);
-	    sleep(3);
-#ifdef FEAT_GUI
-	    if (gui.in_use)
-		gui_exit(1);
-#endif
-	    exit(1);
-	}
-	return 1;
-    }
-    else if (sniffemacs_pid > 0)
-    {
-	/* parent process */
-	close(ToSniffEmacs[0]);
-	fd_to_sniff  = ToSniffEmacs[1];
-	close(FromSniffEmacs[1]);
-	fd_from_sniff = FromSniffEmacs[0];
-	sniff_connected = 1;
-	return 0;
-    }
-    else   /* error in fork() */
-	return 1;
-#endif		/* UNIX Version of the Code */
-}
-
-
-/* HandleSniffRequest
- * Handle one request from SNiFF+
- */
-    static void
-HandleSniffRequest(char *buffer)
-{
-    char VICommand[MAX_REQUEST_LEN];
-    char command;
-    char *arguments;
-    char *token;
-    char *argv[3];
-    int argc = 0;
-    buf_T  *buf;
-
-    const char *SetTab     = "set tabstop=%d";
-    const char *SelectBuf  = "buf %s";
-    const char *DeleteBuf  = "bd %s";
-    const char *UnloadBuf  = "bun %s";
-    const char *GotoLine   = "%d";
-
-    command   = buffer[0];
-    arguments = &buffer[1];
-    token = strtok(arguments, sniff_rq_sep);
-    while (argc <3)
-    {
-	if (token)
-	{
-	    argv[argc] = (char*)vim_strsave((char_u *)token);
-	    token = strtok(0, sniff_rq_sep);
-	}
-	else
-	    argv[argc] = strdup("");
-	argc++;
-    }
-
-    switch (command)
-    {
-	case 'o' :  /* visit file at char pos */
-	case 'O' :  /* visit file at line number */
-	{
-	    char *file = argv[0];
-	    int position = atoi(argv[1]);
-
-	    buf = vi_find_buffer(file);
-	    setpcmark();      /* insert current pos in jump list [mark.c]*/
-	    if (!buf)
-		vi_open_file(file);
-	    else if (buf!=curbuf)
-	    {
-		vim_snprintf(VICommand, sizeof(VICommand),
-						     (char *)SelectBuf, file);
-		vi_exec_cmd(VICommand);
-	    }
-	    if (command == 'o')
-		vi_set_cursor_pos((long)position);
-	    else
-	    {
-		vim_snprintf(VICommand, sizeof(VICommand),
-					     (char *)GotoLine, (int)position);
-		vi_exec_cmd(VICommand);
-	    }
-	    checkpcmark();	/* [mark.c] */
-#if defined(FEAT_GUI_X11) || defined(FEAT_GUI_W32)
-	    if (gui.in_use && !gui.in_focus)  /* Raise Vim Window */
-	    {
-# ifdef FEAT_GUI_W32
-		SetForegroundWindow(s_hwnd);
-# else
-		extern Widget vimShell;
-
-		XSetInputFocus(gui.dpy, XtWindow(vimShell), RevertToNone,
-			CurrentTime);
-		XRaiseWindow(gui.dpy, XtWindow(vimShell));
-# endif
-	    }
-#endif
-	    break;
-	}
-	case 'p' :  /* path of file has changed */
-	    /* when changing from shared to private WS (checkout) */
-	{
-	    char *file = argv[0];
-	    char *new_path = argv[1];
-
-	    buf = vi_find_buffer(file);
-	    if (buf && !buf->b_changed) /* delete buffer only if not modified */
-	    {
-		vim_snprintf(VICommand, sizeof(VICommand),
-						     (char *)DeleteBuf, file);
-		vi_exec_cmd(VICommand);
-	    }
-	    vi_open_file(new_path);
-	    break;
-	}
-	case 'w' :  /* writability has changed */
-	    /* Sniff sends request twice,
-	     * but only the last one is the right one */
-	{
-	    char *file = argv[0];
-	    int writable = atoi(argv[1]);
-
-	    buf = vi_find_buffer(file);
-	    if (buf)
-	    {
-		buf->b_p_ro = !writable;
-		if (buf != curbuf)
-		{
-		    buf->b_flags |= BF_CHECK_RO + BF_NEVERLOADED;
-		    if (writable && !buf->b_changed)
-		    {
-			vim_snprintf(VICommand, sizeof(VICommand),
-						     (char *)UnloadBuf, file);
-			vi_exec_cmd(VICommand);
-		    }
-		}
-		else if (writable && !buf->b_changed)
-		{
-		    vi_exec_cmd("e");
-		}
-	    }
-	    break;
-	}
-	case 'h' :  /* highlight info */
-	    break;  /* not implemented */
-
-	case 't' :  /* Set tab width */
-	{
-	    int tab_width = atoi(argv[1]);
-
-	    if (tab_width > 0 && tab_width <= 16)
-	    {
-		vim_snprintf(VICommand, sizeof(VICommand),
-						   (char *)SetTab, tab_width);
-		vi_exec_cmd(VICommand);
-	    }
-	    break;
-	}
-	case '|':
-	{
-	    /* change the request separator */
-	    sniff_rq_sep[0] = arguments[0];
-	    /* echo the request */
-	    WriteToSniff(buffer);
-	    break;
-	}
-	case 'A' :  /* Warning/Info msg */
-	    vi_msg(arguments);
-	    if (!strncmp(arguments, "Disconnected", 12))
-		sniff_disconnect(1);	/* unexpected disconnection */
-	    break;
-	case 'a' :  /* Error msg */
-	    vi_error_msg(arguments);
-	    if (!strncmp(arguments, "Cannot connect", 14))
-		sniff_disconnect(1);
-	    break;
-
-	default :
-	    break;
-    }
-    while (argc)
-	vim_free(argv[--argc]);
-}
-
-
-#ifndef WIN32
-/* get_request
- * read string from fd up to next newline (excluding the nl),
- * returns  length of string
- *	    0 if no data available or no complete line
- *	   <0 on error
- */
-    static int
-get_request(int fd, char *buf, int maxlen)
-{
-    static char	inbuf[1024];
-    static int	pos = 0, bytes = 0;
-    int		len;
-#ifdef HAVE_SELECT
-    struct timeval tval;
-    fd_set	rfds;
-
-    FD_ZERO(&rfds);
-    FD_SET(fd, &rfds);
-    tval.tv_sec  = 0;
-    tval.tv_usec = 0;
-#else
-    struct pollfd fds;
-
-    fds.fd = fd;
-    fds.events = POLLIN;
-#endif
-
-    for (len = 0; len < maxlen; len++)
-    {
-	if (pos >= bytes)	    /* end of buffer reached? */
-	{
-#ifdef HAVE_SELECT
-	    if (select(fd + 1, &rfds, NULL, NULL, &tval) > 0)
-#else
-	    if (poll(&fds, 1, 0) > 0)
-#endif
-	    {
-		pos = 0;
-		bytes = read(fd, inbuf, sizeof(inbuf));
-		if (bytes <= 0)
-		    return bytes;
-	    }
-	    else
-	    {
-		pos = pos-len;
-		buf[0] = '\0';
-		return 0;
-	    }
-	}
-	if ((buf[len] = inbuf[pos++]) =='\n')
-	    break;
-    }
-    buf[len] = '\0';
-    return len;
-}
-#endif     /* WIN32 */
-
-
-    static void
-SendRequest(struct sn_cmd *command, char *symbol)
-{
-    int		cmd_type = command->cmd_type;
-    static char cmdstr[MAX_REQUEST_LEN];
-    static char msgtxt[MAX_REQUEST_LEN];
-    char	*buffer_name = NULL;
-
-    if (cmd_type == RQ_CONNECT)
-    {
-	sniff_connect();
-	return;
-    }
-    if (!sniff_connected && !(cmd_type & SILENT))
-    {
-	vi_error_msg(_("E278: SNiFF+ not connected"));
-	return;
-    }
-
-    if (cmd_type & NEED_FILE)
-    {
-	if (!curbuf->b_sniff)
-	{
-	    if (!(cmd_type & SILENT))
-		vi_error_msg(_("E279: Not a SNiFF+ buffer"));
-	    return;
-	}
-	buffer_name = vi_buffer_name();
-	if (buffer_name == NULL)
-	    return;
-	if (cmd_type & NEED_SYMBOL)
-	{
-	    if (cmd_type & EMPTY_SYMBOL)
-		symbol = " ";
-	    else if (!symbol && !(symbol = vi_symbol_under_cursor()))
-		return;	    /* error msg already displayed */
-	}
-
-	if (symbol)
-	    vim_snprintf(cmdstr, sizeof(cmdstr), "%c%s%s%ld%s%s\n",
-		command->cmd_code,
-		buffer_name,
-		sniff_rq_sep,
-		vi_cursor_pos(),
-		sniff_rq_sep,
-		symbol
-	    );
-	else
-	    vim_snprintf(cmdstr, sizeof(cmdstr), "%c%s\n",
-		    command->cmd_code, buffer_name);
-    }
-    else    /* simple request */
-    {
-	cmdstr[0] = command->cmd_code;
-	cmdstr[1] = '\n';
-	cmdstr[2] = '\0';
-    }
-    if (command->cmd_msg && !(cmd_type & SILENT))
-    {
-	if ((cmd_type & NEED_SYMBOL) && !(cmd_type & EMPTY_SYMBOL))
-	{
-	    vim_snprintf(msgtxt, sizeof(msgtxt), "%s: %s",
-						 _(command->cmd_msg), symbol);
-	    vi_msg(msgtxt);
-	}
-	else
-	    vi_msg(_(command->cmd_msg));
-    }
-    WriteToSniff(cmdstr);
-    if (cmd_type & DISCONNECT)
-	sniff_disconnect(0);
-}
-
-
-
-    static void
-WriteToSniff(char *str)
-{
-    int bytes;
-#ifdef WIN32
-    if (! WriteFile(handle_to_sniff, str, strlen(str), &bytes, NULL))
-    {
-	DWORD err=GetLastError();
-	bytes = -1;
-    }
-#else
-    bytes = write(fd_to_sniff, str, strlen(str));
-#endif
-    if (bytes<0)
-    {
-	vi_msg(_("Sniff: Error during write. Disconnected"));
-	sniff_disconnect(1);
-    }
-}
-
-/*-------- vim helping functions --------------------------------*/
-
-    static void
-vi_msg(char *str)
-{
-    if (str != NULL && *str != NUL)
-	MSG((char_u *)str);
-}
-
-    static void
-vi_error_msg(char *str)
-{
-    if (str != NULL && *str != NUL)
-	EMSG((char_u *)str);
-}
-
-    static void
-vi_open_file(char *fname)
-{
-    ++no_wait_return;
-    do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF,
-	    curwin);
-    curbuf->b_sniff = TRUE;
-    --no_wait_return;					/* [ex_docmd.c] */
-}
-
-    static buf_T *
-vi_find_buffer(char *fname)
-{			    /* derived from buflist_findname() [buffer.c] */
-    buf_T	*buf;
-
-    for (buf = firstbuf; buf != NULL; buf = buf->b_next)
-	if (buf->b_sfname != NULL && fnamecmp(fname, buf->b_sfname) == 0)
-	    return (buf);
-    return NULL;
-}
-
-
-    static char *
-vi_symbol_under_cursor(void)
-{
-    int		len;
-    char	*symbolp;
-    char	*p;
-    static char sniff_symbol[256];
-
-    len = find_ident_under_cursor((char_u **)&symbolp, FIND_IDENT);
-    /* [normal.c] */
-    if (len <= 0)
-	return NULL;
-    for (p=sniff_symbol; len; len--)
-	*p++ = *symbolp++;
-    *p = '\0';
-    return sniff_symbol;
-}
-
-
-    static char *
-vi_buffer_name(void)
-{
-    return (char *)curbuf->b_sfname;
-}
-
-    static void
-vi_exec_cmd(char *vicmd)
-{
-    do_cmdline_cmd((char_u *)vicmd);  /* [ex_docmd.c] */
-}
-
-/*
- * Set cursor on character position
- * derived from cursor_pos_info() [buffer.c]
- */
-    static void
-vi_set_cursor_pos(long char_pos)
-{
-    linenr_T	lnum;
-    long	char_count = 1;  /* first position = 1 */
-    int		line_size;
-    int		eol_size;
-
-    if (char_pos == 0)
-    {
-	char_pos = 1;
-    }
-    if (get_fileformat(curbuf) == EOL_DOS)
-	eol_size = 2;
-    else
-	eol_size = 1;
-    for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum)
-    {
-	line_size = STRLEN(ml_get(lnum)) + eol_size;
-	if (char_count+line_size > char_pos) break;
-	char_count += line_size;
-    }
-    curwin->w_cursor.lnum = lnum;
-    curwin->w_cursor.col  = char_pos - char_count;
-}
-
-    static long
-vi_cursor_pos(void)
-{
-    linenr_T	lnum;
-    long	char_count=1;  /* sniff starts with pos 1 */
-    int		line_size;
-    int		eol_size;
-
-    if (curbuf->b_p_tx)
-	eol_size = 2;
-    else
-	eol_size = 1;
-    for (lnum = 1; lnum < curwin->w_cursor.lnum; ++lnum)
-    {
-	line_size = STRLEN(ml_get(lnum)) + eol_size;
-	char_count += line_size;
-    }
-    return char_count + curwin->w_cursor.col;
-}
diff --git a/src/if_sniff.h b/src/if_sniff.h
deleted file mode 100644
index 50186b8..0000000
--- a/src/if_sniff.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * if_sniff.h Interface between Vim and SNiFF+
- */
-
-#ifndef __if_sniff_h__
-#define __if_sniff_h__
-
-extern int  want_sniff_request;
-extern int  sniff_request_waiting;
-extern int  sniff_connected;
-extern int  fd_from_sniff;
-extern void sniff_disconnect(int immediately);
-extern void ProcessSniffRequests(void);
-extern void ex_sniff(exarg_T *eap);
-
-#endif
diff --git a/src/keymap.h b/src/keymap.h
index 986006d..066aa29 100644
--- a/src/keymap.h
+++ b/src/keymap.h
@@ -211,8 +211,6 @@
     , KE_TAB		/* unshifted TAB key */
     , KE_S_TAB_OLD	/* shifted TAB key (no longer used) */
 
-    , KE_SNIFF		/* SNiFF+ input waiting */
-
     , KE_XF1		/* extra vt100 function keys for xterm */
     , KE_XF2
     , KE_XF3
@@ -449,8 +447,6 @@
 #define K_IGNORE	TERMCAP2KEY(KS_EXTRA, KE_IGNORE)
 #define K_NOP		TERMCAP2KEY(KS_EXTRA, KE_NOP)
 
-#define K_SNIFF		TERMCAP2KEY(KS_EXTRA, KE_SNIFF)
-
 #define K_MOUSEDOWN	TERMCAP2KEY(KS_EXTRA, KE_MOUSEDOWN)
 #define K_MOUSEUP	TERMCAP2KEY(KS_EXTRA, KE_MOUSEUP)
 #define K_MOUSELEFT	TERMCAP2KEY(KS_EXTRA, KE_MOUSELEFT)
diff --git a/src/normal.c b/src/normal.c
index d4b4b70..b57191a 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -163,9 +163,6 @@
 static void	nv_join(cmdarg_T *cap);
 static void	nv_put(cmdarg_T *cap);
 static void	nv_open(cmdarg_T *cap);
-#ifdef FEAT_SNIFF
-static void	nv_sniff(cmdarg_T *cap);
-#endif
 #ifdef FEAT_NETBEANS_INTG
 static void	nv_nbcmd(cmdarg_T *cap);
 #endif
@@ -420,9 +417,6 @@
     {K_F8,	farsi_fkey,	0,			0},
     {K_F9,	farsi_fkey,	0,			0},
 #endif
-#ifdef FEAT_SNIFF
-    {K_SNIFF,	nv_sniff,	0,			0},
-#endif
 #ifdef FEAT_NETBEANS_INTG
     {K_F21,	nv_nbcmd,	NV_NCH_ALW,		0},
 #endif
@@ -570,10 +564,6 @@
      * remembered in "opcount". */
     ca.opcount = opcount;
 
-#ifdef FEAT_SNIFF
-    want_sniff_request = sniff_connected;
-#endif
-
     /*
      * If there is an operator pending, then the command we take this time
      * will terminate it. Finish_op tells us to finish the operation before
@@ -9388,14 +9378,6 @@
 	n_opencmd(cap);
 }
 
-#ifdef FEAT_SNIFF
-    static void
-nv_sniff(cmdarg_T *cap UNUSED)
-{
-    ProcessSniffRequests();
-}
-#endif
-
 #ifdef FEAT_NETBEANS_INTG
     static void
 nv_nbcmd(cmdarg_T *cap)
diff --git a/src/os_unix.c b/src/os_unix.c
index 3c0b48c..360259a 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -5340,7 +5340,6 @@
  * "msec" == 0 will check for characters once.
  * "msec" == -1 will block until a character is available.
  * When a GUI is being used, this will not be used for input -- webb
- * Returns also, when a request from Sniff is waiting -- toni.
  * Or when a Linux GPM mouse event is waiting.
  * Or when a clientserver message is on the queue.
  */
@@ -5427,15 +5426,6 @@
 	fds[0].events = POLLIN;
 	nfd = 1;
 
-# ifdef FEAT_SNIFF
-#  define SNIFF_IDX 1
-	if (want_sniff_request)
-	{
-	    fds[SNIFF_IDX].fd = fd_from_sniff;
-	    fds[SNIFF_IDX].events = POLLIN;
-	    nfd++;
-	}
-# endif
 # ifdef FEAT_XCLIPBOARD
 	may_restore_clipboard();
 	if (xterm_Shell != (Widget)0)
@@ -5478,17 +5468,6 @@
 	    finished = FALSE;
 # endif
 
-# ifdef FEAT_SNIFF
-	if (ret < 0)
-	    sniff_disconnect(1);
-	else if (want_sniff_request)
-	{
-	    if (fds[SNIFF_IDX].revents & POLLHUP)
-		sniff_disconnect(1);
-	    if (fds[SNIFF_IDX].revents & POLLIN)
-		sniff_request_waiting = 1;
-	}
-# endif
 # ifdef FEAT_XCLIPBOARD
 	if (xterm_Shell != (Widget)0 && (fds[xterm_idx].revents & POLLIN))
 	{
@@ -5574,15 +5553,6 @@
 # endif
 	maxfd = fd;
 
-# ifdef FEAT_SNIFF
-	if (want_sniff_request)
-	{
-	    FD_SET(fd_from_sniff, &rfds);
-	    FD_SET(fd_from_sniff, &efds);
-	    if (maxfd < fd_from_sniff)
-		maxfd = fd_from_sniff;
-	}
-# endif
 # ifdef FEAT_XCLIPBOARD
 	may_restore_clipboard();
 	if (xterm_Shell != (Widget)0)
@@ -5652,17 +5622,6 @@
 	    finished = FALSE;
 # endif
 
-# ifdef FEAT_SNIFF
-	if (ret < 0 )
-	    sniff_disconnect(1);
-	else if (ret > 0 && want_sniff_request)
-	{
-	    if (FD_ISSET(fd_from_sniff, &efds))
-		sniff_disconnect(1);
-	    if (FD_ISSET(fd_from_sniff, &rfds))
-		sniff_request_waiting = 1;
-	}
-# endif
 # ifdef FEAT_XCLIPBOARD
 	if (ret > 0 && xterm_Shell != (Widget)0
 		&& FD_ISSET(ConnectionNumber(xterm_dpy), &rfds))
diff --git a/src/os_win32.c b/src/os_win32.c
index b7b3930..28c0263 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -1683,27 +1683,6 @@
     if (typeaheadlen > 0)
 	goto theend;
 
-#ifdef FEAT_SNIFF
-    if (want_sniff_request)
-    {
-	if (sniff_request_waiting)
-	{
-	    /* return K_SNIFF */
-	    typeahead[typeaheadlen++] = CSI;
-	    typeahead[typeaheadlen++] = (char_u)KS_EXTRA;
-	    typeahead[typeaheadlen++] = (char_u)KE_SNIFF;
-	    sniff_request_waiting = 0;
-	    want_sniff_request = 0;
-	    goto theend;
-	}
-	else if (time < 0 || time > 250)
-	{
-	    /* don't wait too long, a request might be pending */
-	    time = 250;
-	}
-    }
-#endif
-
     if (time >= 0)
     {
 	if (!WaitForChar(time))     /* no character available */
diff --git a/src/structs.h b/src/structs.h
index f375330..2989dcd 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -1639,10 +1639,6 @@
     char	 b_fab_rat;	/* Record attribute */
     unsigned int b_fab_mrs;	/* Max record size  */
 #endif
-#ifdef FEAT_SNIFF
-    int		b_sniff;	/* file was loaded through Sniff */
-#endif
-
     int		b_fnum;		/* buffer number for this file. */
 
     int		b_changed;	/* 'modified': Set to TRUE if something in the
diff --git a/src/term.c b/src/term.c
index a97fe54..d6ba537 100644
--- a/src/term.c
+++ b/src/term.c
@@ -1796,16 +1796,6 @@
 # endif
 #endif	/* FEAT_MOUSE */
 
-#ifdef FEAT_SNIFF
-    {
-	char_u	name[2];
-
-	name[0] = (int)KS_EXTRA;
-	name[1] = (int)KE_SNIFF;
-	add_termcode(name, (char_u *)"\233sniff", FALSE);
-    }
-#endif
-
 #ifdef USE_TERM_CONSOLE
     /* DEFAULT_TERM indicates that it is the machine console. */
     if (STRCMP(term, DEFAULT_TERM) != 0)
diff --git a/src/ui.c b/src/ui.c
index 891da1b..be5d8c5 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -1627,7 +1627,7 @@
 #if defined(FEAT_GUI) \
 	|| defined(FEAT_MOUSE_GPM) || defined(FEAT_SYSMOUSE) \
 	|| defined(FEAT_XCLIPBOARD) || defined(VMS) \
-	|| defined(FEAT_SNIFF) || defined(FEAT_CLIENTSERVER) \
+	|| defined(FEAT_CLIENTSERVER) \
 	|| defined(PROTO)
 /*
  * Add the given bytes to the input buffer
@@ -1772,17 +1772,7 @@
     inbufcount = 0;
 # else
 
-#  ifdef FEAT_SNIFF
-    if (sniff_request_waiting)
-    {
-	add_to_input_buf((char_u *)"\233sniff",6); /* results in K_SNIFF */
-	sniff_request_waiting = 0;
-	want_sniff_request = 0;
-	return;
-    }
-#  endif
-
-# ifdef FEAT_MBYTE
+#  ifdef FEAT_MBYTE
     if (rest != NULL)
     {
 	/* Use remainder of previous call, starts with an invalid character
@@ -1806,7 +1796,7 @@
     }
     else
 	unconverted = 0;
-#endif
+#  endif
 
     len = 0;	/* to avoid gcc warning */
     for (try = 0; try < 100; ++try)
diff --git a/src/version.c b/src/version.c
index 5ae9179..480fd8a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -554,11 +554,6 @@
 #else
 	"-smartindent",
 #endif
-#ifdef FEAT_SNIFF
-	"+sniff",
-#else
-	"-sniff",
-#endif
 #ifdef STARTUPTIME
 	"+startuptime",
 #else
@@ -749,6 +744,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1433,
+/**/
     1432,
 /**/
     1431,
diff --git a/src/vim.h b/src/vim.h
index fc693b3..bf50dca 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -1972,10 +1972,6 @@
 
 #include "globals.h"	    /* global variables and messages */
 
-#ifdef FEAT_SNIFF
-# include "if_sniff.h"
-#endif
-
 #ifndef FEAT_VIRTUALEDIT
 # define getvvcol(w, p, s, c, e) getvcol(w, p, s, c, e)
 # define virtual_active() FALSE
