diff --git a/core/cfuns.go b/core/consumer_callback.go
similarity index 100%
rename from core/cfuns.go
rename to core/consumer_callback.go
diff --git a/core/error.go b/core/error.go
index 8986660..f5871f7 100644
--- a/core/error.go
+++ b/core/error.go
@@ -34,10 +34,12 @@
 	ErrSendSyncFailed          = rmqError(C.PRODUCER_SEND_SYNC_FAILED)
 	ErrSendOnewayFailed        = rmqError(C.PRODUCER_SEND_ONEWAY_FAILED)
 	ErrSendOrderlyFailed       = rmqError(C.PRODUCER_SEND_ORDERLY_FAILED)
-	ErrPushConsumerStartFailed = rmqError(C.PUSHCONSUMER_ERROR_CODE_START)
+	ErrSendTransactionFailed   = rmqError(C.PRODUCER_SEND_TRANSACTION_FAILED)
+	ErrPushConsumerStartFailed = rmqError(C.PUSHCONSUMER_START_FAILED)
 	ErrPullConsumerStartFailed = rmqError(C.PULLCONSUMER_START_FAILED)
 	ErrFetchMQFailed           = rmqError(C.PULLCONSUMER_FETCH_MQ_FAILED)
 	ErrFetchMessageFailed      = rmqError(C.PULLCONSUMER_FETCH_MESSAGE_FAILED)
+	ErrNotSupportNow      = rmqError(C.NOT_SUPPORT_NOW)
 )
 
 func (e rmqError) Error() string {
@@ -54,6 +56,8 @@
 		return "send message with orderly failed"
 	case ErrSendOnewayFailed:
 		return "send message with oneway failed"
+	case ErrSendTransactionFailed:
+		return "send transaction message failed"
 	case ErrPushConsumerStartFailed:
 		return "start push-consumer failed"
 	case ErrPullConsumerStartFailed:
@@ -62,6 +66,8 @@
 		return "fetch MessageQueue failed"
 	case ErrFetchMessageFailed:
 		return "fetch Message failed"
+	case ErrNotSupportNow:
+		return "this function is not support"
 	default:
 		return fmt.Sprintf("unknow error: %v", int(e))
 	}
