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
