diff --git a/agent/pom.xml b/agent/pom.xml
index af9d76c..86ac5e0 100755
--- a/agent/pom.xml
+++ b/agent/pom.xml
@@ -3,9 +3,9 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
 
-  <groupId>com.alibaba</groupId>
-  <artifactId>testable-agent</artifactId>
-  <version>0.0.2-SNAPSHOT</version>
+  <groupId>com.alibaba.testable</groupId>
+  <artifactId>agent</artifactId>
+  <version>0.0.3-SNAPSHOT</version>
   <packaging>jar</packaging>
 
   <properties>
@@ -27,7 +27,7 @@
   </dependencies>
 
   <build>
-    <finalName>${artifactId}</finalName>
+    <finalName>testable-agent</finalName>
     <plugins>
       <plugin>
         <artifactId>maven-jar-plugin</artifactId>
diff --git a/core/pom.xml b/core/pom.xml
index 18f791b..3e1dd14 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -6,9 +6,9 @@
 
     <name>Testable</name>
     <description>Unit test enhancement toolkit</description>
-    <groupId>com.alibaba</groupId>
-    <artifactId>testable-core</artifactId>
-    <version>0.0.2-SNAPSHOT</version>
+    <groupId>com.alibaba.testable</groupId>
+    <artifactId>core</artifactId>
+    <version>0.0.3-SNAPSHOT</version>
 
     <properties>
         <plugin.compiler.version>3.8.1</plugin.compiler.version>