diff --git a/core/transaction_funcs.go b/core/transaction_callback.go
similarity index 100%
rename from core/transaction_funcs.go
rename to core/transaction_callback.go
diff --git a/demos/main.go b/demos/main.go
deleted file mode 100644
index 1e325e9..0000000
--- a/demos/main.go
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package main
-
-func main() {
-	//run producer
-	main0()
-	//run consumer
-	main1()
-	//run orderly producer
-	main2()
-	//run orderly consumer
-	main3()
-}
diff --git a/demos/producer.go b/demos/producer.go
deleted file mode 100644
index ad08c12..0000000
--- a/demos/producer.go
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package main
-
-import (
-	"fmt"
-	"github.com/apache/rocketmq-client-go/core"
-)
-
-// Change to main if you want to run it directly
-func main0() {
-	pConfig := &rocketmq.ProducerConfig{
-		ClientConfig: rocketmq.ClientConfig{
-			GroupID:    "GID_XXXXXXXXXXXX",
-			NameServer: "http://XXXXXXXXXXXXXXXXXX:80",
-			Credentials: &rocketmq.SessionCredentials{
-				AccessKey: "Your Access Key",
-				SecretKey: "Your Secret Key",
-				Channel:   "ALIYUN/OtherChannel",
-			},
-		},
-		//Set to Common Producer as default.
-		ProducerModel: rocketmq.CommonProducer,
-	}
-	sendMessage(pConfig)
-}
-func sendMessage(config *rocketmq.ProducerConfig) {
-	producer, err := rocketmq.NewProducer(config)
-
-	if err != nil {
-		fmt.Println("create common producer failed, error:", err)
-		return
-	}
-
-	err = producer.Start()
-	if err != nil {
-		fmt.Println("start common producer error", err)
-		return
-	}
-	defer producer.Shutdown()
-
-	fmt.Printf("Common producer: %s started... \n", producer)
-	for i := 0; i < 10; i++ {
-		msg := fmt.Sprintf("%s-%d", "Hello,Common MQ Message-", i)
-		result, err := producer.SendMessageSync(&rocketmq.Message{Topic: "YourTopicXXXXXXXX", Body: msg})
-		if err != nil {
-			fmt.Println("Error:", err)
-		}
-		fmt.Printf("send message: %s result: %s\n", msg, result)
-	}
-	fmt.Println("shutdown common producer.")
-}
diff --git a/demos/producer_orderly.go b/demos/producer_orderly.go
deleted file mode 100644
index e379a93..0000000
--- a/demos/producer_orderly.go
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package main
-
-import (
-	"fmt"
-	"github.com/apache/rocketmq-client-go/core"
-	"time"
-)
-
-// Change to main if you want to run it directly
-func main2() {
-	pConfig := &rocketmq.ProducerConfig{
-		ClientConfig: rocketmq.ClientConfig{
-			GroupID:    "GID_XXXXXXXXXXXX",
-			NameServer: "http://XXXXXXXXXXXXXXXXXX:80",
-			Credentials: &rocketmq.SessionCredentials{
-				AccessKey: "Your Access Key",
-				SecretKey: "Your Secret Key",
-				Channel:   "ALIYUN/OtherChannel",
-			},
-		},
-		ProducerModel: rocketmq.OrderlyProducer,
-	}
-	sendMessageOrderlyByShardingKey(pConfig)
-}
-func sendMessageOrderlyByShardingKey(config *rocketmq.ProducerConfig) {
-	producer, err := rocketmq.NewProducer(config)
-	if err != nil {
-		fmt.Println("create Producer failed, error:", err)
-		return
-	}
-
-	producer.Start()
-	defer producer.Shutdown()
-	for i := 0; i < 1000; i++ {
-		msg := fmt.Sprintf("%s-%d", "Hello Lite Orderly Message", i)
-		r, err := producer.SendMessageOrderlyByShardingKey(
-			&rocketmq.Message{Topic: "YourOrderLyTopicXXXXXXXX", Body: msg}, "ShardingKey" /*orderID*/)
-		if err != nil {
-			println("Send Orderly Message Error:", err)
-		}
-		fmt.Printf("send orderly message result:%+v\n", r)
-		time.Sleep(time.Duration(1) * time.Second)
-	}
-
-}
diff --git a/demos/push_consumer.go b/demos/push_consumer.go
deleted file mode 100644
index 98a1ddf..0000000
--- a/demos/push_consumer.go
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package main
-
-import (
-	"fmt"
-	"github.com/apache/rocketmq-client-go/core"
-	"sync/atomic"
-)
-
-// Change to main if you want to run it directly
-func main1() {
-	pConfig := &rocketmq.PushConsumerConfig{
-		ClientConfig: rocketmq.ClientConfig{
-			GroupID:    "GID_XXXXXXXXXXXX",
-			NameServer: "http://XXXXXXXXXXXXXXXXXX:80",
-			Credentials: &rocketmq.SessionCredentials{
-				AccessKey: "Your Access Key",
-				SecretKey: "Your Secret Key",
-				Channel:   "ALIYUN/OtherChannel",
-			},
-		},
-		Model:         rocketmq.Clustering,
-		ConsumerModel: rocketmq.CoCurrently,
-	}
-	consumeWithPush(pConfig)
-}
-func consumeWithPush(config *rocketmq.PushConsumerConfig) {
-
-	consumer, err := rocketmq.NewPushConsumer(config)
-	if err != nil {
-		println("create Consumer failed, error:", err)
-		return
-	}
-
-	ch := make(chan interface{})
-	var count = (int64)(1000000)
-	// ********************************************
-	// MUST subscribe topic before consumer started.
-	// *********************************************
-	consumer.Subscribe("YourTopicXXXXXXXX", "*", func(msg *rocketmq.MessageExt) rocketmq.ConsumeStatus {
-		fmt.Printf("A message received, MessageID:%s, Body:%s \n", msg.MessageID, msg.Body)
-		if atomic.AddInt64(&count, -1) <= 0 {
-			ch <- "quit"
-		}
-		return rocketmq.ConsumeSuccess
-	})
-
-	err = consumer.Start()
-	if err != nil {
-		println("consumer start failed,", err)
-		return
-	}
-
-	fmt.Printf("consumer: %s started...\n", consumer)
-	<-ch
-	err = consumer.Shutdown()
-	if err != nil {
-		println("consumer shutdown failed")
-		return
-	}
-	println("consumer has shutdown.")
-}
diff --git a/examples/main.go b/examples/main.go
index b3018f0..1e325e9 100644
--- a/examples/main.go
+++ b/examples/main.go
@@ -17,62 +17,13 @@
 
 package main
 
