<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>releases/0.1.0/Makefile</filename>
    </added>
    <added>
      <filename>releases/0.1.0/chordial.rel</filename>
    </added>
    <added>
      <filename>src/chord_monitor.erl</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -9,13 +9,11 @@ SFLAGS=-pa $(OUTDIR)
 
 all:
 	$(ERLC) $(EFLAGS) $(SRCS)
-	$(ERL) $(SFLAGS) -noshell -eval 'systools:make_script(&quot;$(RELEASE)&quot;, [{outdir, &quot;$(OUTDIR)&quot;}, {path, [&quot;$(OUTDIR)&quot;]}])' -s erlang halt
-	$(ERL) $(SFLAGS) -noshell -eval 'systools:script2boot(&quot;$(OUTDIR)/$(RELEASE)&quot;).' -s erlang halt
+	cd releases/0.1.0 &amp;&amp; make
 
 shell:
 	$(ERL) $(SFLAGS)
 
 clean:
 	rm -rf $(OUTDIR)/*.beam
-	rm -rf $(OUTDIR)/*.boot
-	rm -rf $(OUTDIR)/*.script
\ No newline at end of file
+	cd releases/0.1.0 &amp;&amp; make clean
\ No newline at end of file</diff>
      <filename>Makefile</filename>
    </modified>
    <modified>
      <diff>@@ -7,9 +7,10 @@
               chordial_sup,
               gen_chord,
               chord_lib,
+			  chord_monitor,
               sha1,
               mochihex]},
-   {registered, [chordial_sup]},
+   {registered, [chordial_sup, chord_monitor]},
    {applications, [kernel, stdlib]},
    {mod, {chordial_app, []}},
    {start_phases, []}]}.</diff>
      <filename>ebin/chordial.app</filename>
    </modified>
    <modified>
      <diff>@@ -22,4 +22,13 @@
 %%%===================================================================
 %%% Constants
 %%%===================================================================
--define('HASH_LENGTH', 160). % sha1
+-define(debug, true).
+-define(max_successors, 8).
+-define(stabilize_delay, 10000).
+-define(fix_keys_delay, 10000).
+
+-ifdef(debug).
+    -define(hash_len, 8).
+-else.
+    -define(hash_len, 160). % sha1
+-endif.
\ No newline at end of file</diff>
      <filename>include/chordial.hrl</filename>
    </modified>
    <modified>
      <diff>@@ -21,11 +21,14 @@
 %% @spec hash(String) -&gt; {ok, Hash} | {error, Reason}
 %% @end
 %%--------------------------------------------------------------------
+hash(Node) when is_atom(Node) -&gt;
+    hash(atom_to_list(Node));
+    
 hash(String) when is_list(String) -&gt;
 	Hash = sha1:binstring(String),
-	GarbageBits = 160 - ?HASH_LENGTH,
+	GarbageBits = 160 - ?hash_len,
 	case GarbageBits =:= 0 of
-	    true -&gt; &lt;&lt;TruncatedHash:?HASH_LENGTH&gt;&gt; = Hash;
+	    true -&gt; &lt;&lt;TruncatedHash:?hash_len&gt;&gt; = Hash;
 	    false -&gt; &lt;&lt;_:GarbageBits, TruncatedHash/unsigned-integer&gt;&gt; = Hash
 	end,
 	TruncatedHash.
@@ -38,7 +41,7 @@ hash(String) when is_list(String) -&gt;
 %% @end
 %%--------------------------------------------------------------------
 max_hash_value() -&gt;
-    max_hash_value(?HASH_LENGTH).
+    max_hash_value(?hash_len).
 
 %%%===================================================================
 %%% Internal functions</diff>
      <filename>src/chord_lib.erl</filename>
    </modified>
    <modified>
      <diff>@@ -48,6 +48,7 @@ start_link() -&gt;
 %% @end
 %%--------------------------------------------------------------------
 init([]) -&gt;
+    error_logger:info_msg(&quot;Starting supervisor...~n&quot;),
     RestartStrategy = one_for_one,
     MaxRestarts = 1000,
     MaxSecondsBetweenRestarts = 3600,
@@ -60,10 +61,12 @@ init([]) -&gt;
     Shutdown = 2000,
     Type = worker,
 
-    GenChordChild = {gen_chord, {gen_chord, start_link, [KnownNodes]},
+    ChordialServer = {gen_chord, {gen_chord, start_link, [KnownNodes]},
               Restart, Shutdown, Type, [gen_chord]},
-
-    {ok, {SupFlags, [GenChordChild]}}.
+    MonitorServer = {chord_monitor, {chord_monitor, start_link, []},
+              Restart, Shutdown, Type, [chord_monitor]},
+    error_logger:info_msg(&quot;Started supervisor.~n&quot;),
+    {ok, {SupFlags, [MonitorServer, ChordialServer]}}.
 
 %%%===================================================================
 %%% Internal functions</diff>
      <filename>src/chordial_sup.erl</filename>
    </modified>
    <modified>
      <diff>@@ -14,7 +14,7 @@
 -behaviour(gen_server).
 
 %% API
--export([start_link/0, start_link/1, call/1, call/2]).
+-export([start_link/0, start_link/1, call/1, call/2, find_successor/1, find_successor/2, lookup/1]).
 
 %% Behaviour
 -export([behaviour_info/1]).
@@ -26,7 +26,8 @@
 -define(SERVER, ?MODULE).
 -define('MAX_KEY', chord_lib:max_hash_value()).
 
--record(state, {key, predecessor=nil, predecessor_key=nil, finger_table=[], successors=[]}).
+% TODO: Change successor to list of successors
+-record(state, {key, predecessor=nil, finger_table=[], successor=node()}).
 
 %%%===================================================================
 %%% API
@@ -70,8 +71,8 @@ call(Request) -&gt;
 %% @end
 %%--------------------------------------------------------------------
 call(Request, Node) -&gt;
+    error_logger:info_msg(&quot;Calling ~p with message:~p~n&quot;, [Node, Request]),
     net_kernel:connect_node(Node),
-    io:format(&quot;Connected to ~p...~n&quot;, [Node]),
     gen_server:call({?SERVER, Node}, Request).
     
 %%%===================================================================
@@ -108,39 +109,26 @@ init(KnownNodes) when is_atom(KnownNodes) -&gt;
     init([KnownNodes]);
     
 init(KnownNodes) -&gt;
-	NodeName = atom_to_list(node()),
-	NodeKey = chord_lib:hash(NodeName),
-	io:format(&quot;Starting up node ~p (~p) with known nodes: ~p~n&quot;, [NodeName, NodeKey, KnownNodes]),
-	FingerTable = init_finger_table(NodeKey),
-	Successors = case KnownNodes of
-	    [] -&gt; [];
-	    _ -&gt; 
-	        io:format(&quot;Getting successor...~n&quot;),
-	        [init_successor(KnownNodes, NodeKey)]
+    error_logger:info_msg(&quot;Starting gen_chord...~n&quot;),
+	Key = chord_lib:hash(node()),
+	error_logger:info_msg(&quot;Starting up node ~p (~p) with known nodes: ~p~n&quot;, [node(), Key, KnownNodes]),
+	%FingerTable = init_finger_table(NodeKey),
+	error_logger:info_msg(&quot;Getting successor...~n&quot;),
+	Successor = case KnownNodes of
+	    [] -&gt; node();
+	    [KnownNode|_Rest] -&gt; 
+	        {ok, Node} = find_successor(Key, KnownNode),
+	        Node
 	end,
-	io:format(&quot;Got successors: ~p~n&quot;, [Successors]),
-	Predecessor = case Successors of
-	    [] -&gt; nil;
-	    _ -&gt; 
-	        io:format(&quot;Getting Predecessors...~n&quot;),
-	        init_predecessor(hd(Successors))
-	end,
-	PredecessorKey = case Predecessor of
-	    nil -&gt; nil;
-	    _ -&gt; chord_lib:hash(atom_to_list(Predecessor))
-	end,
-	io:format(&quot;Got Predecessors: ~p~n&quot;, [Predecessor]),
-	case Successors /= [] of
-	    true -&gt; 
-	        io:format(&quot;Notifying successor...~n&quot;),
-	        call({notify, node(), NodeKey}, hd(Successors));
-	    _ -&gt; ok
-	end,
-    {ok, #state{key=NodeKey, 
-                finger_table=FingerTable,
-                successors=Successors,
-                predecessor=Predecessor,
-                predecessor_key=PredecessorKey}}.
+	error_logger:info_msg(&quot;Got successor: ~p~n&quot;, [Successor]),
+    % TODO: Set predecessor here (successors old predecessor)
+	%error_logger:info_msg(&quot;Got Predecessor: ~p~n&quot;, [Predecessor]),
+	notify_successor(Successor),
+	error_logger:info_msg(&quot;Started gen_chord.~n&quot;),
+	spawn_link(fun() -&gt; periodic_stabilize() end),
+    {ok, #state{key=Key, 
+                %finger_table=FingerTable,
+                successor=Successor}}.
 
 %%--------------------------------------------------------------------
 %% @private
@@ -156,64 +144,93 @@ init(KnownNodes) -&gt;
 %%                                   {stop, Reason, State}
 %% @end
 %%--------------------------------------------------------------------
-
-% Simple ping call
-handle_call(ping, _From, State) -&gt;
-    Reply = pong,
-    {reply, Reply, State};
     
-% Get the current state of the server
-handle_call(state, _From, State) -&gt;
-    {reply, State, State};
-    
-% Get the current finger table
-handle_call({finger, all}, _From, State) -&gt;
-	Reply = {ok, State#state.finger_table},
-    {reply, Reply, State};
-    
-% Get the closest match for a key from the finger table
-handle_call({finger, Key}, _From, State) -&gt;
-	Reply = {ok, finger(Key, State#state.finger_table)},
-    {reply, Reply, State};
-    
-% Get the immediate predecessor of this node
-handle_call(predecessor, _From, State) -&gt;
-	Reply = {ok, State#state.predecessor},
+%find_successor
+handle_call({find_successor, Key}, _From, State) -&gt;
+    error_logger:info_msg(&quot;Finding successor to ~p...~n&quot;, [Key]),
+    CurrentSuccessor = State#state.successor,
+    Successor = case successor_is_successor(Key, State) of
+        true -&gt; CurrentSuccessor;
+        % TODO: Substitute this finde_successor call with a closest_preceeding_node
+        % call to abstract out the finger table lookup
+        false -&gt; 
+            {ok, Node} = find_successor(Key, CurrentSuccessor),
+            Node
+    end,
+    Reply = {ok, Successor},
     {reply, Reply, State};
     
-% Change this node's predecessor
-handle_call({notify, Node, NodeKey}, _From, State) -&gt;
-    io:format(&quot;New predecessor: ~p (~p)~n&quot;, [Node, NodeKey]),
-    NewState = State#state{predecessor=Node, predecessor_key=NodeKey},
-    NewState2 = case State#state.successors of
-        [] -&gt; NewState#state{successors=[Node]};
-        _ -&gt; NewState
+handle_call({new_predecessor, NewPredecessor}, From, State) -&gt;
+    NewPredecessorKey = chord_lib:hash(NewPredecessor),
+    OldPredecessor = State#state.predecessor,
+    OldPredecessorKey = chord_lib:hash(OldPredecessor),
+    SuccessorKey = State#state.key,
+    IsPredecessor = (OldPredecessor =:= nil) orelse between(OldPredecessorKey, SuccessorKey, NewPredecessorKey, false),
+    NewState = case IsPredecessor of
+        true -&gt; 
+            error_logger:info_msg(&quot;New predecessor: ~p~n&quot;, [NewPredecessor]), 
+            State#state{predecessor=NewPredecessor};
+        false -&gt; State
     end,
-	Reply = ok,
+    SuccessorIsSelf = State#state.successor =:= node(),
+    NewState2 = case SuccessorIsSelf of
+        true -&gt; 
+            gen_server:reply(From, ok),
+            error_logger:info_msg(&quot;New successor: ~p~n&quot;, [NewPredecessor]),
+            notify_successor(NewPredecessor),
+            NewState#state{successor=NewPredecessor};
+        false -&gt; NewState
+    end,
+    Reply = ok,
     {reply, Reply, NewState2};
     
-% Get the immediate successor of this node
-handle_call(successor, _From, State) -&gt;
-	Reply = call({successor, State#state.key}, State#state.predecessor),
-    {reply, Reply, State};
-    
-%find_successor
-handle_call({successor, Key}, _From, State) -&gt;
-    IsInBounds = (Key &gt;= 0) and (Key =&lt; ?MAX_KEY),
-    Reply = case IsInBounds of
-        true -&gt; get_successor(Key, State);
-        false -&gt; {error, out_of_bounds}
-    end,
-    {reply, Reply, State};
+% Our first successor is down, find the next one and tell it we are its
+% predecessor
+handle_call({node_down}, _From, State) -&gt;
+    Successor = find_successor(State#state.key, State),
+    notify_successor(Successor),
+    NewState = State#state{successor=Successor},
+	Reply = ok,
+    {reply, Reply, NewState};
     
-% Change this node's successor
 handle_call(stabilize, _From, State) -&gt;
-    NewState = stabilize(State),
+    error_logger:info_msg(&quot;Stabilizing... State: ~p~n&quot;, [State]),
+    Successor = State#state.successor,
+    SuccessorKey = chord_lib:hash(Successor),
+    Predecessor = State#state.predecessor,
+    PredecessorKey = chord_lib:hash(Predecessor),
+    {ok, SuccessorPredecessor} = case Successor =:= node() of
+        true -&gt; {ok, node()};
+        _ -&gt; call(predecessor, Successor)
+    end,
+    error_logger:info_msg(&quot;Got SuccessorPredecessor: ~p~n&quot;, [SuccessorPredecessor]),
+    SuccessorPredecessorKey = chord_lib:hash(SuccessorPredecessor),
+    NewState = case (SuccessorPredecessor /= node()) andalso between(PredecessorKey, SuccessorKey, SuccessorPredecessorKey, false) of
+        true -&gt; 
+            error_logger:info_msg(&quot;New successor: ~p~n&quot;, SuccessorPredecessor),
+            notify_successor(SuccessorPredecessor),
+            State#state{successor=SuccessorPredecessor};
+        false -&gt; State
+    end,
+    error_logger:info_msg(&quot;Stabilized state: ~p~n&quot;, [NewState]),
 	Reply = ok,
     {reply, Reply, NewState};
+    
+handle_call(fix_fingers, _From, State) -&gt;
+    Key = State#state.key,
+    Successor = find_successor(key),
+    {reply, ok, State};
+
+handle_call(state, _From, State) -&gt;
+    {reply, State, State};
+    
+handle_call(predecessor, _From, State) -&gt;
+    Reply = {ok, State#state.predecessor},
+    {reply, Reply, State};
 
 % Unkown Call
-handle_call(_Request, _From, State) -&gt;
+handle_call(Request, _From, State) -&gt;
+    error_logger:warning_msg(&quot;Unknown call to module ~p: ~p~n&quot;, [?MODULE, Request]),
     Reply = {error, unknown_call},
     {reply, Reply, State}.
 
@@ -266,6 +283,7 @@ terminate(_Reason, _State) -&gt;
 %% @end
 %%--------------------------------------------------------------------
 code_change(_OldVsn, State, _Extra) -&gt;
+    error_logger:warning_msg(&quot;Code change.~n&quot;),
     {ok, State}.
 
 %%%===================================================================
@@ -279,39 +297,57 @@ code_change(_OldVsn, State, _Extra) -&gt;
 %%                                                      {error, Reason}
 %% @end
 %%--------------------------------------------------------------------
-init_successor([], _Key) -&gt;
-    [];
-
-init_successor([KnownNode|Rest], Key) -&gt;
-    case call({successor, Key}, KnownNode) of
-        {ok, Node} -&gt; 
-            io:format(&quot;Got successor for ~p: ~p~n&quot;, [Key, Node]),
-            Node;
-        {error, _Reason} -&gt; init_successor(Rest, Key)
-    end.
     
-%%--------------------------------------------------------------------
-%% @private
-%% @doc Gets the predecessor for the node's successor when it starts.
-%% @spec init_predecessor(Successor::node()) -&gt; node()
-%% @end
-%%--------------------------------------------------------------------
-init_predecessor(Successor) -&gt;
-    case call(predecessor, Successor) of
-        {ok, nil} -&gt; Successor;
-        {ok, Node} -&gt; Node
+notify_successor(Successor) when is_atom(Successor) -&gt;
+    Node = node(),
+    case Successor of
+        nil -&gt; ok;
+        Node -&gt; ok;
+        _ -&gt; call({new_predecessor, node()}, Successor)
     end.
     
+successor_is_successor(Key, State) -&gt;
+    PredecessorKey = State#state.key,
+    Successor = State#state.successor,
+    SuccessorKey = chord_lib:hash(atom_to_list(Successor)),
+    IsSuccessor = Successor =:= node(),
+    IsBetween = between(PredecessorKey, SuccessorKey, Key, true),
+    IsSuccessor or IsBetween.
     
+between(PredecessorKey, SuccessorKey, Key, IsInclusive) -&gt;
+    IsLastNode = SuccessorKey =&lt; PredecessorKey,
+    Attempt1 = case IsInclusive of
+        true -&gt; (PredecessorKey &lt; Key) and (Key =&lt; SuccessorKey);
+        false -&gt; (PredecessorKey &lt; Key) and (Key &lt; SuccessorKey)
+    end,
+    Attempt2 = case IsInclusive of
+        true -&gt; IsLastNode and (((PredecessorKey &lt; Key) and (Key =&lt; ?MAX_KEY)) or 
+                                ((Key &gt;= 0) and (Key =&lt; SuccessorKey)));
+        false -&gt; IsLastNode and (((PredecessorKey &lt; Key) and (Key =&lt; ?MAX_KEY)) or 
+                                 ((Key &gt;= 0) and (Key &lt; SuccessorKey)))
+    end,
+    IsBetween = Attempt1 or Attempt2,
+    error_logger:info_msg(&quot;Checking if ~p is between ~p and ~p...~p~n&quot;, [Key, PredecessorKey, SuccessorKey, IsBetween]),
+    IsBetween.
     
-get_successor(Key, State) -&gt;
-    case (State#state.predecessor =:= nil) or is_successor(State, Key) of
-        true -&gt; {ok, node()};
-        false -&gt; 
-            % TODO: Optimize lookup by looking at finger table
-            Predecessor = State#state.predecessor,
-            call({successor, Key}, Predecessor)
+lookup(Key) -&gt; find_successor(Key).
+    
+find_successor(Key) -&gt;
+    find_successor(Key, node()).
+    
+find_successor(Key, Node) -&gt;
+    IsInRange = Key &gt;= 0 andalso Key =&lt; ?MAX_KEY,
+    case IsInRange of
+        true -&gt; call({find_successor, Key}, Node);
+        false -&gt; {error, out_of_bounds}
     end.
+    
+periodic_stabilize() -&gt;
+    receive _ -&gt; ok
+    after ?stabilize_delay -&gt; ok
+    end,
+    call(stabilize),
+    periodic_stabilize().
 
 %%--------------------------------------------------------------------
 %% @private
@@ -319,95 +355,6 @@ get_successor(Key, State) -&gt;
 %% @spec init_finger_table(key()) -&gt; [finger_record()]
 %% @end
 %%--------------------------------------------------------------------
-init_finger_table(Key) when is_integer(Key) -&gt;
-	init_finger_table(Key, [], 0).
-	
-% create blank list of finger records
-init_finger_table(Key, Successors, BitPos) when BitPos &lt; ?HASH_LENGTH -&gt;
-	CurrentKey = next_finger(Key, BitPos),
-	NextKey = next_finger(Key, BitPos + 1),
-	NewSuccessor = {CurrentKey, {CurrentKey, NextKey}, node()},
-	init_finger_table(Key, [NewSuccessor|Successors], BitPos + 1);
-	
-init_finger_table(_Key, Successors, ?HASH_LENGTH) -&gt;
-	lists:reverse(Successors).
 
-%%--------------------------------------------------------------------
-%% @private
-%% @doc Determine if the node is the only node in the ring.
-%%
-%% @spec is_only_node(State) -&gt; true | false
-%% @end
-%%--------------------------------------------------------------------
-is_only_node(State) -&gt;
-    State#state.successors =:= [].
-    
-%%--------------------------------------------------------------------
-%% @private
-%% @doc Determine if the node is responsible for the key.
-%%
-%% @spec is_successor(State, Key::key()) -&gt; true | false
-%% @end
-%%--------------------------------------------------------------------
-is_successor(State, Key) -&gt;
-    Predecessor = State#state.predecessor,
-    NodeKey = State#state.key,
-    PredecessorKey = State#state.predecessor_key,
-    IsFirstNode = PredecessorKey &gt; NodeKey,
-    HasNoPredecessor = Predecessor =:= nil,
-    KeyIsNodeKey = Key =:= NodeKey,
-    KeyIsInBetween = (Key &gt; PredecessorKey) and (Key =&lt; NodeKey),
-    KeyIsBetweenFirstNode = (((Key &gt; PredecessorKey) and (Key =&lt; ?MAX_KEY)) or ((Key &gt;= 0) and (Key =&lt; NodeKey))) and IsFirstNode,
-    IsSuccessor = HasNoPredecessor or       % Only Node
-                  KeyIsNodeKey or           % Same key as node's key
-                  KeyIsInBetween or         % Key between bredecessor and node's key
-                  KeyIsBetweenFirstNode,    % Node is first (by key value) in the ring
-    io:format(&quot;Check if ~p &gt; ~p and ~p =&lt; ~p: OR ~p &lt; ~p -&gt; ~p~n&quot;, [Key, PredecessorKey, Key, NodeKey, NodeKey, PredecessorKey, IsSuccessor]),
-    IsSuccessor.
-    
-%%--------------------------------------------------------------------
-%% @private
-%% @doc Find the closest match to the key in the local finger table.
-%%
-%% @spec finger(Key, FingerTable::finger_list()) -&gt; true | false
-%% @end
-%%--------------------------------------------------------------------
-finger(Key, FingerTable=[]) when is_list(FingerTable) -&gt;
-    io:format(&quot;Key: ~p~n&quot;, [Key]),
-    {error, key_out_of_bounds};
 
-finger(Key, [{Start, {Start, End}, Node}|T]) -&gt;
-    io:format(&quot;Fingering node: ~p &lt; ~p =&lt; ~p...~n&quot;, [Start, Key, End]),
-    case ((Start &lt; Key) and (Key =&lt; End)) or ((Start =&lt; Key) and (Key &gt; End)) of
-        true -&gt;
-            Node;
-        false -&gt;
-            finger(Key, T)
-    end.
-    
-%%--------------------------------------------------------------------
-%% @private
-%% @doc Calculates the BitPos-th key, based on the chord principle
-%% that the finger table length should be m long where m is the 
-%% number of bits in the hash algorithm used. If it exceeds the max
-%% value for the hash type, it will cycle back to the beginning.
-%% @spec next_finger(Key, BitPos) -&gt; int()
-%% @end
-%%--------------------------------------------------------------------
-next_finger(Key, BitPos) -&gt;
-    (Key + (1 bsl BitPos)) rem ?MAX_KEY.
-    
-%%--------------------------------------------------------------------
-%% @private
-%% @doc 
-%% @spec stabilize(State) -&gt; NewState
-%% @end
-%%--------------------------------------------------------------------
-stabilize(State) -&gt;
-    Successor = hd(State#state.successors),
-    {ok, SuccessorsPredecessor} = call(predecessor, Successor),
-    case SuccessorsPredecessor of
-        node -&gt; State;
-        NewSuccessor -&gt; State#state{successors=[NewSuccessor]}
-    end.
 </diff>
      <filename>src/gen_chord.erl</filename>
    </modified>
    <modified>
      <diff>@@ -4,4 +4,4 @@ if [ &quot;$1&quot; != &quot;1&quot; ]; then
     echo &quot;Not first Node&quot;
     config=&quot;-config test/node&quot;;
 fi
-erl -pa ebin ../ebin -sname node$1@localhost -boot chordial $config
\ No newline at end of file
+erl -pa ebin ../ebin releases/0.1.0 -sname node$1@localhost -boot chordial $config
\ No newline at end of file</diff>
      <filename>test/start_node.sh</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>chordial.rel</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>9897ed4e0722affcea929a7b5b20f8e4082397ff</id>
    </parent>
  </parents>
  <author>
    <name>Matthew Williamson</name>
    <email>dawsdesign@216.sub-75-220-14.myvzw.com</email>
  </author>
  <url>http://github.com/dawsdesign/chordial/commit/15706d15a30a972b328809a51320ec610ec46ce4</url>
  <id>15706d15a30a972b328809a51320ec610ec46ce4</id>
  <committed-date>2009-06-10T07:30:29-07:00</committed-date>
  <authored-date>2009-06-10T07:30:29-07:00</authored-date>
  <message>Completely refactored and working completely. Still need to add finger table lookup and maintenence.</message>
  <tree>59aa253e49b5bcf1fdc86f7fd1a8fab881a8f965</tree>
  <committer>
    <name>Matthew Williamson</name>
    <email>dawsdesign@216.sub-75-220-14.myvzw.com</email>
  </committer>
</commit>
