diff --git a/configure b/configure
index a0f26a63a2552249a3f184248835a1e04569406f..62c1b2ec8b9c9dd3bc428c1e5f8b40fb6d7864b1 100755
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
 #! /bin/sh
-# From configure.ac Revision: 98605 .
+# From configure.ac Revision: 98952 .
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.61 for asterisk 1.4.
 #
@@ -957,7 +957,7 @@ GC_CFLAGS
 GC_LDFLAGS
 AST_DECLARATION_AFTER_STATEMENT
 GSM_INTERNAL
-CONFIG_NETSNMP
+NETSNMP_CONFIG
 PG_CONFIG
 PTLIB_CONFIG
 PWLIBDIR
@@ -34792,29 +34792,30 @@ _ACEOF
 fi
 
 
-# XXX do we need to check for snmp_register_callback ?
-
-    if test "x${PBX_NETSNMP}" != "x1" -a "${USE_NETSNMP}" != "no"; then
-	PBX_NETSNMP=0
-	if test -n "$ac_tool_prefix"; then
+NETSNMP_CONFIG=No
+if test "${USE_NETSNMP}" != "no"; then
+   if test "x${NETSNMP_DIR}" != "x"; then
+      if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}net-snmp-config", so it can be a program name with args.
 set dummy ${ac_tool_prefix}net-snmp-config; ac_word=$2
 { echo "$as_me:$LINENO: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_CONFIG_NETSNMP+set}" = set; then
+if test "${ac_cv_path_NETSNMP_CONFIG+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$CONFIG_NETSNMP"; then
-  ac_cv_prog_CONFIG_NETSNMP="$CONFIG_NETSNMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
+  case $NETSNMP_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_NETSNMP_CONFIG="$NETSNMP_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in ${NETSNMP_DIR}/bin
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CONFIG_NETSNMP="${ac_tool_prefix}net-snmp-config"
+    ac_cv_path_NETSNMP_CONFIG="$as_dir/$ac_word$ac_exec_ext"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -34822,12 +34823,13 @@ done
 done
 IFS=$as_save_IFS
 
+  ;;
+esac
 fi
-fi
-CONFIG_NETSNMP=$ac_cv_prog_CONFIG_NETSNMP
-if test -n "$CONFIG_NETSNMP"; then
-  { echo "$as_me:$LINENO: result: $CONFIG_NETSNMP" >&5
-echo "${ECHO_T}$CONFIG_NETSNMP" >&6; }
+NETSNMP_CONFIG=$ac_cv_path_NETSNMP_CONFIG
+if test -n "$NETSNMP_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $NETSNMP_CONFIG" >&5
+echo "${ECHO_T}$NETSNMP_CONFIG" >&6; }
 else
   { echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6; }
@@ -34835,26 +34837,101 @@ fi
 
 
 fi
-if test -z "$ac_cv_prog_CONFIG_NETSNMP"; then
-  ac_ct_CONFIG_NETSNMP=$CONFIG_NETSNMP
+if test -z "$ac_cv_path_NETSNMP_CONFIG"; then
+  ac_pt_NETSNMP_CONFIG=$NETSNMP_CONFIG
   # Extract the first word of "net-snmp-config", so it can be a program name with args.
 set dummy net-snmp-config; ac_word=$2
 { echo "$as_me:$LINENO: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_ac_ct_CONFIG_NETSNMP+set}" = set; then
+if test "${ac_cv_path_ac_pt_NETSNMP_CONFIG+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$ac_ct_CONFIG_NETSNMP"; then
-  ac_cv_prog_ac_ct_CONFIG_NETSNMP="$ac_ct_CONFIG_NETSNMP" # Let the user override the test.
+  case $ac_pt_NETSNMP_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_NETSNMP_CONFIG="$ac_pt_NETSNMP_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in ${NETSNMP_DIR}/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_NETSNMP_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_NETSNMP_CONFIG=$ac_cv_path_ac_pt_NETSNMP_CONFIG
+if test -n "$ac_pt_NETSNMP_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $ac_pt_NETSNMP_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_NETSNMP_CONFIG" >&6; }
 else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_pt_NETSNMP_CONFIG" = x; then