-import (
-	"github.com/apache/rocketmq-client-go/core"
-	"gopkg.in/alecthomas/kingpin.v2"
-	"os"
-)
-
-var (
-	rmq     = kingpin.New("rocketmq", "RocketMQ cmd tools")
-	namesrv = rmq.Flag("namesrv", "NameServer address.").Default("localhost:9876").Short('n').String()
-	topic   = rmq.Flag("topic", "topic name.").Short('t').Required().String()
-	gid     = rmq.Flag("groupId", "group Id").Short('g').Default("testGroup").String()
-	amount  = rmq.Flag("amount", "how many message to produce or consume").Default("64").Short('a').Int()
-
-	produce     = rmq.Command("produce", "send messages to RocketMQ")
-	body        = produce.Flag("body", "message body").Short('b').Required().String()
-	workerCount = produce.Flag("workerCount", "works of send message with orderly").Default("1").Short('w').Int()
-	orderly     = produce.Flag("orderly", "send msg orderly").Short('o').Bool()
-
-	consume = rmq.Command("consume", "consumes message from RocketMQ")
-)
-
 func main() {
-	switch kingpin.MustParse(rmq.Parse(os.Args[1:])) {
-	case produce.FullCommand():
-		pConfig := &rocketmq.ProducerConfig{ClientConfig: rocketmq.ClientConfig{
-			GroupID:    "MQ_INST_xxxxxxx%GID",
-			NameServer: "http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:80",
-			Credentials: &rocketmq.SessionCredentials{
-				AccessKey: "xxxxxx",
-				SecretKey: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
-				Channel:   "mq-channel",
-			},
-			LogC: &rocketmq.LogConfig{
-				Path:     "example",
-				FileSize: 64 * 1 << 10,
-				FileNum:  1,
-				Level:    rocketmq.LogLevelDebug,
-			},
-		}}
-		if *orderly {
-			sendMessageOrderly(pConfig)
-		} else {
-			sendMessage(pConfig)
-		}
-	case consume.FullCommand():
-		cConfig := &rocketmq.PushConsumerConfig{ClientConfig: rocketmq.ClientConfig{
-			GroupID:    *gid,
-			NameServer: *namesrv,
-			LogC: &rocketmq.LogConfig{
-				Path:     "example",
-				FileSize: 64 * 1 << 10,
-				FileNum:  1,
-				Level:    rocketmq.LogLevelInfo,
-			},
-		}, Model: rocketmq.Clustering}
-
-		consumeWithPush(cConfig)
-	}
+	//run producer
+	main0()
+	//run consumer
+	main1()
+	//run orderly producer
+	main2()
+	//run orderly consumer
+	main3()
 }
diff --git a/demos/orderly_push_consumer.go b/examples/orderly_push_consumer.go
similarity index 100%
rename from demos/orderly_push_consumer.go
rename to examples/orderly_push_consumer.go
diff --git a/examples/producer.go b/examples/producer.go
index e1c4d2f..ad08c12 100644
--- a/examples/producer.go
+++ b/examples/producer.go
@@ -22,29 +22,46 @@
 	"github.com/apache/rocketmq-client-go/core"
 )
 
