diff --git a/trunk/auto/options.sh b/trunk/auto/options.sh
index 46d486c3e..fd861bfad 100755
--- a/trunk/auto/options.sh
+++ b/trunk/auto/options.sh
@@ -24,8 +24,6 @@ SRS_HTTP_CALLBACK=RESERVED
 SRS_HTTP_SERVER=RESERVED
 SRS_HTTP_API=RESERVED
 SRS_LIBRTMP=RESERVED
-# srs-bandwidth-test client
-SRS_BWTC=RESERVED
 SRS_RESEARCH=RESERVED
 SRS_UTEST=RESERVED
 # tcmalloc
@@ -195,7 +193,6 @@ function parse_user_option() {
         --with-http-server)             SRS_HTTP_SERVER=YES         ;;
         --with-http-api)                SRS_HTTP_API=YES            ;;
         --with-librtmp)                 SRS_LIBRTMP=YES             ;;
-        --with-bwtc)                    SRS_BWTC=YES                ;;
         --with-research)                SRS_RESEARCH=YES            ;;
         --with-utest)                   SRS_UTEST=YES               ;;
         --with-gperf)                   SRS_GPERF=YES               ;;
@@ -217,7 +214,6 @@ function parse_user_option() {
         --without-http-server)          SRS_HTTP_SERVER=NO          ;;
         --without-http-api)             SRS_HTTP_API=NO             ;;
         --without-librtmp)              SRS_LIBRTMP=NO              ;;
-        --without-bwtc)                 SRS_BWTC=NO                 ;;
         --without-research)             SRS_RESEARCH=NO             ;;
         --without-utest)                SRS_UTEST=NO                ;;
         --without-gperf)                SRS_GPERF=NO                ;;
