diff --git a/README.md b/README.md
index 22936b4..ec2ec74 100644
--- a/README.md
+++ b/README.md
@@ -622,3 +622,18 @@ LT_INIT 参数，重要的有：

 用于内部使用的库也叫convenience libraries(方便库)，如果使用了noinst，那么这个库就被认为是convenience_libraries，会被编译成静态库。
+
+
+
+libname_la_LDFLAGS = -version-info 0:0:0 (current:vevision:age)  (注意，这个是libtool自己的版本管理方法，会根据不同平台转换为平台的版本号)
+计算方法：
+1、新的库版本信息从0:0:0开始，对于已经存在的，从上次的公开版本信息开始；
+2、如果库源码从最有一次更新后已经改变，则verision加1 (c:r:a -> c:r+1:a)
+3、如果在最后一次更新后添加，删除，修改任何可导出的函数或数据，增加current，并将verision置为0；
+4、如果在最后一次更新后添加任何可导出的函数或数据，增加age；
+5、如果在最后一次更新后，任何可导出的函数或数据被移除，则将age置为0。
+注意：计算时，严格从1——5逐步计算，不要跳跃任何一条。当使用这个的时候，回头查看下180页。
+
+
+
+
diff --git a/common/jupcommon.h b/common/jupcommon.h
index 5d6e4a7..8d576d8 100644
--- a/common/jupcommon.h
+++ b/common/jupcommon.h
@@ -1,6 +1,6 @@
 #ifndef JUPCOMMON_H
 #define JUPCOMMON_H

-int print_routine(const char *name);
+int print_routine(const char *salutation, const char *name);

 #endif
diff --git a/common/print.c b/common/print.c
index 1f4a5c9..7d9357a 100644
--- a/common/print.c
+++ b/common/print.c
@@ -11,18 +11,26 @@
 #include <pthread.h>
 #endif

+#if HAVE_ASSERT_H
+#include <assert.h>
+#endif
+
 static void* print_it(void* data) {
-    fprintf(stdout, "Hello from %s!\n", (const char *)data);
+    const char ** strings = (const char **)data;
+    /* assert(strings[0] != NULL); */
+    /* assert(strings[1] != NULL); */
+    fprintf(stdout, "%s from %s!\n", strings[0], strings[1]);
     return NULL;
 }