+// Change to main if you want to run it directly
+func main0() {
+	pConfig := &rocketmq.ProducerConfig{
+		ClientConfig: rocketmq.ClientConfig{
+			GroupID:    "GID_XXXXXXXXXXXX",
+			NameServer: "http://XXXXXXXXXXXXXXXXXX:80",
+			Credentials: &rocketmq.SessionCredentials{
+				AccessKey: "Your Access Key",
+				SecretKey: "Your Secret Key",
+				Channel:   "ALIYUN/OtherChannel",
+			},
+		},
+		//Set to Common Producer as default.
+		ProducerModel: rocketmq.CommonProducer,
+	}
+	sendMessage(pConfig)
+}
 func sendMessage(config *rocketmq.ProducerConfig) {
 	producer, err := rocketmq.NewProducer(config)
 
 	if err != nil {
-		fmt.Println("create Producer failed, error:", err)
+		fmt.Println("create common producer failed, error:", err)
 		return
 	}
 
 	err = producer.Start()
 	if err != nil {
-		fmt.Println("start producer error", err)
+		fmt.Println("start common producer error", err)
 		return
 	}
 	defer producer.Shutdown()
 
-	fmt.Printf("Producer: %s started... \n", producer)
-	for i := 0; i < *amount; i++ {
-		msg := fmt.Sprintf("%s-%d", *body, i)
-		result, err := producer.SendMessageSync(&rocketmq.Message{Topic: *topic, Body: msg})
+	fmt.Printf("Common producer: %s started... \n", producer)
+	for i := 0; i < 10; i++ {
+		msg := fmt.Sprintf("%s-%d", "Hello,Common MQ Message-", i)
+		result, err := producer.SendMessageSync(&rocketmq.Message{Topic: "YourTopicXXXXXXXX", Body: msg})
 		if err != nil {
 			fmt.Println("Error:", err)
 		}
 		fmt.Printf("send message: %s result: %s\n", msg, result)
 	}
-	fmt.Println("shutdown producer.")
+	fmt.Println("shutdown common producer.")
 }
diff --git a/examples/producer_orderly.go b/examples/producer_orderly.go
index f88c3d5..e379a93 100644
--- a/examples/producer_orderly.go
+++ b/examples/producer_orderly.go
@@ -19,37 +19,27 @@
 
 import (
 	"fmt"
-	"sync"
-	"sync/atomic"
-
 	"github.com/apache/rocketmq-client-go/core"
+	"time"
 )
 
-type queueSelectorByOrderID struct{}
-
-func (s queueSelectorByOrderID) Select(size int, m *rocketmq.Message, arg interface{}) int {
-	return arg.(int) % size
-}
-
-type worker struct {
-	p            rocketmq.Producer
-	leftMsgCount int64
-}
-
-func (w *worker) run() {
-	selector := queueSelectorByOrderID{}
-	for atomic.AddInt64(&w.leftMsgCount, -1) >= 0 {
-		r, err := w.p.SendMessageOrderly(
-			&rocketmq.Message{Topic: *topic, Body: *body}, selector, 7 /*orderID*/, 3,
-		)
-		if err != nil {
-			println("Send Orderly Error:", err)
-		}
-		fmt.Printf("send orderly result:%+v\n", r)
+// Change to main if you want to run it directly
+func main2() {
+	pConfig := &rocketmq.ProducerConfig{
+		ClientConfig: rocketmq.ClientConfig{
+			GroupID:    "GID_XXXXXXXXXXXX",
+			NameServer: "http://XXXXXXXXXXXXXXXXXX:80",
+			Credentials: &rocketmq.SessionCredentials{
+				AccessKey: "Your Access Key",
+				SecretKey: "Your Secret Key",
+				Channel:   "ALIYUN/OtherChannel",
+			},
+		},
+		ProducerModel: rocketmq.OrderlyProducer,
 	}
+	sendMessageOrderlyByShardingKey(pConfig)
 }
-
-func sendMessageOrderly(config *rocketmq.ProducerConfig) {
+func sendMessageOrderlyByShardingKey(config *rocketmq.ProducerConfig) {
 	producer, err := rocketmq.NewProducer(config)
 	if err != nil {
 		fmt.Println("create Producer failed, error:", err)
@@ -58,19 +48,15 @@
 
 	producer.Start()
 	defer producer.Shutdown()
-
-	wg := sync.WaitGroup{}
-	wg.Add(*workerCount)
-
-	workers := make([]worker, *workerCount)
-	for i := range workers {
-		workers[i].p = producer
-		workers[i].leftMsgCount = (int64)(*amount)
+	for i := 0; i < 1000; i++ {
+		msg := fmt.Sprintf("%s-%d", "Hello Lite Orderly Message", i)
+		r, err := producer.SendMessageOrderlyByShardingKey(
+			&rocketmq.Message{Topic: "YourOrderLyTopicXXXXXXXX", Body: msg}, "ShardingKey" /*orderID*/)
+		if err != nil {
+			println("Send Orderly Message Error:", err)
+		}
+		fmt.Printf("send orderly message result:%+v\n", r)
+		time.Sleep(time.Duration(1) * time.Second)
 	}
 
-	for i := range workers {
-		go func(w *worker) { w.run(); wg.Done() }(&workers[i])
-	}
-
-	wg.Wait()
 }
diff --git a/examples/pull_consumer.go b/examples/pull_consumer.go
deleted file mode 100644
index de38048..0000000
--- a/examples/pull_consumer.go
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package main
-
-import (
-	"fmt"
-	"time"
-
-	"github.com/apache/rocketmq-client-go/core"
-)
-
-func consumeWithPull(config *rocketmq.PullConsumerConfig, topic string) {
-
-	consumer, err := rocketmq.NewPullConsumer(config)
-	if err != nil {
-		fmt.Printf("new pull consumer error:%s\n", err)
-		return
-	}
-
-	err = consumer.Start()
-	if err != nil {
-		fmt.Printf("start consumer error:%s\n", err)
-		return
-	}
-	defer consumer.Shutdown()
-
-	mqs := consumer.FetchSubscriptionMessageQueues(topic)
-	fmt.Printf("fetch subscription mqs:%+v\n", mqs)
-
-	total, offsets, now := 0, map[int]int64{}, time.Now()
-
-PULL:
-	for {
-		for _, mq := range mqs {
-			pr := consumer.Pull(mq, "*", offsets[mq.ID], 32)
-			total += len(pr.Messages)
-			fmt.Printf("pull %s, result:%+v\n", mq.String(), pr)
-
-			switch pr.Status {
-			case rocketmq.PullNoNewMsg:
-				break PULL
-			case rocketmq.PullFound:
-				fallthrough
-			case rocketmq.PullNoMatchedMsg:
-				fallthrough
-			case rocketmq.PullOffsetIllegal:
-				offsets[mq.ID] = pr.NextBeginOffset
-			case rocketmq.PullBrokerTimeout:
-				fmt.Println("broker timeout occur")
-			}
-		}
-	}
-
-	var timePerMessage time.Duration
-	if total > 0 {
-		timePerMessage = time.Since(now) / time.Duration(total)
-	}
-	fmt.Printf("total message:%d, per message time:%d\n", total, timePerMessage)
-}
diff --git a/examples/push_consumer.go b/examples/push_consumer.go
index 3f0e34a..98a1ddf 100644
--- a/examples/push_consumer.go
+++ b/examples/push_consumer.go
@@ -23,6 +23,23 @@
 	"sync/atomic"
 )
 
+// Change to main if you want to run it directly
+func main1() {
+	pConfig := &rocketmq.PushConsumerConfig{
+		ClientConfig: rocketmq.ClientConfig{
+			GroupID:    "GID_XXXXXXXXXXXX",
+			NameServer: "http://XXXXXXXXXXXXXXXXXX:80",
+			Credentials: &rocketmq.SessionCredentials{
+				AccessKey: "Your Access Key",
+				SecretKey: "Your Secret Key",
+				Channel:   "ALIYUN/OtherChannel",
+			},
+		},
+		Model:         rocketmq.Clustering,
+		ConsumerModel: rocketmq.CoCurrently,
+	}
+	consumeWithPush(pConfig)
+}
 func consumeWithPush(config *rocketmq.PushConsumerConfig) {
 
 	consumer, err := rocketmq.NewPushConsumer(config)
@@ -32,10 +49,12 @@
 	}
 
 	ch := make(chan interface{})
-	var count = (int64)(*amount)
+	var count = (int64)(1000000)
+	// ********************************************
 	// MUST subscribe topic before consumer started.
-	consumer.Subscribe(*topic, "*", func(msg *rocketmq.MessageExt) rocketmq.ConsumeStatus {
-		fmt.Printf("A message received: \"%s\" \n", msg.Body)
+	// *********************************************
+	consumer.Subscribe("YourTopicXXXXXXXX", "*", func(msg *rocketmq.MessageExt) rocketmq.ConsumeStatus {
+		fmt.Printf("A message received, MessageID:%s, Body:%s \n", msg.MessageID, msg.Body)
 		if atomic.AddInt64(&count, -1) <= 0 {
 			ch <- "quit"
 		}
diff --git a/demos/transaction_producer.go b/examples/transaction_producer.go
similarity index 100%
rename from demos/transaction_producer.go
rename to examples/transaction_producer.go
