diff --git a/src/hessianDecode.erl b/src/hessianDecode.erl
deleted file mode 100755
index adc06fe..0000000
--- a/src/hessianDecode.erl
+++ /dev/null
@@ -1,347 +0,0 @@
--module(hessianDecode).
-
--include("hessian.hrl").
-
--export([decode/2]).
-%%-export([init/0]).
-
-%%-record(decoding_state,{type_pool = dict:new(), reference_pool = dict:new()}).
--record(decoding_state,{type_pool = dict:new(), reference_pool = dict:new(),obj_define_no=0}).
-%---------------------------------------------------------------------------
-% Decoding
-%---------------------------------------------------------------------------
-decode_str(Rest, 0, R) ->
-	{list_to_binary(xmerl_ucs:to_utf8(lists:reverse(R))), Rest}; 
-decode_str(<<C/utf8, Rest/binary>>, N, R) ->
-	decode_str(Rest, N-1, [C|R]).
-
-% Call
-decode(<<$H,?M,?m,$C,Bin/binary>>, State) ->
-	{Rest, Function, _State} = decode(Bin,State),
-	{Rest2, Count, __State} = decode(Rest,_State),
-	case decode(list, Rest2,Count,[], __State) of
-		{error, Encoded} ->
-			{error, Encoded};
-		{not_found, Hash} ->
-			{not_found, Hash};    
-		{_Rest, Arguments, _NewState} ->
-			[Function, Arguments]
-	end;
-% Fault
-decode(<<$H,?M,?m,$F,
-		 Rest/binary>>, State) ->
-	{_Rest,#map{dict=Dict},_State} = decode(Rest, State),
-	{ok, Message} = dict:find(<<"message">>, Dict),
-	{error, Message};
-% Reply
-decode(<<$H,?M,?m,$R,Args/binary>>, State) ->
-	case decode(Args,[], State) of
-		{<<>>, Decoded,_State} ->
-			TypeSet = get_type_set(_State),
-			case Decoded of
-				[Value] ->
-					{Value,TypeSet};
-				[H|T] ->
-					{[H|T],TypeSet}
-			end;
-		{error, Encoded} ->
-			{error, Encoded}
-	end;
-% Binaries
-decode(<<16#20,Rest/binary>>, State) -> {Rest, <<>>, State};
-decode(<<Len:8/unsigned,Rest/binary>>, State) when Len =< 16#2f, 16#20 < Len ->
-	_Len = Len - 16#20,
-	<<Bin:_Len/binary,_Rest/binary>> = Rest,
-	{_Rest, Bin, State};
-decode(<<$B,Len:16/unsigned,Bin:Len/binary,Rest/binary>>, State) -> {Rest, Bin, State};
-decode(<<$b,Rest/binary>>,State) -> decode(<<$b,Rest/binary>>, [], State);
-%% Booleans
-decode(<<$T,Rest/binary>>, State) -> {Rest, true, State};
-decode(<<$F,Rest/binary>>, State) -> {Rest, false, State};
-%% Dates
-decode(<<16#4a,Date:64/unsigned,Rest/binary>>, State) ->
-	MegaSecs = Date div ?MegaSeconds,
-	Secs = (Date - MegaSecs * ?MegaSeconds) div ?Seconds,
-	MicroSecs = (Date - MegaSecs * ?MegaSeconds - Secs * ?Seconds) * ?MicroSeconds,
-	{Rest, {MegaSecs, Secs, MicroSecs}, State};
-decode(<<16#4b,Date:32/unsigned,Rest/binary>>, State) ->
-	MegaSecs = (Date * 60000) div ?MegaSeconds,
-	Secs = (Date * 60000 - MegaSecs * ?MegaSeconds) div ?Seconds,
-	{Rest, {MegaSecs, Secs, 0}, State};
-%% Doubles
-decode(<<16#5b,Rest/binary>>, State)-> {Rest, 0.0, State};
-decode(<<16#5c,Rest/binary>>, State)-> {Rest, 1.0, State};
-decode(<<16#5d,Int:8/signed,Rest/binary>>, State)-> {Rest, float(Int), State};
-decode(<<16#5e,Int:16/signed,Rest/binary>>, State)-> {Rest, float(Int), State};
-decode(<<16#5f,Int:32/signed,Rest/binary>>, State)->
-	<<Double:64/float>> = <<Int:32,0,0,0,0>>,
-	{Rest, Double, State};
-decode(<<$D,Double:64/float,Rest/binary>>, State)-> {Rest, Double, State};
-%% Ints
-decode(<<$I,Int:32/signed,Rest/binary>>, State)-> {Rest, Int, State};
-decode(<<Int:8,Rest/binary>>, State) when Int >= 16#80, Int =< 16#bf -> {Rest, Int - 16#90, State};
-decode(<<B2:8,B1:8,B0:8,Rest/binary>>, State) when B2 >= 16#d0, B2 =< 16#d7 -> {Rest, ((B2 - 16#d4) bsl 16) + (B1 bsl 8) + B0, State};
-decode(<<B1:8,B0:8,Rest/binary>>, State) when B1 >= 16#c0, B1 =< 16#cf -> {Rest, ((B1 - 16#c8) bsl 8) + B0, State};
-%% Longs
-decode(<<$L,Long:64/signed,Rest/binary>>, State)-> {Rest, Long, State};
-decode(<<16#59,Long:32/signed,Rest/binary>>, State) -> {Rest, Long, State};
-decode(<<Long:8,Rest/binary>>, State) when Long >= 16#d8, Long =< 16#ef -> {Rest, Long - 16#e0, State};
-decode(<<B2:8,B1:8,B0:8,Rest/binary>>, State) when B2 >= 16#38, B2 =< 16#3f -> {Rest, ((B2 - 16#3c) bsl 16) + (B1 bsl 8) + B0, State};
-decode(<<B1:8,B0:8,Rest/binary>>, State) when B1 >= 16#f0, B1 =< 16#ff -> {Rest, ((B1 - 16#f8) bsl 8) + B0, State};
-%% Strings
-decode(<<0,Rest/binary>>, State) -> {Rest, <<>>, State};
-decode(<<Len:8,Rest/binary>>, State) when Len < 32 -> 
-	{String, NewRest} = decode_str(Rest, Len, []),
-	{NewRest, String, State};
-decode(<<B1:8,B0:8,Rest/binary>>, State) when B1 =< 16#33,B1 >= 16#30 -> 
-	Len = ((B1 - 16#30) bsl 8) + B0,
-	{String, NewRest} = decode_str(Rest, Len, []),
-	{NewRest, String, State};
-decode(<<$S,Len:16/unsigned,Rest/binary>>, State) -> 
-	{String, NewRest} = decode_str(Rest, Len, []),
-	{NewRest, String, State};
-decode(<<$R,Rest/binary>>, State) -> decode(<<$R,Rest/binary>>,[], State);
-%% Nulls
-decode(<<$N,Rest/binary>>, State) -> {Rest, undefined, State};
-%% References
-decode(<<$Q,Bin/binary>>, State)-> 
-	{Rest, IntRef, _State} = decode(Bin,State),
-	{Rest, {ref, IntRef}, _State};
-%% Maps
-decode(<<$M,Map/binary>>, State) -> 
-	{Rest,Type,_State} = decode(Map, State),
-	{_Refnum,__State} = visit(#type_def{foreign_type = map},_State),
-	{_Rest,Dict, NewState} = decode(map, Rest, dict:new(), __State),
-	{_Rest,#map{refNo=_Refnum,type=Type,dict=Dict},NewState};
-decode(<<$H,Map/binary>>, State) -> 
-	{_Refnum,_State} = visit(#type_def{foreign_type = map},State),
-	{_Rest,Dict, NewState} = decode(map, Map, dict:new(), _State),
-	{_Rest,#map{refNo=_Refnum,dict=Dict},NewState};
-%% Lists
-% 'V' type int value*   # fixed-length list
-decode(<<$V,Bin/binary>>, State) -> 
-	{Rest1,_Type,_State1} = decode(Bin,State),
-	{_Refnum,__State} = visit(#type_def{foreign_type = list},_State1),
-	{Rest2,Len,_State2} = decode(Rest1,__State),
-	{NewRest,List,NewState} = decode(list, Rest2, Len, [], _State2),
-	{NewRest,#list{refNo=_Refnum,len=Len,type=_Type,values=List},NewState};
-% 'X' int value*        # fixed-length untyped list
-decode(<<$X,Bin/binary>>, State) ->
-	{Rest1,Len,_State} = decode(Bin,State),
-	{_Refnum,__State} = visit(#type_def{foreign_type = list},_State),
-	{NewRest,List,NewState} = decode(list, Rest1, Len, [], __State),
-	{NewRest,#list{refNo=_Refnum,len=Len,values=List},NewState};
-% [x70-77] type value*  # fixed-length typed list
-decode(<<H:5,Len:3,Bin/binary>>, State) when H == 14 ->
-	{Rest1,_Type,_State} = decode(Bin,State),
-	{_Refnum,__State} = visit(#type_def{foreign_type = list},_State),
-	{NewRest,List,NewState} = decode(list, Rest1, Len, [], __State),
-	{NewRest,#list{refNo=_Refnum,len=Len,type=_Type,values=List},NewState};
-% [x78-7f] value*       # fixed-length untyped list
-decode(<<H:5,Len:3,Bin/binary>>, State) when H == 15 ->
-	{_Refnum,_State} = visit(#type_def{foreign_type = list},State),
-	{NewRest,List,NewState} = decode(list, Bin, Len, [], _State),
-	{NewRest,#list{refNo=_Refnum,len=Len,values=List},NewState};
-% 'U' type value* 'Z'   # variable-length list
-decode(<<$U,Bin/binary>>, State) ->
-	{Rest1,_Type,_State} = decode(Bin,State),
-	{_Refnum,__State} = visit(#type_def{foreign_type = list},_State),
-	{NewRest,List,NewState} = decode(list, Rest1, [], __State),
-	{NewRest,#list{refNo=_Refnum,type=_Type,values=List},NewState};
-% 'W' value* 'Z'        # variable-length untyped list
-decode(<<$W,Bin/binary>>, State) ->
-	{_Refnum,_State} = visit(#type_def{foreign_type = list},State),
-	{NewRest,List,NewState} = decode(list, Bin, [], _State),
-	{NewRest,#list{refNo=_Refnum,values=List},NewState};
-decode(<<$C,Bin/binary>>, State0) ->
-	{Rest1,Type,State1} = decode(Bin,State0), %% Rest1 剩余字节码, Type 对象类型
-	{Rest, TypeDef, State} = decode(type_definition,Type,Rest1,State1),
-	NewState = type_decoding:hash_store(TypeDef,State),
-	decode(Rest,NewState);
-decode(<<$O,Bin/binary>>, State) ->
-	{Rest,Ref,_State} = decode(Bin, State),
-	case type_decoding:hash_lookup(Ref, _State) of
-		{not_found, Ref} ->
-			{Rest, {not_found, Ref}, _State};
-		ForeignView ->
-			#type_def{fieldnames = ForeignFieldNames} = ForeignView,
-			{_Refnum,__State} = type_decoding:visit(ForeignView,_State),
-			Count = count_fields(ForeignView),
-			case decode(field, Rest, Count,[], __State) of
-				{not_found,Hash} ->
-					{not_found,Hash};
-				{_Rest,FieldValues, NewState} ->
-					Object = type_decoding:project_native_view(ForeignFieldNames,FieldValues,ForeignView),
-%%					{_Rest, #object{refNo=_Refnum, typeRef=Ref,values=Object}, NewState}
-					{_Rest, Object, NewState}
-			end
-	end;      
-decode(<<H:4,Ref:4,Rest/binary>>, _State) when H == 6 ->
-	case type_decoding:hash_lookup(Ref, _State) of
-		{not_found, Ref} ->
-			{Rest, {not_found, Ref}, _State};
-		ForeignView ->
-			#type_def{fieldnames = ForeignFieldNames} = ForeignView,
-			{_Refnum,__State} = visit(ForeignView,_State),
-			Count = count_fields(ForeignView),
-			case decode(field, Rest, Count,[], __State) of
-				{not_found,Hash} ->
-					{not_found,Hash};
-				{_Rest,FieldValues, NewState} ->
-					Object = type_decoding:project_native_view(ForeignFieldNames,FieldValues,ForeignView),
-					%%{_Rest, #object{refNo =_Refnum, typeRef=Ref,values=Object}, NewState}
-					{_Rest, Object, NewState}
-			end
-	end;
-%% Anything else
-decode(<<Unexpected/binary>>, State) ->
-	{error, hessianEncode:encode(fault, <<"ProtocolException">>, unexpected_byte_sequence, Unexpected, State) }.
-decode(<<$b,Len:16/unsigned,Bin:Len/binary,$b,Rest/binary>>, Acc, State) ->
-	decode(<<$b,Rest/binary>>,Acc ++ [Bin], State);
-decode(<<$b,Len:16/unsigned,Bin:Len/binary,$B,Rest/binary>>, Acc, State) ->
-	_Acc = Acc ++ [Bin],
-	{_Rest,_Bin, State} = decode(<<$B,Rest/binary>>, State),
-	{_Rest, list_to_binary(_Acc ++ [_Bin]), State};
-decode(<<$R,Len:16/unsigned,Rest/binary>>,Acc, State) ->
-	{_String, NewRest} = decode_str(Rest, Len, []),
-	<<H:8,_/binary>> = NewRest,
-	case H of 
-		$R -> decode(NewRest,list_to_binary([Acc|[_String]]), State);
-		$S -> {_Rest,_Bin, _State} = decode(NewRest, State),
-			  _Acc2 =[Acc |[_String]],
-			  {_Rest, list_to_binary(_Acc2 ++ [_Bin]), _State}
-	end;
-decode(<<>>, List, State) -> {<<>>, List, State};
-decode(<<$Z>>, List, State) -> {<<>>, List, State};
-decode(Args, List, State) ->
-	case decode(Args,State) of
-		{Rest,{ref, Ref}, _State} ->
-			decode(Rest, List ++ [{ref, Ref}] , _State);
-		{Rest, [H|T], _State} ->
-			decode(Rest, List ++ [H|T], _State);
-		{Rest, Result, _State} ->
-			decode(Rest, List ++ [Result], _State);
-		{error, Encoded} ->
-			{error, Encoded}
-	end.
-decode(map, <<$Z>>, Dict, State) -> {<<>>,Dict, State};
-decode(map, <<$Z,Rest/binary>>, Dict, State) -> {Rest,Dict, State};
-decode(map, Bin, Dict, State) ->
-	{_Rest, Key, _State} = decode(Bin, State),
-	case decode(_Rest, _State) of
-		{Rest, {ref, Ref}, __State} ->
-			%Value = lists:nth(Ref + 1, List),
-			Value = Ref,
-			decode(map, Rest, dict:store(Key, {ref, Value}, Dict), __State);
-		{Rest, Value, __State} ->
-			decode(map, Rest, dict:store(Key, Value, Dict), __State)
-	end;
-decode(list, <<>>, List, State) -> {<<>>,lists:reverse(List), State};
-decode(list, <<$Z>>, List, State) -> {<<>>,lists:reverse(List), State};
-decode(list, <<$Z,Rest/binary>>, List, State) -> {Rest, lists:reverse(List), State};
-decode(list, Bin, List, State) ->
-	case decode(Bin, State) of
-		{error, Encoded} ->
-			{error, Encoded};
-		{not_found,Hash} ->
-			{not_found, Hash};    
-		{_Rest, {not_found, Hash}, _State} ->
-			{not_found, Hash};    
-		{Rest, Value, _State} ->
-            decode(list, Rest, [Value|List], _State)
-	end;
-decode(type_definition, ForeignType, Bin, State) ->
-	{Rest,Count, _State} = decode(Bin, State),
-	{NewRest,FieldNames, NewState} = decode(field, Rest, Count, [], _State),
-	%% change 用回之前的 build_foreign_view NewState 不变
-	{TypeDef,NewState2} = type_decoding:build_foreign_view(ForeignType,FieldNames,NewState),
-	{NewRest, TypeDef, NewState2}.
-decode(list, Bin, 0, List, State) -> {Bin, lists:reverse(List), State};
-decode(list, Bin, Len, List, State) ->
-    case decode(Bin, State) of
-        {error, Encoded} ->
-            {error, Encoded};
-        {not_found,Hash} ->
-            {not_found, Hash};    
-        {_Rest, {not_found, Hash}, _State} ->
-            {not_found, Hash};    
-        {Rest, Value, _State} ->
-            decode(list, Rest, Len - 1, [Value|List], _State)
-    end;
-decode(field, Rest, 0, Acc, State) -> {Rest, Acc, State};
-decode(field, <<$Z,Rest/binary>>, _Count, Acc, State) -> {Rest, Acc, State};
-decode(field, Bin, Count, Acc, State) ->
-	{Rest,Field, _State} = decode(Bin, State),
-	case Field of
-		{not_found,Hash} ->
-			{not_found,Hash};
-		_ ->
-			decode(field, Rest, Count - 1, Acc ++ [Field], _State)
-	end.
-
-get_type_set(#decoding_state{type_pool = Pool}) ->
-	case dict:to_list(Pool) of 
-		[] -> [];
-		Data -> [Value || {_Key,Value} <- Data]
-	end.
-
-build_foreign_view(ForeignType,FieldNames,State) ->
-	ForeignView = FieldNames,
-	#decoding_state{type_pool = OldPool} = State,
-	Native = dict:size(OldPool),
-	NewPool = dict:store(Native, 
-						 #type_def{native_type = Native,
-								   foreign_type = ForeignType,
-								   fieldnames = ForeignView}, 
-						 OldPool),
-	{
-	 #type_def{native_type = Native,
-			   foreign_type = ForeignType,
-			   fieldnames = ForeignView},
-	 State#decoding_state{type_pool = NewPool}
-	}.
-
-project_native_view(ForeignView,ForeignData,
-                    #type_def{native_type = _NativeType, foreign_type = _ForeignType, fieldnames = NativeView}) ->
-    AsDict = dict:from_list(lists:zip(ForeignView,ForeignData)),
-    NativeData = [dict:fetch(Key,AsDict) || Key <- NativeView],
-	NativeData.
-
-visit(TypeDef, State = #decoding_state{reference_pool = OldPool}) ->
-    Size = dict:size(OldPool),
-    NewPool = dict:store(Size, TypeDef, OldPool),
-    {Size,State#decoding_state{reference_pool = NewPool}}.
-
-%%hash_lookup(Hash,_State) ->
-%%    init(false),
-%%    case ets:lookup(hashes, Hash) of
-%%        [] ->
-%%            {not_found, Hash};
-%%        [{Hash,TypeDef}] ->
-%%            TypeDef
-%%    end.
-
-%%hash_store(TypeDef = #type_def{native_type = Hash}, State) ->
-%%    init(false),
-%%    ets:insert(hashes,{Hash,TypeDef}),
-%%    State.
-%%
-%%init() -> init(true).
-%%
-%%init(Delete) when is_boolean(Delete) ->
-%%    case ets:info(hashes) of
-%%        undefined ->
-%%            ets:new(hashes,[public,named_table]);
-%%        _ ->
-%%            if
-%%                Delete ->
-%%                    ets:delete(hashes),
-%%                    ets:new(hashes,[public,named_table]);
-%%                true ->
-%%                    ok
-%%            end
-%%    end,
-%%    #decoding_state{}.
-
-count_fields(#type_def{fieldnames = FieldNames}) -> length(FieldNames).
-