diff --git a/core/src/main/java/com/alibaba/testable/processor/EnableTestableInjectProcessor.java b/core/src/main/java/com/alibaba/testable/processor/EnableTestableInjectProcessor.java
deleted file mode 100644
index 841934b..0000000
--- a/core/src/main/java/com/alibaba/testable/processor/EnableTestableInjectProcessor.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.alibaba.testable.processor;
-
-import com.alibaba.testable.annotation.EnableTestableInject;
-import com.alibaba.testable.translator.EnableTestableInjectTranslator;
-import com.alibaba.testable.translator.MethodRecordTranslator;
-import com.sun.tools.javac.code.Symbol;
-import com.sun.tools.javac.tree.JCTree;
-
-import javax.annotation.processing.RoundEnvironment;
-import javax.annotation.processing.SupportedAnnotationTypes;
-import javax.annotation.processing.SupportedSourceVersion;
-import javax.lang.model.SourceVersion;
-import javax.lang.model.element.Element;
-import javax.lang.model.element.TypeElement;
-import java.util.Set;
-
-/**
- * @author flin
- */
-@SupportedAnnotationTypes("com.alibaba.testable.annotation.EnableTestableInject")
-@SupportedSourceVersion(SourceVersion.RELEASE_7)
-public class EnableTestableInjectProcessor extends BaseProcessor {
-
-    @Override
-    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
-        Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(EnableTestableInject.class);
-        for (Element element : elements) {
-            if (element.getKind().isClass()) {
-                processClassElement((Symbol.ClassSymbol)element);
-            }
-        }
-        return true;
-    }
-
-    private void processClassElement(Symbol.ClassSymbol clazz) {
-        JCTree tree = cx.trees.getTree(clazz);
-        MethodRecordTranslator methodRecordTranslator = new MethodRecordTranslator();
-        tree.accept(methodRecordTranslator);
-        tree.accept(new EnableTestableInjectTranslator(cx, methodRecordTranslator.getMethods()));
-    }
-
-}
diff --git a/core/src/main/java/com/alibaba/testable/translator/EnableTestableInjectTranslator.java b/core/src/main/java/com/alibaba/testable/translator/EnableTestableInjectTranslator.java
deleted file mode 100644
index 657598f..0000000
--- a/core/src/main/java/com/alibaba/testable/translator/EnableTestableInjectTranslator.java
+++ /dev/null
@@ -1,167 +0,0 @@
-package com.alibaba.testable.translator;
-
-import com.alibaba.testable.model.TestableContext;
-import com.alibaba.testable.util.ConstPool;
-import com.sun.tools.javac.tree.JCTree.*;
-import com.sun.tools.javac.util.List;
-import com.sun.tools.javac.util.ListBuffer;
-import com.sun.tools.javac.util.Name;
-
-/**
- * Travel AST
- *
- * @author flin
- */
-public class EnableTestableInjectTranslator extends BaseTranslator {
-
-    private final TestableContext cx;
-    private List<JCMethodDecl> methods;
-
-    public EnableTestableInjectTranslator(TestableContext cx, List<JCMethodDecl> methods) {
-        this.cx = cx;
-        this.methods = methods;
-    }
-
-    /**
-     * new Demo() -> n.e.w(Demo.class)
-     * member() -> n.e.f(this, "member")
-     */
-    @Override
-    public void visitExec(JCExpressionStatement jcExpressionStatement) {
-        jcExpressionStatement.expr = checkAndExchange(jcExpressionStatement.expr);
-        super.visitExec(jcExpressionStatement);
-    }
-
-    /**
-     * return new Demo() -> return n.e.w(Demo.class)
-     * return member() -> return n.e.f(this, "member")
-     */
-    @Override
-    public void visitReturn(JCReturn jcReturn) {
-        jcReturn.expr = checkAndExchange(jcReturn.expr);
-        super.visitReturn(jcReturn);
-    }
-
-    /**
-     * Demo d = new Demo() -> Demo d = n.e.w(Demo.class)
-     * Demo d = member() -> Demo d = n.e.f(this, "member")
-     */
-    @Override
-    public void visitVarDef(JCVariableDecl jcVariableDecl) {
-        jcVariableDecl.init = checkAndExchange(jcVariableDecl.init);
-        super.visitVarDef(jcVariableDecl);
-    }
-
-    /**
-     * new Demo().call() -> n.e.w(Demo.class).call()
-     * member().call() -> n.e.f(this, "member").call()
-     */
-    @Override
-    public void visitSelect(JCFieldAccess jcFieldAccess) {
-        jcFieldAccess.selected = checkAndExchange(jcFieldAccess.selected);
-        super.visitSelect(jcFieldAccess);
-    }
-
-    /**
-     * member() + new Demo() -> n.e.f(this, "member") + n.e.w(Demo.class)
-     */
-    @Override
-    public void visitBinary(JCBinary jcBinary) {
-        jcBinary.lhs = checkAndExchange(jcBinary.lhs);
-        jcBinary.rhs = checkAndExchange(jcBinary.rhs);
-        super.visitBinary(jcBinary);
-    }
-
-    /**
-     * For member method invocation break point
-     * call(new Demo()) -> call(n.e.w(Demo.class))
-     */
-    @Override
-    public void visitApply(JCMethodInvocation tree) {
-        tree.args = checkAndExchange(tree.args);
-        super.visitApply(tree);
-    }
-
-    /**
-     * For new operation break point
-     */
-    @Override
-    public void visitNewClass(JCNewClass jcNewClass) {
-        super.visitNewClass(jcNewClass);
-    }
-
-    /**
-     * For new operation break point
-     */
-    @Override
-    public void visitNewArray(JCNewArray jcNewArray) {
-        super.visitNewArray(jcNewArray);
-    }
-
-    @Override
-    protected JCExpression checkAndExchange(JCExpression expr) {
-        if (isNewOperation(expr)) {
-            JCNewClass newClassExpr = (JCNewClass)expr;
-            Name className = ((JCIdent)newClassExpr.clazz).name;
-            try {
-                return getGlobalNewInvocation(newClassExpr, className);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        } else if (isMemberMethodInvocation(expr)) {
-            Name methodName = ((JCIdent)((JCMethodInvocation)expr).meth).name;
-            List<JCExpression> args = ((JCMethodInvocation)expr).args;
-            return getGlobalMemberInvocation(methodName, args);
-        }
-        return expr;
-    }
-
-    private boolean isMemberMethodInvocation(JCExpression expr) {
-        return expr != null && expr.getClass().equals(JCMethodInvocation.class) &&
-            ((JCMethodInvocation)expr).meth.getClass().equals(JCIdent.class);
-    }
-
-    private boolean isNewOperation(JCExpression expr) {
-        return expr != null && expr.getClass().equals(JCNewClass.class);
-    }
-
-    private JCExpression getGlobalNewInvocation(JCNewClass newClassExpr, Name className) {
-        JCFieldAccess snClass = cx.treeMaker.Select(cx.treeMaker.Ident(cx.names.fromString(ConstPool.NE_PKG)),
-            cx.names.fromString(ConstPool.NE_CLS));
-        JCFieldAccess snMethod = cx.treeMaker.Select(snClass, cx.names.fromString(ConstPool.NE_NEW));
-        JCExpression classType = cx.treeMaker.Select(cx.treeMaker.Ident(className),
-            cx.names.fromString(ConstPool.TYPE_TO_CLASS));
-        ListBuffer<JCExpression> args = ListBuffer.of(classType);
-        args.addAll(newClassExpr.args);
-        return cx.treeMaker.Apply(List.<JCExpression>nil(), snMethod, args.toList());
-    }
-
-    private JCExpression getGlobalMemberInvocation(Name methodName, List<JCExpression> param) {
-        JCFieldAccess snClass = cx.treeMaker.Select(cx.treeMaker.Ident(cx.names.fromString(ConstPool.NE_PKG)),
-            cx.names.fromString(ConstPool.NE_CLS));
-        JCFieldAccess snMethod = cx.treeMaker.Select(snClass, cx.names.fromString(ConstPool.NE_FUN));
-        ListBuffer<JCExpression> args = new ListBuffer<>();
-        args.add(cx.treeMaker.Ident(cx.names.fromString(ConstPool.REF_THIS)));
-        args.add(cx.treeMaker.Literal(methodName.toString()));
-        args.addAll(param);
-        JCMethodInvocation apply = cx.treeMaker.Apply(List.<JCExpression>nil(), snMethod, args.toList());
-        for (JCMethodDecl m : methods) {
-            if (m.restype != null && !m.restype.toString().equals(ConstPool.VOID) &&
-                m.name.equals(methodName) && paramEquals(m.params, param)) {
-                JCTypeCast cast = cx.treeMaker.TypeCast(m.restype, apply);
-                return cx.treeMaker.Parens(cast);
-            }
-        }
-        return apply;
-    }
-
-    private boolean paramEquals(List<JCVariableDecl> p1, List<JCExpression> p2) {
-        if (p1.length() != p2.length()) {
-            return false;
-        }
-        for (int i = 0; i < p1.length(); i++) {
-            // TODO: Compare parameters type
-        }
-        return true;
-    }
-}
diff --git a/core/src/main/java/com/alibaba/testable/translator/MethodRecordTranslator.java b/core/src/main/java/com/alibaba/testable/translator/MethodRecordTranslator.java
deleted file mode 100644
index 98a08b3..0000000
--- a/core/src/main/java/com/alibaba/testable/translator/MethodRecordTranslator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.alibaba.testable.translator;
-
-import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
-import com.sun.tools.javac.tree.TreeTranslator;
-import com.sun.tools.javac.util.List;
-
-/**
- * Travel AST
- *
- * @author flin
- */
-public class MethodRecordTranslator extends TreeTranslator {
-
-    /**
-     * Member methods
-     */
-    private List<JCMethodDecl> methods = List.nil();
-
-    public List<JCMethodDecl> getMethods() {
-        return methods;
-    }
-
-    /**
-     * Record all methods
-     */
-    @Override
-    public void visitMethodDef(JCMethodDecl jcMethodDecl) {
-        super.visitMethodDef(jcMethodDecl);
-        methods = methods.append(jcMethodDecl);
-    }
-
-}
diff --git a/core/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
index 72eb2fe..5f11897 100644
--- a/core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
+++ b/core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
@@ -1,2 +1 @@
 com.alibaba.testable.processor.EnableTestableProcessor
-com.alibaba.testable.processor.EnableTestableInjectProcessor