-int print_routine(const char *name) {
+int print_routine(const char* salutation, const char *name) {
+    const char *strings[] = {salutation, name};
 #if ASYNC_EXEC
     pthread_t tid;
-    pthread_create(&tid, 0, print_it, (void*)name);
+    pthread_create(&tid, 0, print_it, (void*)strings);
     pthread_join(tid, 0);
 #else
-    print_it((void*)name);
+    print_it((void*)strings);
 #endif
     return 0;
 }
diff --git a/configure.ac b/configure.ac
index ea0006b..597e55e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -60,7 +60,7 @@ if test "x${async_exec}" = xyes; then
     AC_SEARCH_LIBS([pthread_create], [pthread], [have_pthreads=yes])

     # Checks for header files.
-    AC_CHECK_HEADERS([stdlib.h])
+    AC_CHECK_HEADERS([stdlib.h assert.h])

     if test "x${have_pthreads}" = xyes; then
         AC_CHECK_HEADERS([pthread.h], [], [have_pthreads=no])
@@ -107,4 +107,3 @@ Now type 'make @<:@<target>@:>@'
         all             - build all binaries
         install         - install everything
 -------------------------------------------------------"
-
diff --git a/include/libjupiter.h b/include/libjupiter.h
index 4a97f0c..c2c3502 100644
--- a/include/libjupiter.h
+++ b/include/libjupiter.h
@@ -1,6 +1,6 @@
 #ifndef LIBJUPITER_H
 #define LIBJUPITER_H

-int jupiter_print(const char *name);
+int jupiter_print(const char* salutation, const char *name);

 #endif
diff --git a/libjup/jup_print.c b/libjup/jup_print.c
index 2474fe7..c95d7e1 100644
--- a/libjup/jup_print.c
+++ b/libjup/jup_print.c
@@ -1,6 +1,6 @@
 #include <libjupiter.h>
 #include <jupcommon.h>

-int jupiter_print(const char *name) {
-    print_routine(name);
+int jupiter_print(const char* salutation, const char *name) {
+    print_routine(salutation, name);
 }
diff --git a/src/main.c b/src/main.c
index bc225eb..3a07a2c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -8,9 +8,11 @@
 #include <pthread.h>
 #endif

+#define DEFAULT_SALUTATION "Hello"
 #include <libjupiter.h>

 int main(int argc, char *argv[]) {
-    jupiter_print(argv[0]);
+    const char *salutation = DEFAULT_SALUTATION;
+    jupiter_print(salutation, argv[0]);
     return 0;
 }
diff --git a/README.md b/README.md
index ec2ec74..330a0cd 100644
--- a/README.md
+++ b/README.md
@@ -635,5 +635,6 @@ libname_la_LDFLAGS = -version-info 0:0:0 (current:vevision:age)  (注意，这
 注意：计算时，严格从1——5逐步计算，不要跳跃任何一条。当使用这个的时候，回头查看下180页。

+Libtool有个选项 -module，这个选项用在hithere_la_LDFLAGS变量后面，这个选项告诉Libtool，你希望以hithere而不是libhithere去调用这个模块。如果在使用模块时，不需要版本信息，可以使用-avoid-version选项。这样生成的库名字为：libname.so，而不是libname.so.0.0.0，同时也不会生横软链接文件。

diff --git a/configure.ac b/configure.ac
index 597e55e..01690e1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -54,14 +54,18 @@ AC_ARG_ENABLE([async-exec],
 ###

 ######## First check if the user enable a function, then check the headers and libs, as it need!
+
+# Checks for header files.
+AC_CHECK_HEADERS([stdlib.h dlfcn.h])
+
+# Checks for libraries.
+AC_SEARCH_LIBS([dlopen], [dl])
+
 if test "x${async_exec}" = xyes; then
     # Checks for libraries.
     have_pthreads=no
     AC_SEARCH_LIBS([pthread_create], [pthread], [have_pthreads=yes])

-    # Checks for header files.
-    AC_CHECK_HEADERS([stdlib.h assert.h])
-
     if test "x${have_pthreads}" = xyes; then
         AC_CHECK_HEADERS([pthread.h], [], [have_pthreads=no])
     fi
@@ -89,7 +93,8 @@ AC_CONFIG_FILES([Makefile
                  common/Makefile
                  include/Makefile
                  libjup/Makefile
-                 src/Makefile])
+                 src/Makefile
+                 src/modules/hithere/Makefile])
 AC_OUTPUT

 echo \
@@ -98,7 +103,8 @@ ${PACKAGE_NAME} Version ${PACKAGE_VERSION}

 Prefix: '${prefix}'.
 Compiler: '${CC} ${CFLAGS} ${CPPFLAGS}'
-
+Libraries: ${LIBS}
+
 Package features:
     Async Execution: ${async_exec}

diff --git a/src/Makefile.am b/src/Makefile.am
index 227ebd7..847589b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,5 +1,7 @@
+SUBDIRS = modules/hithere
+
 bin_PROGRAMS = jupiter
-jupiter_SOURCES = main.c
+jupiter_SOURCES = main.c module.h
 jupiter_CPPFLAGS = -I$(top_srcdir)/include
 jupiter_LDADD = ../libjup/libjupiter.la

@@ -7,7 +9,7 @@ check_SCRIPTS = greptest.sh
 TESTS = $(check_SCRIPTS)

 greptest.sh:
-	@echo './jupiter | grep "Hello from .*jupiter!"' > greptest.sh
+	@echo './jupiter | grep ".* from .*jupiter!"' > greptest.sh
 	@chmod +x greptest.sh

 CLEANFILES = greptest.sh
diff --git a/src/main.c b/src/main.c
index 3a07a2c..17891bf 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,3 +1,6 @@
+#include <libjupiter.h>
+#include "module.h"
+
 #if HAVE_CONFIG_H
 #include <config.h>
 #endif
@@ -8,11 +11,36 @@
 #include <pthread.h>
 #endif

+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
 #define DEFAULT_SALUTATION "Hello"
-#include <libjupiter.h>

 int main(int argc, char *argv[]) {
     const char *salutation = DEFAULT_SALUTATION;
+
+#if HAVE_DLFCN_H
+    void *module;
+    get_salutation_t *get_salutation_fp = NULL;
+
+    module = dlopen("./module.so", RTLD_NOW);
+    if (module != NULL) {
+        get_salutation_fp = (get_salutation_t *)
+                            dlsym(module, GET_SALUTATION_SYM);
+        if (get_salutation_fp != NULL) {
+            salutation = get_salutation_fp();
+        }
+    }
+#endif
+
     jupiter_print(salutation, argv[0]);
+
+#if HAVE_DLFCN_H
+    if (module != NULL) {
+        dlclose(module);
+    }
+#endif
+
     return 0;
 }