@@ -334,7 +330,6 @@ function apply_user_presets() {
         SRS_HTTP_SERVER=NO
         SRS_HTTP_API=NO
         SRS_LIBRTMP=NO
-        SRS_BWTC=NO
         SRS_RESEARCH=NO
         SRS_UTEST=NO
         SRS_GPERF=NO
@@ -359,7 +354,6 @@ function apply_user_presets() {
         SRS_HTTP_SERVER=YES
         SRS_HTTP_API=YES
         SRS_LIBRTMP=YES
-        SRS_BWTC=YES
         SRS_RESEARCH=YES
         SRS_UTEST=YES
         SRS_GPERF=NO
@@ -384,7 +378,6 @@ function apply_user_presets() {
         SRS_HTTP_SERVER=NO
         SRS_HTTP_API=NO
         SRS_LIBRTMP=NO
-        SRS_BWTC=NO
         SRS_RESEARCH=NO
         SRS_UTEST=NO
         SRS_GPERF=NO
@@ -409,7 +402,6 @@ function apply_user_presets() {
         SRS_HTTP_SERVER=NO
         SRS_HTTP_API=NO
         SRS_LIBRTMP=NO
-        SRS_BWTC=NO
         SRS_RESEARCH=NO
         SRS_UTEST=NO
         SRS_GPERF=NO
@@ -434,7 +426,6 @@ function apply_user_presets() {
         SRS_HTTP_SERVER=NO
         SRS_HTTP_API=NO
         SRS_LIBRTMP=NO
-        SRS_BWTC=NO
         SRS_RESEARCH=NO
         SRS_UTEST=NO
         SRS_GPERF=NO
@@ -459,7 +450,6 @@ function apply_user_presets() {
         SRS_HTTP_SERVER=YES
         SRS_HTTP_API=YES
         SRS_LIBRTMP=YES
-        SRS_BWTC=NO
         SRS_RESEARCH=NO
         SRS_UTEST=NO
         SRS_GPERF=NO
@@ -485,7 +475,6 @@ function apply_user_presets() {
         SRS_HTTP_SERVER=YES
         SRS_HTTP_API=YES
         SRS_LIBRTMP=YES
-        SRS_BWTC=NO
         SRS_RESEARCH=NO
         SRS_UTEST=NO
         SRS_GPERF=NO
@@ -510,7 +499,6 @@ function apply_user_presets() {
         SRS_HTTP_SERVER=YES
         SRS_HTTP_API=YES
         SRS_LIBRTMP=YES
-        SRS_BWTC=YES
         SRS_RESEARCH=NO
         SRS_UTEST=YES
         SRS_GPERF=NO
@@ -535,7 +523,6 @@ function apply_user_presets() {
         SRS_HTTP_SERVER=YES
         SRS_HTTP_API=YES
         SRS_LIBRTMP=YES
-        SRS_BWTC=YES
         SRS_RESEARCH=YES
         SRS_UTEST=YES
         SRS_GPERF=NO
@@ -560,7 +547,6 @@ function apply_user_presets() {
         SRS_HTTP_SERVER=YES
         SRS_HTTP_API=YES
         SRS_LIBRTMP=NO
-        SRS_BWTC=NO
         SRS_RESEARCH=NO
         SRS_UTEST=NO
         SRS_GPERF=NO
@@ -585,7 +571,6 @@ function apply_user_presets() {
         SRS_HTTP_SERVER=YES
         SRS_HTTP_API=YES
         SRS_LIBRTMP=YES
-        SRS_BWTC=YES
         SRS_RESEARCH=NO
         SRS_UTEST=YES
         SRS_GPERF=NO
@@ -610,7 +595,6 @@ function apply_user_presets() {
         SRS_HTTP_SERVER=YES
         SRS_HTTP_API=YES
         SRS_LIBRTMP=YES
-        SRS_BWTC=NO
         SRS_RESEARCH=NO
         SRS_UTEST=NO
         SRS_GPERF=NO
@@ -635,7 +619,6 @@ function apply_user_presets() {
         SRS_HTTP_SERVER=YES
         SRS_HTTP_API=YES
         SRS_LIBRTMP=YES
-        SRS_BWTC=NO
         SRS_RESEARCH=NO
         SRS_UTEST=NO
         SRS_GPERF=NO
@@ -694,7 +677,6 @@ function regenerate_options() {
     if [ $SRS_HTTP_SERVER = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-http-server"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-http-server"; fi
     if [ $SRS_HTTP_API = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-http-api"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-http-api"; fi
     if [ $SRS_LIBRTMP = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-librtmp"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-librtmp"; fi
-    if [ $SRS_BWTC = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-bwtc"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-bwtc"; fi
     if [ $SRS_RESEARCH = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-research"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-research"; fi
     if [ $SRS_UTEST = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-utest"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-utest"; fi
     if [ $SRS_GPERF = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-gperf"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-gperf"; fi
@@ -741,7 +723,6 @@ function check_option_conflicts() {
     # user should disable all other features
     if [ $SRS_EMBEDED_CPU = YES ]; then
         if [ $SRS_FFMPEG_TOOL = YES ]; then echo "ffmpeg for arm is not available, see: ./configure --help"; __check_ok=NO; fi
-        if [ $SRS_BWTC = YES ]; then echo "bwtc for arm is not available, see: ./configure --help"; __check_ok=NO; fi
         if [ $SRS_RESEARCH = YES ]; then echo "research for arm is not available, see: ./configure --help"; __check_ok=NO; fi
         if [ $SRS_GPERF = YES ]; then echo "gperf for arm is not available, see: ./configure --help"; __check_ok=NO; fi
         if [ $SRS_GPERF_MC = YES ]; then echo "gmc for arm is not available, see: ./configure --help"; __check_ok=NO; fi
@@ -767,7 +748,6 @@ function check_option_conflicts() {
     if [ $SRS_HTTP_SERVER = RESERVED ]; then echo "you must specifies the http-server, see: ./configure --help"; __check_ok=NO; fi
     if [ $SRS_HTTP_API = RESERVED ]; then echo "you must specifies the http-api, see: ./configure --help"; __check_ok=NO; fi
     if [ $SRS_LIBRTMP = RESERVED ]; then echo "you must specifies the librtmp, see: ./configure --help"; __check_ok=NO; fi
-    if [ $SRS_BWTC = RESERVED ]; then echo "you must specifies the bwtc, see: ./configure --help"; __check_ok=NO; fi
     if [ $SRS_RESEARCH = RESERVED ]; then echo "you must specifies the research, see: ./configure --help"; __check_ok=NO; fi
     if [ $SRS_UTEST = RESERVED ]; then echo "you must specifies the utest, see: ./configure --help"; __check_ok=NO; fi
     if [ $SRS_GPERF = RESERVED ]; then echo "you must specifies the gperf, see: ./configure --help"; __check_ok=NO; fi
diff --git a/trunk/configure b/trunk/configure
index 89a5e2506..4bb2b84f2 100755
--- a/trunk/configure
+++ b/trunk/configure
@@ -115,7 +115,6 @@ SrsHttpServerSummaryColor="\${YELLOW}{disabled} "; if [ $SRS_HTTP_SERVER = YES ]
 SrsHttpApiSummaryColor="\${YELLOW}{disabled} "; if [ $SRS_HTTP_API = YES ]; then SrsHttpApiSummaryColor="\${GREEN}"; fi
 SrsLibrtmpSummaryColor="\${YELLOW}{disabled} "; if [ $SRS_LIBRTMP = YES ]; then SrsLibrtmpSummaryColor="\${GREEN}"; fi
 SrsLibrtmpSSLSummaryColor="\${YELLOW}{disabled} "; if [ $SRS_LIBRTMP = YES ]; then if [ $SRS_SSL = YES ]; then SrsLibrtmpSSLSummaryColor="\${GREEN}"; fi fi
-SrsBWTCSummaryColor="\${GREEN}{disabled} "; if [ $SRS_BWTC = YES ]; then SrsBWTCSummaryColor="\${GREEN}"; fi
 SrsResearchSummaryColor="\${GREEN}{disabled} "; if [ $SRS_RESEARCH = YES ]; then SrsResearchSummaryColor="\${GREEN}"; fi
 SrsUtestSummaryColor="\${YELLOW}{disabled} "; if [ $SRS_UTEST = YES ]; then SrsUtestSummaryColor="\${GREEN}"; fi
 SrsGperfSummaryColor="\${GREEN}{disabled} "; if [ $SRS_GPERF = YES ]; then SrsGperfSummaryColor="\${GREEN}"; fi
@@ -159,8 +158,6 @@ echo -e "     |     ${SrsGprofSummaryColor}gprof -b ./objs/srs gmon.out > gprof.
 echo -e "     \${BLACK}+------------------------------------------------------------------------------------\${BLACK}"
 echo -e "     |${SrsResearchSummaryColor}research: ./objs/research, api server, players, ts info, librtmp.\${BLACK}"
 echo -e "     \${BLACK}+------------------------------------------------------------------------------------\${BLACK}"
-echo -e "     |${SrsBWTCSummaryColor}bandwidth: ./objs/bandwidth, the bandwidth test client\${BLACK}"
-echo -e "     \${BLACK}+------------------------------------------------------------------------------------\${BLACK}"
 echo -e "     |${SrsUtestSummaryColor}utest: ./objs/srs_utest, the utest for srs\${BLACK}"
 echo -e "     \${BLACK}+------------------------------------------------------------------------------------\${BLACK}"
 echo -e "     |${SrsLibrtmpSummaryColor}librtmp @see: https://github.com/winlinvip/simple-rtmp-server/wiki/SrsLibrtmp\${BLACK}"
@@ -168,6 +165,10 @@ echo -e "     |${SrsLibrtmpSummaryColor}librtmp: ./objs/include, ./objs/lib, the
 echo -e "     |     ${SrsLibrtmpSummaryColor}simple handshake: publish/play stream with simple handshake to server\${BLACK}"
 echo -e "     |     ${SrsLibrtmpSSLSummaryColor}complex handshake: it's not required for client, recommend disable it\${BLACK}"
 echo -e "     |     ${SrsLibrtmpSummaryColor}librtmp-sample: ./research/librtmp, the srs-librtmp client sample\${BLACK}"
+echo -e "     |     ${SrsLibrtmpSummaryColor}librtmp-sample: ./research/librtmp/objs/srs_ingest_flv\${BLACK}"
+echo -e "     |     ${SrsLibrtmpSummaryColor}librtmp-sample: ./research/librtmp/objs/srs_ingest_rtmp\${BLACK}"
+echo -e "     |     ${SrsLibrtmpSummaryColor}librtmp-sample: ./research/librtmp/objs/srs_detect_rtmp\${BLACK}"
+echo -e "     |     ${SrsLibrtmpSummaryColor}librtmp-sample: ./research/librtmp/objs/srs_bandwidth_check\${BLACK}"
 echo -e "     \${BLACK}+------------------------------------------------------------------------------------\${BLACK}"
 echo -e "     |\${GREEN}server: ./objs/srs -c conf/srs.conf, start the srs server\${BLACK}"
 echo -e "     |     ${SrsHlsSummaryColor}hls @see: https://github.com/winlinvip/simple-rtmp-server/wiki/DeliveryHLS\${BLACK}"
@@ -204,7 +205,7 @@ END
 # makefile
 echo "generate Makefile"
 cat << END > ${SRS_MAKEFILE}
-.PHONY: default _default install install-api help clean server bandwidth librtmp librtmp-sample utest _prepare_dir
+.PHONY: default _default install install-api help clean server librtmp utest _prepare_dir
 
 # install prefix.
 SRS_PREFIX=${SRS_PREFIX}
@@ -230,24 +231,22 @@ fi
 
 # the real entry for all platform.
 cat << END >> ${SRS_MAKEFILE}
-_default: bandwidth librtmp-sample utest
+_default: server librtmp utest
 	@bash objs/_srs_build_summary.sh
 
 help:
-	@echo "Usage: make <help>|<clean>|<server>|<bandwidth>|<librtmp>|<librtmp-sample>|<utest>|<install>|<install-api>|<uninstall>"
+	@echo "Usage: make <help>|<clean>|<server>|<librtmp>|<utest>|<install>|<install-api>|<uninstall>"
 	@echo "  help               display this help menu"
 	@echo "  clean              cleanup project"
 	@echo "  server             build the srs(simple rtmp server) over st(state-threads)"
-	@echo "  bandwidth          build the bandwidth test client tool."
-	@echo "  librtmp            build the client publish/play library."
-	@echo "  librtmp-sample     build the srs-librtmp sample"
+	@echo "  librtmp            build the client publish/play library, and samples"
 	@echo "  utest              build the utest for srs"
 	@echo "  install            install srs to the prefix path"
-	@echo "  install-api        install srs api to the prefix path"
+	@echo "  install-api        install srs and api-server to the prefix path"
 	@echo "  uninstall          uninstall srs from prefix path"
 
 clean: 
-	(cd ${SRS_OBJS}; rm -rf srs bandwidth srs_utest)
+	(cd ${SRS_OBJS}; rm -rf srs srs_utest)
 	(cd ${SRS_OBJS}; rm -rf src research include lib)
 	(cd ${SRS_OBJS}/utest; rm -rf *.o *.a)
 	(cd research/librtmp; make clean)
@@ -313,49 +312,19 @@ install:
 
 END
 
-if [ $SRS_BWTC = YES ]; then
-    cat << END >> ${SRS_MAKEFILE}
-bandwidth: server
-	@echo "build the bandwidth test client tool"
-	\$(MAKE) -f ${SRS_OBJS}/${SRS_MAKEFILE} bandwidth
-
-END
-else
-    cat << END >> ${SRS_MAKEFILE}
-bandwidth: server
-	@echo "bandwidth test client tool is disabled, ignore."
-
-END
-fi
-
 if [ $SRS_LIBRTMP = YES ]; then
     cat << END >> ${SRS_MAKEFILE}
 librtmp: server
 	@echo "build the client publish/play library."
 	\$(MAKE) -f ${SRS_OBJS}/${SRS_MAKEFILE} librtmp
-
-END
-else
-    cat << END >> ${SRS_MAKEFILE}
-librtmp: server
-	@echo "srs-librtmp is disabled, ignore."
-
-END
-fi
-if [ $SRS_LIBRTMP = YES ]; then
-    cat << END >> ${SRS_MAKEFILE}
-
-librtmp-sample: librtmp
 	@echo "build the srs-librtmp sample"
 	(cd research/librtmp; \$(MAKE) ${SrsLibrtmpSampleEntry})
-	@echo "srs-librtmp sample build success"
 
 END
 else
     cat << END >> ${SRS_MAKEFILE}
-
-librtmp-sample: librtmp
-	@echo "srs-librtmp sample is disabled, ignore."
+librtmp: server
+	@echo "srs-librtmp is disabled, ignore."
 
 END
 fi
@@ -406,7 +375,7 @@ AR = ar
 LINK = g++
 CXXFLAGS = ${CXXFLAGS}
 
-.PHONY: default srs bandwidth librtmp
+.PHONY: default srs librtmp
 
 default:
 
@@ -491,7 +460,7 @@ LIBS_OBJS="${MODULE_OBJS[@]}"
 MODULE_ID="MAIN" 
 MODULE_DEPENDS=("CORE" "KERNEL" "RTMP" "APP")
 ModuleLibIncs=(${LibSTRoot} ${SRS_OBJS} ${LibGperfRoot})
-MODULE_FILES=("srs_main_server" "srs_main_bandcheck")
+MODULE_FILES=("srs_main_server")
 MAIN_INCS="src/main"; MODULE_DIR=${MAIN_INCS} . auto/modules.sh
 MAIN_OBJS="${MODULE_OBJS[@]}"
 
@@ -500,7 +469,7 @@ MAIN_OBJS="${MODULE_OBJS[@]}"
 # then link to a binary, for example, objs/srs
 #
 # all main entrances
-MAIN_ENTRANCES=("srs_main_server" "srs_main_bandcheck")
+MAIN_ENTRANCES=("srs_main_server")
 # 
 # all depends libraries
 ModuleLibFiles=(${LibSTfile} ${LibHttpParserfile} ${LibSSLfile} ${LibGperfFile})
@@ -511,10 +480,6 @@ LINK_OPTIONS="${SrsLinkOptions}${SrsGprofLink}${SrsGperfLink}"
 # srs:
 # srs(simple rtmp server) over st(state-threads)
 BUILD_KEY="srs" APP_MAIN="srs_main_server" APP_NAME="srs" . auto/apps.sh
-# bandwidth test tool, to test the bandwidth to server
-if [ $SRS_BWTC = YES ]; then
-    BUILD_KEY="bandwidth" APP_MAIN="srs_main_bandcheck" APP_NAME="bandwidth" . auto/apps.sh
-fi
 # srs librtmp
 if [ $SRS_LIBRTMP = YES ]; then
     MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${RTMP_OBJS[@]} ${LIBS_OBJS[@]}"
@@ -601,11 +566,6 @@ if [ $SRS_LIBRTMP = YES ]; then
 else
     echo -e "${YELLOW}note: srs-librtmp for client is disabled${BLACK}"
 fi
-if [ $SRS_BWTC = YES ]; then
-    echo -e "${GREEN}srs bandwidth test client is enabled${BLACK}"
-else
-    echo -e "${GREEN}note: srs bandwidth test client is disabled${BLACK}"
-fi
 if [ $SRS_RESEARCH = YES ]; then
     echo -e "${GREEN}research tools are builded${BLACK}"
 else
diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp
index dd20685fe..c099cc33f 100644
--- a/trunk/src/core/srs_core.hpp
+++ b/trunk/src/core/srs_core.hpp
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 // current release version
 #define VERSION_MAJOR "0"
 #define VERSION_MINOR "9"
-#define VERSION_REVISION "158"
+#define VERSION_REVISION "159"
 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
 // server info.
 #define RTMP_SIG_SRS_KEY "SRS"
diff --git a/trunk/src/main/srs_main_bandcheck.cpp b/trunk/src/main/srs_main_bandcheck.cpp
deleted file mode 100644
index 475ad0b49..000000000
--- a/trunk/src/main/srs_main_bandcheck.cpp
+++ /dev/null
@@ -1,817 +0,0 @@
-/*
-The MIT License (MIT)
-
-Copyright (c) 2013-2014 wenjiegit
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sstream>
-#include <getopt.h>
-#include <stdlib.h>
-
-#include <srs_protocol_rtmp.hpp>
-#include <srs_protocol_stack.hpp>
-#include <srs_kernel_error.hpp>
-#include <srs_protocol_amf0.hpp>
-#include <srs_core_autofree.hpp>
-#include <srs_kernel_stream.hpp>
-#include <srs_app_socket.hpp>
-#include <srs_app_config.hpp>
-#include <srs_app_log.hpp>
-#include <srs_app_server.hpp>
-#include <srs_kernel_utility.hpp>
-
-// kernel module.
-ISrsLog* _srs_log = new SrsFastLog();
-ISrsThreadContext* _srs_context = new ISrsThreadContext();
-// app module.
-SrsConfig* _srs_config = NULL;
-SrsServer* _srs_server = NULL;
-
-#include <st.h>
-
-// server play control
-#define SRS_BW_CHECK_START_PLAY         "onSrsBandCheckStartPlayBytes"
-#define SRS_BW_CHECK_STARTING_PLAY      "onSrsBandCheckStartingPlayBytes"
-#define SRS_BW_CHECK_STOP_PLAY          "onSrsBandCheckStopPlayBytes"
-#define SRS_BW_CHECK_STOPPED_PLAY       "onSrsBandCheckStoppedPlayBytes"
-
-// server publish control
-#define SRS_BW_CHECK_START_PUBLISH      "onSrsBandCheckStartPublishBytes"
-#define SRS_BW_CHECK_STARTING_PUBLISH   "onSrsBandCheckStartingPublishBytes"
-#define SRS_BW_CHECK_STOP_PUBLISH       "onSrsBandCheckStopPublishBytes"
-#define SRS_BW_CHECK_STOPPED_PUBLISH    "onSrsBandCheckStoppedPublishBytes"
-
-// EOF control.
-#define SRS_BW_CHECK_FINISHED           "onSrsBandCheckFinished"
-#define SRS_BW_CHECK_FLASH_FINAL        "finalClientPacket"
-
-// client only
-#define SRS_BW_CHECK_PLAYING            "onSrsBandCheckPlaying"
-#define SRS_BW_CHECK_PUBLISHING         "onSrsBandCheckPublishing"
-
-class ISrsProtocolReaderWriter;
-
-/**
-*  @brief class of Linux version band check client
-*  check play and publish speed.
-*/
-class SrsBandCheckClient : public SrsRtmpClient
-{
-public:
-    SrsBandCheckClient(ISrsProtocolReaderWriter* io);
-    ~SrsBandCheckClient();
-
-public:
-    /**
-    *  @brief test play
-    *
-    */
-    int check_play();
-    /**
-    *  @brief test publish
-    *
-    */
-    int check_publish();
-
-private:
-    /**
-    *  @brief just return success.
-    */
-    int create_stream(int& stream_id);
-    /**
-    *  @brief just return success.
-    */
-    int play(std::string stream, int stream_id);
-    /**
-    *  @brief just return success.
-    */
-    int publish(std::string stream, int stream_id);
-
-private:
-    int expect_start_play();
-    int send_starting_play();
-    int expect_stop_play();
-    int send_stopped_play();
-    int expect_start_pub();
-    int send_starting_pub();
-    int send_pub_data();
-    int expect_stop_pub();
-    /**
-    *  @brief expect result.
-    *   because the core module has no method to decode this packet
-    *   so we must get the internal data and decode it here.
-    */
-    int expect_finished();
-    int send_stopped_pub();
-    /**
-    *  @brief notify server the check procedure is over.
-    */
-    int send_final();
-};
-
-/**
-*  @brief class of band check
-*  used to check band width with a client @param bandCheck_Client
-*/
-class SrsBandCheck
-{
-public:
-    SrsBandCheck();
-    ~SrsBandCheck();
-
-public:
-    /**
-    *  @brief band check method
-    *
-    *   connect to server------>rtmp handshake------>rtmp connect------>play------>publish
-    *   @retval ERROR_SUCCESS when success.
-    */
-    int check(const std::string& app, const std::string& tcUrl);
-
-    /**
-    *  @brief set the address and port of test server
-    *
-    *  @param server server address, domain or ip
-    *  @param server listened port ,default is 1935
-    */
-    void set_server(const std::string& server, int port = 1935);
-
-private:
-    int connect_server();
-private:
-    st_netfd_t stfd;
-    ISrsProtocolReaderWriter* skt;
-    SrsBandCheckClient* bandCheck_Client;
-    std::string server_address;
-    int server_port;
-};
-
-/**
-*  @brief init st lib
-*/
-static int init_st();
-static void print_help(char** argv);
-static void print_version();
-
-/**
-*   @brief get user option
-*   @internal ip    Mandatory arguments
-*   @internal key   Mandatory arguments
-*   @internal port  default 1935
-*   @internal vhost default bandcheck.srs.com
-*/
-static int get_opt(int argc ,char* argv[]);
-
-/**
-*   global var.
-*/
-static struct option long_options[] =
-{
-    {"ip",      required_argument,  0, 'i'},
-    {"port",    optional_argument,  0, 'p'},
-    {"key",     required_argument,  0, 'k'},
-    {"vhost",   optional_argument,  0, 'v'},
-    {"help",    no_argument,        0, 'h'},
-    {"version", no_argument,        0, 'V'},
-};
-
-static const char* short_options = "i:p::k:v::hV";
-
-static std::string g_ip;
-static int         g_port  = 1935;
-static std::string g_key;
-static std::string g_vhost = "bandcheck.srs.com";
-
-#define BUILD_VERSION   "srs band check 0.1"
-
-// TODO: FIXME: by winlin, the bandwidth test tool has logic bug.
-int main(int argc ,char* argv[])
-{
-    int ret = ERROR_SUCCESS;
-    
-    if (argc <= 1) {
-        print_help(argv);
-        exit(1);
-    }
-
-    if ((ret = get_opt(argc, argv)) != ERROR_SUCCESS) {
-        return -1;
-    }
-
-    // check param
-    if (g_ip.empty()) {
-        printf("ip address should not be empty.\n");
-        return -1;
-    }
-
-    if (g_key.empty()) {
-        printf("test key should not be empty.\n");
-        return -1;
-    }
-
-    if ((ret = init_st()) != ERROR_SUCCESS) {
-        srs_error("band check init failed. ret=%d", ret);
-        return ret;
-    }
-
-    std::string app   = "app?key=" + g_key + "&vhost=" + g_vhost;
-
-    char tcUrl_buffer[1024] = {0};
-    sprintf(tcUrl_buffer, "rtmp://%s:%d/%s", g_ip.c_str(), g_port, app.c_str());
-    std::string tcUrl = tcUrl_buffer;
-
-    SrsBandCheck band_check;
-    band_check.set_server(g_ip, g_port);
-    if ((ret = band_check.check(app, tcUrl)) != ERROR_SUCCESS) {
-        srs_error("band check failed. address=%s  ret=%d", "xx.com", ret);
-        return -1;
-    }
-
-    return 0;
-}
-
-SrsBandCheckClient::SrsBandCheckClient(ISrsProtocolReaderWriter* io)
-    : SrsRtmpClient(io)
-{
-}
-
-SrsBandCheckClient::~SrsBandCheckClient()
-{
-}
-
-int SrsBandCheckClient::check_play()
-{
-    int ret = ERROR_SUCCESS;
-
-    if ((ret = expect_start_play()) != ERROR_SUCCESS) {
-        srs_error("expect_start_play failed. ret=%d", ret);
-        return ret;
-    }
-
-    if ((ret = send_starting_play()) != ERROR_SUCCESS) {
-        srs_error("send starting play failed. ret=%d", ret);
-        return ret;
-    }
-
-    if ((ret = expect_stop_play()) != ERROR_SUCCESS) {
-        srs_error("expect stop play failed. ret=%d", ret);
-        return ret;
-    }
-
-    if ((ret = send_stopped_play()) != ERROR_SUCCESS) {
-        srs_error("send stopped play failed. ret=%d", ret);
-        return ret;
-    }
-
-    return ret;
-}
-
-int SrsBandCheckClient::check_publish()
-{
-    int ret = ERROR_SUCCESS;
-
-    if ((ret = expect_start_pub()) != ERROR_SUCCESS) {
-        srs_error("expect start pub failed. ret=%d", ret);
-        return ret;
-    }
-
-    if ((ret = send_starting_pub())!= ERROR_SUCCESS) {
-        srs_error("send starting pub failed. ret=%d", ret);
-        return ret;
-    }
-
-    if ((ret = send_pub_data()) != ERROR_SUCCESS) {
-        srs_error("publish data failed. ret=%d", ret);
-        return ret;
-    }
-
-    if ((ret = send_stopped_pub()) != ERROR_SUCCESS) {
-        srs_error("send stopped pub failed. ret=%d", ret);
-        return ret;
-    }
-
-    if ((ret = expect_finished()) != ERROR_SUCCESS) {
-        srs_error("expect finished msg failed. ret=%d", ret);
-        return ret;
-    }
-
-    if ((ret = send_final()) != ERROR_SUCCESS) {
-        srs_error("send final msg failed. ret=%d", ret);
-        return ret;
-    }
-
-    return ret;
-}
-
-int SrsBandCheckClient::create_stream(int &stream_id)
-{
-    return ERROR_SUCCESS;
-}
-
-int SrsBandCheckClient::play(std::string stream, int stream_id)
-{
-    return ERROR_SUCCESS;
-}
-
-int SrsBandCheckClient::publish(std::string stream, int stream_id)
-{
-    return ERROR_SUCCESS;
-}
-
-int SrsBandCheckClient::expect_start_play()
-{
-    int ret = ERROR_SUCCESS;
-
-    // expect connect _result
-    SrsMessage* msg = NULL;
-    SrsBandwidthPacket* pkt = NULL;
-    if ((ret = expect_message<SrsBandwidthPacket>(&msg, &pkt)) != ERROR_SUCCESS) {
-        srs_error("expect bandcheck start play message failed. ret=%d", ret);
-        return ret;
-    }
-    SrsAutoFree(SrsMessage, msg);
-    SrsAutoFree(SrsBandwidthPacket, pkt);
-    srs_info("get bandcheck start play message");
-
-    if (pkt->command_name != SRS_BW_CHECK_START_PLAY) {
-        srs_error("pkt error. expect=%s, actual=%s", SRS_BW_CHECK_START_PLAY, pkt->command_name.c_str());
-        return -1;
-    }
-
-    return ret;
-}
-
-int SrsBandCheckClient::send_starting_play()
-{
-    int ret = ERROR_SUCCESS;
-
-    SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
-    pkt->command_name = SRS_BW_CHECK_STARTING_PLAY;
-    if ((ret = send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
-        srs_error("send starting play msg failed. ret=%d", ret);
-        return ret;
-    }
-
-    return ret;
-}
-
-int SrsBandCheckClient::expect_stop_play()
-{
-    int ret = ERROR_SUCCESS;
-
-    while (true) {
-        SrsMessage* msg = NULL;
-        SrsBandwidthPacket* pkt = NULL;
-        if ((ret = expect_message<SrsBandwidthPacket>(&msg, &pkt)) != ERROR_SUCCESS) {
-            srs_error("expect stop play message failed. ret=%d", ret);
-            return ret;
-        }
-        SrsAutoFree(SrsMessage, msg);
-        SrsAutoFree(SrsBandwidthPacket, pkt);
-        srs_info("get bandcheck stop play message");
-
-        if (pkt->command_name == SRS_BW_CHECK_STOP_PLAY) {
-            break;
-        }
-    }
-
-    return ret;
-}
-
-int SrsBandCheckClient::send_stopped_play()
-{
-    int ret = ERROR_SUCCESS;
-
-    SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
-    pkt->command_name = SRS_BW_CHECK_STOPPED_PLAY;
-    if ((ret = send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
-        srs_error("send stopped play msg failed. ret=%d", ret);
-        return ret;
-    }
-
-    return ret;
-}
-
-int SrsBandCheckClient::expect_start_pub()
-{
-    int ret = ERROR_SUCCESS;
-
-    while (true) {
-        SrsMessage* msg = NULL;
-        SrsBandwidthPacket* pkt = NULL;
-        if ((ret = expect_message<SrsBandwidthPacket>(&msg, &pkt)) != ERROR_SUCCESS) {
-            srs_error("expect start pub message failed. ret=%d", ret);
-            return ret;
-        }
-        SrsAutoFree(SrsMessage, msg);
-        SrsAutoFree(SrsBandwidthPacket, pkt);
-        srs_info("get bandcheck start pub message");
-
-        if (pkt->command_name == SRS_BW_CHECK_START_PUBLISH) {
-            break;
-        }
-    }
-
-    return ret;
-}
-
-int SrsBandCheckClient::send_starting_pub()
-{
-    int ret = ERROR_SUCCESS;
-
-    SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
-    pkt->command_name = SRS_BW_CHECK_STARTING_PUBLISH;
-    if ((ret = send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
-        srs_error("send starting play msg failed. ret=%d", ret);
-        return ret;
-    }
-    srs_info("send starting play msg success.");
-
-    return ret;
-}
-
-int SrsBandCheckClient::send_pub_data()
-{
-    int ret = ERROR_SUCCESS;
-
-    int data_count = 100;
-    while (true) {
-        SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
-        pkt->command_name = SRS_BW_CHECK_PUBLISHING;
-
-        for (int i = 0; i < data_count; ++i) {
-            std::stringstream seq;
-            seq << i;
-            std::string play_data = "SrS band check data from client's publishing......";
-            pkt->data->set(seq.str(), SrsAmf0Any::str(play_data.c_str()));
-        }
-        data_count += 100;
-
-        if ((ret = send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
-            srs_error("send publish message failed.ret=%d", ret);
-            return ret;
-        }
-
-        if ((ret = expect_stop_pub()) == ERROR_SUCCESS) {
-            break;
-        }
-    }
-
-    return ret;
-}
-
-int SrsBandCheckClient::expect_stop_pub()
-{
-    int ret = ERROR_SUCCESS;
-    
-    this->set_recv_timeout(1000 * 1000);
-    this->set_send_timeout(1000 * 1000);
-    
-    SrsMessage* msg;
-    SrsBandwidthPacket* pkt;
-    if ((ret = expect_message<SrsBandwidthPacket>(&msg, &pkt)) != ERROR_SUCCESS) {
-        return ret;
-    }
-    SrsAutoFree(SrsMessage, msg);
-    SrsAutoFree(SrsBandwidthPacket, pkt);
-    if (pkt->command_name == SRS_BW_CHECK_STOP_PUBLISH) {
-        return ret;
-    }
-
-    return ret;
-}
-
-int SrsBandCheckClient::expect_finished()
-{
-    int ret = ERROR_SUCCESS;
-
-    while (true) {
-        SrsMessage* msg = NULL;
-        SrsBandwidthPacket* pkt = NULL;
-        if ((ret = expect_message<SrsBandwidthPacket>(&msg, &pkt)) != ERROR_SUCCESS) {
-            srs_error("expect finished message failed. ret=%d", ret);
-            return ret;
-        }
-        SrsAutoFree(SrsMessage, msg);
-        SrsAutoFree(SrsBandwidthPacket, pkt);
-        srs_info("get bandcheck finished message");
-
-        if (pkt->command_name == SRS_BW_CHECK_FINISHED) {
-            SrsStream *stream = new SrsStream;
-            SrsAutoFree(SrsStream, stream);
-
-            if ((ret = stream->initialize((char*)msg->payload, msg->size)) != ERROR_SUCCESS) {
-                srs_error("initialize stream error. ret=%d", ret);
-                return ret;
-            }
-
-            std::string command_name;
-            if ((ret = srs_amf0_read_string(stream, command_name)) != ERROR_SUCCESS) {
-                srs_error("amfo read string error. ret=%d", ret);
-                return ret;
-            }
-
-            double action_id;
-            if ((ret = srs_amf0_read_number(stream, action_id)) != ERROR_SUCCESS) {
-                srs_error("amfo read number error. ret=%d", ret);
-                return ret;
-            }
-
-            if ((ret = srs_amf0_read_null(stream)) != ERROR_SUCCESS) {
-                srs_error("amfo read number error. ret=%d", ret);
-                return ret;
-            }
-
-            SrsAmf0Object* object = SrsAmf0Any::object();
-            if ((ret = object->read(stream)) != ERROR_SUCCESS) {
-                srs_freep(object);
-                srs_error("amfo read object error. ret=%d", ret);
-                return ret;
-            }
-
-            int64_t start_time = 0;
-            int64_t end_time = 0;
-
-            SrsAmf0Any* start_time_any = object->get_property("start_time");
-            if (start_time_any && start_time_any->is_number()) {
-                start_time = start_time_any->to_number();
-            }
-
-            SrsAmf0Any* end_time_any = object->get_property("end_time");
-            if (end_time_any && end_time_any->is_number()) {
-                end_time = end_time_any->to_number();
-            }
-
-            int play_kbps = 0;
-            int pub_kbps = 0;
-            SrsAmf0Any* play_kbp_any = object->get_property("play_kbps");
-            if (play_kbp_any && play_kbp_any->is_number()) {
-                play_kbps = play_kbp_any->to_number();
-            }
-
-            SrsAmf0Any* pub_kbp_any = object->get_property("publish_kbps");
-            if (pub_kbp_any && pub_kbp_any->is_number()) {
-                pub_kbps = pub_kbp_any->to_number();
-            }
-
-            float time_elapsed;
-            if (end_time - start_time > 0) {
-                time_elapsed = (end_time - start_time) / 1000.00;
-            }
-
-            srs_trace("result: play %d kbps, publish %d kbps, check time %.4f S\n"
-                   , play_kbps, pub_kbps, time_elapsed);
-
-            break;
-        }
-    }
-
-    return ret;
-}
-
-int SrsBandCheckClient::send_stopped_pub()
-{
-    int ret = ERROR_SUCCESS;
-
-    SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
-    pkt->command_name = SRS_BW_CHECK_STOPPED_PUBLISH;
-    if ((ret = send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
-        srs_error("send stopped pub msg failed. ret=%d", ret);
-        return ret;
-    }
-    srs_info("send stopped pub msg success.");
-
-    return ret;
-}
-
-int SrsBandCheckClient::send_final()
-{
-    int ret = ERROR_SUCCESS;
-
-    SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
-    pkt->command_name = SRS_BW_CHECK_FLASH_FINAL;
-    if ((ret = send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
-        srs_error("send final msg failed. ret=%d", ret);
-        return ret;
-    }
-    srs_info("send final msg success.");
-
-    return ret;
-}
-
-SrsBandCheck::SrsBandCheck()
-{
-    skt = NULL;
-    bandCheck_Client = NULL;
-    stfd = NULL;
-}
-
-SrsBandCheck::~SrsBandCheck()
-{
-    srs_freep(bandCheck_Client);
-    srs_freep(skt);
-    srs_close_stfd(stfd);
-}
-
-int SrsBandCheck::check(const std::string &app, const std::string &tcUrl)
-{
-    int ret = ERROR_SUCCESS;
-
-    if ((ret = connect_server()) != ERROR_SUCCESS) {
-        srs_error("connect to server failed. ret = %d", ret);
-        return ret;
-    }
-
-    if ((ret = bandCheck_Client->handshake()) != ERROR_SUCCESS) {
-        srs_error("handshake failed. ret = %d", ret);
-        return ret;
-    }
-
-    if ((ret = bandCheck_Client->connect_app(app, tcUrl)) != ERROR_SUCCESS) {
-        srs_error("handshake failed. ret = %d", ret);
-        return ret;
-    }
-
-    if ((ret = bandCheck_Client->check_play()) != ERROR_SUCCESS) {
-        srs_error("band check play failed.");
-        return ret;
-    }
-
-    if ((ret = bandCheck_Client->check_publish()) != ERROR_SUCCESS) {
-        srs_error("band check publish failed.");
-        return ret;
-    }
-
-    return ret;
-}
-
-void SrsBandCheck::set_server(const std::string &server, int port)
-{
-    server_address = server;
-    server_port = port;
-}
-
-int SrsBandCheck::connect_server()
-{
-    int ret = ERROR_SUCCESS;
-
-    int sock = socket(AF_INET, SOCK_STREAM, 0);
-    if(sock == -1){
-        ret = ERROR_SOCKET_CREATE;
-        srs_error("create socket error. ret=%d", ret);
-        return ret;
-    }
-
-    stfd = st_netfd_open_socket(sock);
-    if(stfd == NULL){
-        ret = ERROR_ST_OPEN_SOCKET;
-        srs_error("st_netfd_open_socket failed. ret=%d", ret);
-        return ret;
-    }
-
-    skt = new SrsSocket(stfd);
-    bandCheck_Client = new SrsBandCheckClient(skt);
-
-    // connect to server.
-    std::string ip = srs_dns_resolve(server_address);
-    if (ip.empty()) {
-        ret = ERROR_SYSTEM_IP_INVALID;
-        srs_error("dns resolve server error, ip empty. ret=%d", ret);
-        return ret;
-    }
-
-    sockaddr_in addr;
-    addr.sin_family = AF_INET;
-    addr.sin_port = htons(server_port);
-    addr.sin_addr.s_addr = inet_addr(ip.c_str());
-
-    if (st_connect(stfd, (const struct sockaddr*)&addr, sizeof(sockaddr_in), ST_UTIME_NO_TIMEOUT) == -1){
-        ret = ERROR_ST_CONNECT;
-        srs_error("connect to server error. ip=%s, port=%d, ret=%d", ip.c_str(), server_port, ret);
-        return ret;
-    }
-    srs_trace("connect to server success. server=%s, ip=%s, port=%d", server_address.c_str(), ip.c_str(), server_port);
-
-    return ret;
-}
-
-int init_st()
-{
-    int ret = ERROR_SUCCESS;
-
-    if (st_set_eventsys(ST_EVENTSYS_ALT) == -1) {
-        ret = ERROR_ST_SET_EPOLL;
-        srs_error("st_set_eventsys use linux epoll failed. ret=%d", ret);
-        return ret;
-    }
-
-    if(st_init() != 0){
-        ret = ERROR_ST_INITIALIZE;
-        srs_error("st_init failed. ret=%d", ret);
-        return ret;
-    }
-
-    return ret;
-}
-
-void print_help(char** argv)
-{
-    printf(
-        "Usage: %s [OPTION]...\n"
-        "test band width from client to rtmp server.\n"
-        "Mandatory arguments to long options are mandatory for short options too.\n"
-        "  -i, --ip                  the ip or domain that to test\n"
-        "  -p, --port                the port that server listen \n"
-        "  -k, --key                 the key used to test \n"
-        "  -v, --vhost               the vhost used to test \n"
-        "  -V, --version             output version information and exit \n"
-        "  -h, --help                display this help and exit \n"
-        "\n"
-        "For example:\n"
-        "    %s -i 127.0.0.1 -p 1935 -v bandcheck.srs.com -k 35c9b402c12a7246868752e2878f7e0e"
-        "\n\n"
-        "Exit status:\n"
-        "0      if OK,\n"
-        "other  if error occured, and the detail should be printed.\n"
-        "\n\n"
-        "srs home page: <http://blog.chinaunix.net/uid/25006789.html>\n", 
-        argv[0], argv[0]);
-}
-
-void print_version()
-{
-    const char *version = ""
-            "srs_bandcheck "BUILD_VERSION"\n"
-            "Copyright (c) 2013-2014 wenjiegit.\n"
-            "License MIT\n"
-            "This is free software: you are free to change and redistribute it.\n"
-            "There is NO WARRANTY, to the extent permitted by law.\n"
-            "\n"
-            "Written by wenjie.\n";
-
-    printf("%s", version);
-}
-
-int get_opt(int argc, char *argv[])
-{
-    int ret = ERROR_SUCCESS;
-
-    int c;
-    while ((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1) {
-        switch (c) {
-        case 'i':
-            if (optarg) {
-                g_ip = optarg;
-            }
-            break;
-        case 'p':
-            if (optarg) {
-                g_port = atoi(optarg);
-            }
-            break;
-        case 'k':
-            if (optarg) {
-                g_key = optarg;
-            }
-            break;
-        case 'v':
-            if (optarg) {
-                g_vhost = optarg;
-            }
-            break;
-        case 'V':
-            print_version();
-            exit(0);
-            break;
-        case 'h':
-            print_help(argv);
-            exit(0);
-            break;
-        default:
-            printf("see --help or -h\n");
-            ret = -1;
-        }
-    }
-
-    return ret;
-}
diff --git a/trunk/src/rtmp/srs_protocol_rtmp.cpp b/trunk/src/rtmp/srs_protocol_rtmp.cpp
index 40a006f35..971f6a0d8 100644
--- a/trunk/src/rtmp/srs_protocol_rtmp.cpp
+++ b/trunk/src/rtmp/srs_protocol_rtmp.cpp
@@ -436,8 +436,6 @@ int SrsRtmpClient::complex_handshake()
 
 int SrsRtmpClient::connect_app(string app, string tc_url, SrsRequest* req)
 {
-    int ret = ERROR_SUCCESS;
-    
     std::string srs_server_ip;
     std::string srs_server;
     std::string srs_primary_authors;
diff --git a/trunk/src/srs/srs.upp b/trunk/src/srs/srs.upp
index 2bb52dfba..4584de8e8 100755
--- a/trunk/src/srs/srs.upp
+++ b/trunk/src/srs/srs.upp
@@ -1,7 +1,6 @@
 file
 	main readonly separator,
 	..\main\srs_main_server.cpp,
-	..\main\srs_main_bandcheck.cpp,
 	auto readonly separator,
 	..\..\objs\srs_auto_headers.hpp,
 	libs readonly separator,