diff --git a/pom.xml b/pom.xml
index b848223..b171be5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,19 +6,54 @@
 
     <groupId>com.baidu.hugegraph</groupId>
     <artifactId>hugegraph-common</artifactId>
-    <version>1.4.6-SNAPSHOT</version>
+    <version>1.4.6</version>
 
-    <distributionManagement>
-        <snapshotRepository>
-            <id>Baidu_Local_Snapshots</id>
-            <url>http://maven.scm.baidu.com:8081/nexus/content/repositories/Baidu_Local_Snapshots</url>
-        </snapshotRepository>
-    </distributionManagement>
+    <name>hugegraph-common</name>
+    <url>https://github.com/hugegraph/hugegraph-common</url>
+    <description>
+        hugegraph-common is a tool module for HugeGraph and its peripheral components.
+        hugegraph-common encapsulates locks, configurations, events, iterators, rest and some
+        numeric or collection util classes to simplify the development of HugeGraph and its components.
+    </description>
+
+    <parent>
+        <groupId>org.sonatype.oss</groupId>
+        <artifactId>oss-parent</artifactId>
+        <version>7</version>
+    </parent>
+
+    <licenses>
+        <license>
+            <name>The Apache Software License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <scm>
+        <url>https://github.com/hugegraph/hugegraph-common</url>
+        <connection>https://github.com/hugegraph/hugegraph-common</connection>
+        <developerConnection>https://github.com/hugegraph/hugegraph-common</developerConnection>
+    </scm>
+
+    <developers>
+        <developer>
+            <name>lizhangmei</name>
+            <email>lizhangmei@baidu.com</email>
+        </developer>
+        <developer>
+            <name>zhoney</name>
+            <email>zhangyi89817@126.com</email>
+        </developer>
+        <developer>
+            <name>liningrui</name>
+            <email>liningrui@vip.qq.com</email>
+        </developer>
+    </developers>
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <top.level.dir>${project.basedir}/..</top.level.dir>
-        <final.name>hugegraph-bin</final.name>
         <compiler.source>1.8</compiler.source>
         <compiler.target>1.8</compiler.target>
         <log4j2.version>2.8.2</log4j2.version>
@@ -81,14 +116,13 @@
         <dependency>
             <groupId>commons-configuration</groupId>
             <artifactId>commons-configuration</artifactId>