+    NETSNMP_CONFIG="No"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    NETSNMP_CONFIG=$ac_pt_NETSNMP_CONFIG
+  fi
+else
+  NETSNMP_CONFIG="$ac_cv_path_NETSNMP_CONFIG"
+fi
+
+      if test x"${NETSNMP_CONFIG}" = xNo; then
+         { echo "$as_me:$LINENO: ***" >&5
+echo "$as_me: ***" >&6;}
+         { echo "$as_me:$LINENO: *** net-snmp-config was not found in the path you specified:" >&5
+echo "$as_me: *** net-snmp-config was not found in the path you specified:" >&6;}
+         { echo "$as_me:$LINENO: *** ${NETSNMP_DIR}/bin" >&5
+echo "$as_me: *** ${NETSNMP_DIR}/bin" >&6;}
+         { echo "$as_me:$LINENO: *** Either correct the installation, or run configure" >&5
+echo "$as_me: *** Either correct the installation, or run configure" >&6;}
+         { echo "$as_me:$LINENO: *** including --without-netsnmp" >&5
+echo "$as_me: *** including --without-netsnmp" >&6;}
+         exit 1
+      fi
+   else
+      if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}net-snmp-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}net-snmp-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_NETSNMP_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $NETSNMP_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_NETSNMP_CONFIG="$NETSNMP_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CONFIG_NETSNMP="net-snmp-config"
+    ac_cv_path_NETSNMP_CONFIG="$as_dir/$ac_word$ac_exec_ext"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -34862,19 +34939,63 @@ done
 done
 IFS=$as_save_IFS
 
+  ;;
+esac
+fi
+NETSNMP_CONFIG=$ac_cv_path_NETSNMP_CONFIG
+if test -n "$NETSNMP_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $NETSNMP_CONFIG" >&5
+echo "${ECHO_T}$NETSNMP_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
 fi
+if test -z "$ac_cv_path_NETSNMP_CONFIG"; then
+  ac_pt_NETSNMP_CONFIG=$NETSNMP_CONFIG
+  # Extract the first word of "net-snmp-config", so it can be a program name with args.
+set dummy net-snmp-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_ac_pt_NETSNMP_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $ac_pt_NETSNMP_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_NETSNMP_CONFIG="$ac_pt_NETSNMP_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_NETSNMP_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
 fi
-ac_ct_CONFIG_NETSNMP=$ac_cv_prog_ac_ct_CONFIG_NETSNMP
-if test -n "$ac_ct_CONFIG_NETSNMP"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_CONFIG_NETSNMP" >&5
-echo "${ECHO_T}$ac_ct_CONFIG_NETSNMP" >&6; }
+ac_pt_NETSNMP_CONFIG=$ac_cv_path_ac_pt_NETSNMP_CONFIG
+if test -n "$ac_pt_NETSNMP_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $ac_pt_NETSNMP_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_NETSNMP_CONFIG" >&6; }
 else
   { echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6; }
 fi
 
-  if test "x$ac_ct_CONFIG_NETSNMP" = x; then
-    CONFIG_NETSNMP="No"
+  if test "x$ac_pt_NETSNMP_CONFIG" = x; then
+    NETSNMP_CONFIG="No"
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
@@ -34886,26 +35007,91 @@ whose name does not start with the host triplet.  If you think this
 configuration is useful to you, please write to autoconf@gnu.org." >&2;}
 ac_tool_warned=yes ;;
 esac
-    CONFIG_NETSNMP=$ac_ct_CONFIG_NETSNMP
+    NETSNMP_CONFIG=$ac_pt_NETSNMP_CONFIG
   fi
 else
-  CONFIG_NETSNMP="$ac_cv_prog_CONFIG_NETSNMP"
+  NETSNMP_CONFIG="$ac_cv_path_NETSNMP_CONFIG"
 fi
 
-	if test ! "x${CONFIG_NETSNMP}" = xNo; then
-	    if test x"" = x ; then A=--cflags ; else A="" ; fi
-	    NETSNMP_INCLUDE=$(${CONFIG_NETSNMP} $A)
-	    if test x"--agent-libs" = x ; then A=--libs ; else A="--agent-libs" ; fi
-	    NETSNMP_LIB=$(${CONFIG_NETSNMP} $A)
-	    PBX_NETSNMP=1
+   fi
+fi
+if test x"${NETSNMP_CONFIG}" != xNo; then
+   NETSNMP_libs=`${NETSNMP_CONFIG} --agent-libs`
 
