subButtons) {
       this.subButtons = subButtons;
     }
-    
+
+    @Override
+    public String toString() {
+      return "WxMenuButton{" +
+          "type='" + type + '\'' +
+          ", name='" + name + '\'' +
+          ", key='" + key + '\'' +
+          ", url='" + url + '\'' +
+          ", subButtons=" + subButtons +
+          '}';
+    }
   }
 
 }
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index 779ef63cd..c51958703 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -6,7 +6,7 @@
     
         me.chanjar
         weixin-java-parent
-        1.1.2
+        1.1.3-SNAPSHOT
     
 
     weixin-java-cp
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java
index 164a08746..70d59046d 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java
@@ -155,34 +155,87 @@ public interface WxCpService {
    * 
    * 自定义菜单创建接口
    * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单创建接口
+   *
+   * 注意: 这个方法使用WxCpConfigStorage里的agentId
    * 
+   * @see #menuCreate(String, me.chanjar.weixin.common.bean.WxMenu)
    *
    * @param menu
    * @throws WxErrorException
    */
   void menuCreate(WxMenu menu) throws WxErrorException;
 
+  /**
+   * 
+   * 自定义菜单创建接口
+   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单创建接口
+   *
+   * 注意: 这个方法不使用WxCpConfigStorage里的agentId,需要开发人员自己给出
+   * 
+   * @see #menuCreate(me.chanjar.weixin.common.bean.WxMenu)
+   *
+   * @param agentId 企业号应用的id
+   * @param menu
+   * @throws WxErrorException
+   */
+  void menuCreate(String agentId, WxMenu menu) throws WxErrorException;
+
   /**
    * 
    * 自定义菜单删除接口
    * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单删除接口
+   *
+   * 注意: 这个方法使用WxCpConfigStorage里的agentId
    * 
+   * @see #menuDelete(String)
    *
    * @throws WxErrorException
    */
   void menuDelete() throws WxErrorException;
 
+  /**
+   * 
+   * 自定义菜单删除接口
+   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单删除接口
+   *
+   * 注意: 这个方法不使用WxCpConfigStorage里的agentId,需要开发人员自己给出
+   * 
+   * @see #menuDelete()
+   *
+   * @param agentId 企业号应用的id
+   * @throws WxErrorException
+   */
+  void menuDelete(String agentId) throws WxErrorException;
+
   /**
    * 
    * 自定义菜单查询接口
    * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单查询接口
+   *
+   * 注意: 这个方法使用WxCpConfigStorage里的agentId
    * 
+   * @see #menuGet(String)
    *
    * @return
    * @throws WxErrorException
    */
   WxMenu menuGet() throws WxErrorException;
 
+  /**
+   * 
+   * 自定义菜单查询接口
+   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单查询接口
+   *
+   * 注意: 这个方法不使用WxCpConfigStorage里的agentId,需要开发人员自己给出
+   * 
+   * @see #menuGet()
+   *
+   * @param agentId 企业号应用的id
+   * @return
+   * @throws WxErrorException
+   */
+  WxMenu menuGet(String agentId) throws WxErrorException;
+
   /**
    * 
    * 部门管理接口 - 创建部门
@@ -364,12 +417,33 @@ public interface WxCpService {
    * 用oauth2获取用户信息
    * http://qydev.weixin.qq.com/wiki/index.php?title=根据code获取成员信息
    * 因为企业号oauth2.0必须在应用设置里设置通过ICP备案的可信域名,所以无法测试,因此这个方法很可能是坏的。
+   *
+   * 注意: 这个方法使用WxCpConfigStorage里的agentId
    * 
+   * @see #oauth2getUserInfo(String, String)
+   *
    * @param code
    * @return [userid, deviceid]
    */
   String[] oauth2getUserInfo(String code) throws WxErrorException;
 
+  /**
+   * 
+   * 用oauth2获取用户信息
+   * http://qydev.weixin.qq.com/wiki/index.php?title=根据code获取成员信息
+   * 因为企业号oauth2.0必须在应用设置里设置通过ICP备案的可信域名,所以无法测试,因此这个方法很可能是坏的。
+   *
+   * 注意: 这个方法不使用WxCpConfigStorage里的agentId,需要开发人员自己给出
+   * 
+   * @see #oauth2getUserInfo(String)
+   *
+   * @param agentId 企业号应用的id
+   * @param code
+   * @return [userid, deviceid]
+   */
+  String[] oauth2getUserInfo(String agentId, String code) throws WxErrorException;
+
+
   /**
    * 移除标签成员
    *
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
index c5b5e7929..1c2e16e71 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
@@ -180,18 +180,36 @@ public class WxCpServiceImpl implements WxCpService {
     post(url, message.toJson());
   }
 
+  @Override
   public void menuCreate(WxMenu menu) throws WxErrorException {
+    menuCreate(wxCpConfigStorage.getAgentId(), menu);
+  }
+
+  @Override
+  public void menuCreate(String agentId, WxMenu menu) throws WxErrorException {
     String url = "https://qyapi.weixin.qq.com/cgi-bin/menu/create?agentid=" + wxCpConfigStorage.getAgentId();
     post(url, menu.toJson());
   }
 
+  @Override
   public void menuDelete() throws WxErrorException {
-    String url = "https://qyapi.weixin.qq.com/cgi-bin/menu/delete?agentid=" + wxCpConfigStorage.getAgentId();
+    menuDelete(wxCpConfigStorage.getAgentId());
+  }
+
+  @Override
+  public void menuDelete(String agentId) throws WxErrorException {
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/menu/delete?agentid=" + agentId;
     get(url, null);
   }
 
+  @Override
   public WxMenu menuGet() throws WxErrorException {
-    String url = "https://qyapi.weixin.qq.com/cgi-bin/menu/get?agentid=" + wxCpConfigStorage.getAgentId();
+    return menuGet(wxCpConfigStorage.getAgentId());
+  }
+
+  @Override
+  public WxMenu menuGet(String agentId) throws WxErrorException {
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/menu/get?agentid=" + agentId;
     try {
       String resultContent = get(url, null);
       return WxMenu.fromJson(resultContent);
@@ -427,9 +445,14 @@ public class WxCpServiceImpl implements WxCpService {
 
   @Override
   public String[] oauth2getUserInfo(String code) throws WxErrorException {
+    return oauth2getUserInfo(code, wxCpConfigStorage.getAgentId());
+  }
+
+  @Override
+  public String[] oauth2getUserInfo(String agentId, String code) throws WxErrorException {
     String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?"
-                    + "code=" + code
-                    + "&agendid=" + wxCpConfigStorage.getAgentId();
+        + "code=" + code
+        + "&agendid=" + agentId;
     String responseText = get(url, null);
     JsonElement je = Streams.parse(new JsonReader(new StringReader(responseText)));
     JsonObject jo = je.getAsJsonObject();
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index c4ed287e5..a102ff3eb 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -6,7 +6,7 @@
     
         me.chanjar
         weixin-java-parent
-        1.1.2
+        1.1.3-SNAPSHOT
     
     weixin-java-mp
     WeiXin Java Tools - MP
diff --git a/weixin-java-mp/src/main/java/TestNonAtomicLongAssignment.java b/weixin-java-mp/src/main/java/TestNonAtomicLongAssignment.java
deleted file mode 100644
index e86d89fe3..000000000
--- a/weixin-java-mp/src/main/java/TestNonAtomicLongAssignment.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * Created by qianjia on 15/1/25.
- */
-public class TestNonAtomicLongAssignment {
-
-  private static final long HI = 1l << 32;
-  private static final long LO = 1l;
-
-  private static final long TEST_NUMBER = HI | LO;
-
-  private static long assignee = 0l;
-
-  public static void main(String[] args) {
-
-    Thread writer = new Thread(new Runnable() {
-      @Override
-      public void run() {
-        while (true) {
-          assignee = TEST_NUMBER;
-        }
-      }
-    });
-    writer.setDaemon(true);
-
-    Thread reader = new Thread(new Runnable() {
-      @Override
-      public void run() {
-        long i = 0;
-        while (true) {
-          i++;
-          long test = assignee;
-          if (test != TEST_NUMBER) {
-            System.out.print(i + " times:" + toBin(test));
-            break;
-          }
-        }
-      }
-    });
-
-    //    Thread worker = new Thread(new Runnable() {
-    //      @Override
-    //      public void run() {
-    //        double d = 89009808877238948224343435452333323113131313133434434341212323232424243434335354232390490189190420928348910913094983.323334401928d;
-    //        while(true) {
-    //          Math.cbrt(d);
-    //          d = d - 1l;
-    //        }
-    //      }
-    //    });
-    //    worker.setDaemon(true);
-    //    worker.start();
-
-    writer.start();
-    reader.start();
-
-  }
-
-  public static String toBin(long n) {
-    StringBuilder sb = new StringBuilder(Long.toBinaryString(n));
-    int padding = 64 - sb.length();
-    while (padding > 0) {
-      sb.insert(0, '0');
-      padding--;
-    }
-    return sb.toString();
-  }
-
-}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMenuAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMenuAPITest.java
index 01acb179a..581c67eef 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMenuAPITest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMenuAPITest.java
@@ -24,9 +24,54 @@ public class WxMpMenuAPITest {
   
   @Test(dataProvider = "menu")
   public void testCreateMenu(WxMenu wxMenu) throws WxErrorException {
+    System.out.println(wxMenu.toJson());
     wxService.menuCreate(wxMenu);
   }
-  
+
+  @Test
+  public void testCreateMenu2() throws WxErrorException {
+    String a = "{\n"
+        + "  \"menu\": {\n"
+        + "    \"button\": [\n"
+        + "      {\n"
+        + "        \"type\": \"click\",\n"
+        + "        \"name\": \"今日歌曲\",\n"
+        + "        \"key\": \"V1001_TODAY_MUSIC\"\n"
+        + "      },\n"
+        + "      {\n"
+        + "        \"type\": \"click\",\n"
+        + "        \"name\": \"歌手简介\",\n"
+        + "        \"key\": \"V1001_TODAY_SINGER\"\n"
+        + "      },\n"
+        + "      {\n"
+        + "        \"name\": \"菜单\",\n"
+        + "        \"sub_button\": [\n"
+        + "          {\n"
+        + "            \"type\": \"view\",\n"
+        + "            \"name\": \"搜索\",\n"
+        + "            \"url\": \"http://www.soso.com/\"\n"
+        + "          },\n"
+        + "          {\n"
+        + "            \"type\": \"view\",\n"
+        + "            \"name\": \"视频\",\n"
+        + "            \"url\": \"http://v.qq.com/\"\n"
+        + "          },\n"
+        + "          {\n"
+        + "            \"type\": \"click\",\n"
+        + "            \"name\": \"赞一下我们\",\n"
+        + "            \"key\": \"V1001_GOOD\"\n"
+        + "          }\n"
+        + "        ]\n"
+        + "      }\n"
+        + "    ]\n"
+        + "  }\n"
+        + "}";
+
+    WxMenu menu = WxMenu.fromJson(a);
+    System.out.println(menu.toJson());
+    wxService.menuCreate(menu);
+  }
+
   @Test(dependsOnMethods = { "testCreateMenu"})
   public void testGetMenu() throws WxErrorException {
     Assert.assertNotNull(wxService.menuGet());