-            <version>1.10</version>
+            <version>${commons.configuration.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-configuration2</artifactId>
             <version>${commons.configuration2.version}</version>
         </dependency>
-
         <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
@@ -133,7 +167,6 @@
             <artifactId>jersey-media-json-jackson</artifactId>
             <version>${jersey.version}</version>
         </dependency>
-
     </dependencies>
 
     <build>
@@ -154,25 +187,6 @@
             </plugin>
 
             <plugin>
-                <artifactId>maven-clean-plugin</artifactId>
-                <version>3.0.0</version>
-                <configuration>
-                    <filesets>
-                        <fileset>
-                            <directory>${top.level.dir}</directory>
-                            <includes>
-                                <include>*.tar.gz</include>
-                            </includes>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                        <fileset>
-                            <directory>${final.name}</directory>
-                        </fileset>
-                    </filesets>
-                </configuration>
-            </plugin>
-
-            <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
                 <version>2.6</version>
@@ -195,7 +209,47 @@
                     </archive>
                 </configuration>
             </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.2.1</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar-no-fork</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.9.1</version>
+                <executions>
+                    <execution>
+                        <id>attach-javadocs</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-gpg-plugin</artifactId>
+                <version>1.5</version>
+                <executions>
+                    <execution>
+                        <id>sign-artifacts</id>
+                        <phase>verify</phase>
+                        <goals>
+                            <goal>sign</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
-
 </project>
diff --git a/src/main/java/com/baidu/hugegraph/concurrent/KeyLock.java b/src/main/java/com/baidu/hugegraph/concurrent/KeyLock.java
index 1ed31cb..42e1329 100644
--- a/src/main/java/com/baidu/hugegraph/concurrent/KeyLock.java
+++ b/src/main/java/com/baidu/hugegraph/concurrent/KeyLock.java
@@ -99,6 +99,9 @@
     /**
      * Lock two objects with sorted order
      * NOTE: This is to optimize the performance of lockAll(keys)
+     * @param key1  The first object
+     * @param key2  The second object
+     * @return      locks for the two objects
      */
     public List<Lock> lockAll(Object key1, Object key2) {
         Lock lock1 = this.locks.get(key1);
diff --git a/src/main/java/com/baidu/hugegraph/stats/MetricsManager.java b/src/main/java/com/baidu/hugegraph/stats/MetricsManager.java
index e198def..37a67a8 100644
--- a/src/main/java/com/baidu/hugegraph/stats/MetricsManager.java
+++ b/src/main/java/com/baidu/hugegraph/stats/MetricsManager.java
@@ -313,9 +313,9 @@
      *             provided arguments
      */
     public synchronized void addGangliaReporter(
-            String groupOrHost, int port, UDPAddressingMode addressingMode,
-            int ttl, Boolean protocol31, UUID hostUUID, String spoof,
-            Duration reportInterval) throws IOException {
+           String groupOrHost, int port, UDPAddressingMode addressingMode,
+           int ttl, Boolean protocol31, UUID hostUUID, String spoof,
+           Duration reportInterval) throws IOException {
 
         Preconditions.checkNotNull(groupOrHost);
         Preconditions.checkNotNull(addressingMode);
@@ -346,8 +346,7 @@
 
     /**
      * Stop a {@link GangliaReporter} previously created by a call to
-     * {@link #addGangliaReporter(String, int, UDPAddressingMode, int, Boolean,
-     * UUID, String, Duration)}
+     * {@link #addGangliaReporter}
      * and release it for GC. Idempotent between calls to the associated add
      * method. Does nothing before the first call to the associated add method.
      */
diff --git a/src/main/java/com/baidu/hugegraph/util/CollectionUtil.java b/src/main/java/com/baidu/hugegraph/util/CollectionUtil.java
index 558cfb0..9fa7285 100644
--- a/src/main/java/com/baidu/hugegraph/util/CollectionUtil.java
+++ b/src/main/java/com/baidu/hugegraph/util/CollectionUtil.java
@@ -74,7 +74,8 @@
      * @param original original set
      * @param from index of start position
      * @param to index of end position(exclude), but -1 means the last element
-     * @return sub-set of original set [from,to)
+     * @param <T> element type of set
+     * @return sub-set of original set [from, to)
      */
     public static <T> Set<T> subSet(Set<T> original, int from, int to) {
         List<T> list = new ArrayList<>(original);
diff --git a/src/main/java/com/baidu/hugegraph/util/LongEncoding.java b/src/main/java/com/baidu/hugegraph/util/LongEncoding.java
index 09e822d..de05d7e 100644
--- a/src/main/java/com/baidu/hugegraph/util/LongEncoding.java
+++ b/src/main/java/com/baidu/hugegraph/util/LongEncoding.java
@@ -21,8 +21,7 @@
 
 /**
  * Utility class for encoding longs in strings based on:
- * {@linktourl http://stackoverflow.com/questions/2938482/encode-decode-a-long-to-a-string-using-a-fixed-set-of-letters-in-java}
- *
+ * @see <a href="http://stackoverflow.com/questions/2938482/encode-decode-a-long-to-a-string-using-a-fixed-set-of-letters-in-java">encode decode long to string</a>
  */
 public final class LongEncoding {
 
diff --git a/src/main/java/com/baidu/hugegraph/util/NumericUtil.java b/src/main/java/com/baidu/hugegraph/util/NumericUtil.java
index 6677870..d9693fe 100644
--- a/src/main/java/com/baidu/hugegraph/util/NumericUtil.java
+++ b/src/main/java/com/baidu/hugegraph/util/NumericUtil.java
@@ -41,7 +41,8 @@
      * precision is not reduced, but the value can easily used as a long. The
      * sort order (including {@link Double#NaN}) is defined by
      * {@link Double#compareTo}; {@code NaN} is greater than positive infinity.
-     *
+     * @param val input double value
+     * @return output sortable long value
      * @see #sortableLongToDouble
      */
     public static long doubleToSortableLong(double val) {
@@ -50,7 +51,8 @@
 
     /**
      * Converts a sortable <code>long</code> back to a <code>double</code>.
-     *
+     * @param val input double value
+     * @return output sortable long value
      * @see #doubleToSortableLong
      */
     public static double sortableLongToDouble(long val) {
@@ -65,7 +67,8 @@
      * is not reduced, but the value can easily used as an int. The sort order
      * (including {@link Float#NaN}) is defined by {@link Float#compareTo};
      * {@code NaN} is greater than positive infinity.
-     *
+     * @param val input float value
+     * @return output sortable int value
      * @see #sortableIntToFloat
      */
     public static int floatToSortableInt(float val) {
@@ -74,7 +77,8 @@
 
     /**
      * Converts a sortable <code>int</code> back to a <code>float</code>.
-     *
+     * @param val input int value
+     * @return output sortable float value
      * @see #floatToSortableInt
      */
     public static float sortableIntToFloat(int val) {
@@ -84,6 +88,8 @@
     /**
      * Converts IEEE 754 representation of a double to sortable order (or back
      * to the original)
+     * @param bits The long format of a double value
+     * @return The sortable long value
      */
     public static long sortableDoubleBits(long bits) {
         return bits ^ (bits >> 63) & 0x7fffffffffffffffL;
@@ -92,13 +98,13 @@
     /**
      * Converts IEEE 754 representation of a float to sortable order (or back to
      * the original)
+     * @param bits The int format of an float value
+     * @return The sortable int value
      */
     public static int sortableFloatBits(int bits) {
         return bits ^ (bits >> 31) & 0x7fffffff;
     }
 
-    /*************************************************************************/
-
     public static byte[] numberToSortableBytes(Number number) {
         if (number instanceof Long) {
             return longToBytes(number.longValue());
@@ -137,8 +143,6 @@
         return null;
     }
 
-    /*************************************************************************/
-
     public static byte[] longToBytes(long value) {
         ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
         buffer.putLong(value);
@@ -161,8 +165,6 @@
         return ByteBuffer.wrap(bytes).getInt();
     }
 
-    /*************************************************************************/
-
     public static boolean isNumber(Object value) {
         if (value == null) {
             return false;
@@ -174,8 +176,6 @@
         return Number.class.isAssignableFrom(clazz);
     }
 
-    /*************************************************************************/
-
     public static Object convertToNumber(Object value) {
         if (!isNumber(value) && value != null) {
             if (value instanceof Date) {
@@ -193,6 +193,10 @@
      * or it can be converted to a BigDecimal
      * @param first     might be number or string
      * @param second    must be number
+     * @return          the value 0 if first is numerically equal to second;
+     *                  a value less than 0 if first is numerically less than
+     *                  second; and a value greater than 0 if first is
+     *                  numerically greater than second.
      */
     @SuppressWarnings("unchecked")
     public static int compareNumber(Object first, Number second) {
diff --git a/src/main/java/com/baidu/hugegraph/util/VersionUtil.java b/src/main/java/com/baidu/hugegraph/util/VersionUtil.java
index 494ce4f..a6fd43f 100644
--- a/src/main/java/com/baidu/hugegraph/util/VersionUtil.java
+++ b/src/main/java/com/baidu/hugegraph/util/VersionUtil.java
@@ -27,7 +27,11 @@
 public final class VersionUtil {
 
     /**
-     * Compare if a version is inside a range: begin <= version < end
+     * Compare if a version is inside a range [begin, end)
+     * @param version   The version to be compared
+     * @param begin     The lower bound of the range
+     * @param end       The upper bound of the range
+     * @return          true if belong to the range, otherwise false
      */
     public static boolean match(Version version, String begin, String end) {
         E.checkArgumentNotNull(version, "The version to match is null");
@@ -38,6 +42,10 @@
     /**
      * Check whether a component version is matched expected range,
      * throw an exception if it's not matched.
+     * @param version   The version to be checked
+     * @param begin     The lower bound of the range
+     * @param end       The upper bound of the range
+     * @param component The owner component of version
      */
     public static void check(Version version, String begin, String end,
                              String component) {
@@ -48,6 +56,8 @@
 
     /**
      * Get implementation version from manifest in jar
+     * @param clazz The class to be load from jar package
+     * @return      The implementation version
      */
     public static String getImplementationVersion(Class<?> clazz) {
         /*