-cat >>confdefs.h <<\_ACEOF
+   { echo "$as_me:$LINENO: checking for snmp_register_callback in -lnetsnmp" >&5
+echo $ECHO_N "checking for snmp_register_callback in -lnetsnmp... $ECHO_C" >&6; }
+if test "${ac_cv_lib_netsnmp_snmp_register_callback+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnetsnmp ${NETSNMP_LIBS} $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char snmp_register_callback ();
+int
+main ()
+{
+return snmp_register_callback ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_netsnmp_snmp_register_callback=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_netsnmp_snmp_register_callback=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_netsnmp_snmp_register_callback" >&5
+echo "${ECHO_T}$ac_cv_lib_netsnmp_snmp_register_callback" >&6; }
+if test $ac_cv_lib_netsnmp_snmp_register_callback = yes; then
+
+cat >>confdefs.h <<_ACEOF
 #define HAVE_NETSNMP 1
 _ACEOF
 
-	fi
-    fi
+fi
 
+   if test "${ac_cv_lib_netsnmp_snmp_register_callback}" = "yes"; then
+      NETSNMP_LIB="${NETSNMP_libs}"
+      PBX_NETSNMP=1
+   fi
+fi
 
 
 if test "x${PBX_NEWT}" != "x1" -a "${USE_NEWT}" != "no"; then
@@ -49497,7 +49683,7 @@ GC_CFLAGS!$GC_CFLAGS$ac_delim
 GC_LDFLAGS!$GC_LDFLAGS$ac_delim
 AST_DECLARATION_AFTER_STATEMENT!$AST_DECLARATION_AFTER_STATEMENT$ac_delim
 GSM_INTERNAL!$GSM_INTERNAL$ac_delim
-CONFIG_NETSNMP!$CONFIG_NETSNMP$ac_delim
+NETSNMP_CONFIG!$NETSNMP_CONFIG$ac_delim
 PG_CONFIG!$PG_CONFIG$ac_delim
 PTLIB_CONFIG!$PTLIB_CONFIG$ac_delim
 PWLIBDIR!$PWLIBDIR$ac_delim
diff --git a/configure.ac b/configure.ac
index 4d656c0ad7ddcfc6336427eba1db18fe6ba8d6f0..bcc3bbb839ae57048c5fd522ead9b8faac40d562 100644
--- a/configure.ac
+++ b/configure.ac
@@ -828,8 +828,32 @@ AST_EXT_LIB_CHECK([NBS], [nbs], [nbs_connect], [nbs.h])
 
 AST_EXT_LIB_CHECK([NCURSES], [ncurses], [initscr], [curses.h])
 
-# XXX do we need to check for snmp_register_callback ?
-AST_EXT_TOOL_CHECK([NETSNMP], [net-snmp], , [--agent-libs])
+NETSNMP_CONFIG=No
+if test "${USE_NETSNMP}" != "no"; then
+   if test "x${NETSNMP_DIR}" != "x"; then
+      AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], No, [${NETSNMP_DIR}/bin])
+      if test x"${NETSNMP_CONFIG}" = xNo; then
+         AC_MSG_NOTICE([***])
+         AC_MSG_NOTICE([*** net-snmp-config was not found in the path you specified:])
+         AC_MSG_NOTICE([*** ${NETSNMP_DIR}/bin])
+         AC_MSG_NOTICE([*** Either correct the installation, or run configure])
+         AC_MSG_NOTICE([*** including --without-netsnmp])
+         exit 1
+      fi
+   else
+      AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], No)
+   fi
+fi
+if test x"${NETSNMP_CONFIG}" != xNo; then
+   NETSNMP_libs=`${NETSNMP_CONFIG} --agent-libs`
+
+   AC_CHECK_LIB([netsnmp], [snmp_register_callback], AC_DEFINE_UNQUOTED([HAVE_NETSNMP], 1,
+   [Define to indicate the Net-SNMP library]), [], ${NETSNMP_LIBS})
+   if test "${ac_cv_lib_netsnmp_snmp_register_callback}" = "yes"; then
+      NETSNMP_LIB="${NETSNMP_libs}"
+      PBX_NETSNMP=1
+   fi
+fi
 
 AST_EXT_LIB_CHECK([NEWT], [newt], [newtBell], [newt.h])
 
diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in
index 3e9217689e2ae1b53c071d2dde1d8fa08ad495fe..cae42a2e33ca25f6d7884aa1b77f1a204cfa6366 100644
--- a/include/asterisk/autoconfig.h.in
+++ b/include/asterisk/autoconfig.h.in
@@ -499,7 +499,7 @@
 /* Define to 1 if you have the <netinet/in.h> header file. */
 #undef HAVE_NETINET_IN_H
 
-/* Define if your system has the NETSNMP libraries. */
+/* Define to indicate the Net-SNMP library */
 #undef HAVE_NETSNMP
 
 /* Define this to indicate the ${NEWT_DESCRIP} library */