Start implementation of some functions.
[oweals/gnunet.git] / src / dht / gnunet-service-xdht_neighbours.c
index c328a67343979915082cc7b4529ae16fb18573e8..8339f9ce149b9c0b79c37cc598c20ba1ffe18ecf 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2009-2014 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2009-2014 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
  * hashing.
  */
 
-
-/**
- * FIXME: URGENT
- * We should have a message type like notify successor result. only when 
- * this message is being recvied by the new successor. we should schedule
- * another round of verify successor. 
- */
 #define DEBUG(...)                                           \
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
 
 
 /**
  * In case we don't hear back from the current successor, then we can start
- * verify successor. 
+ * verify successor.
  */
 #define WAIT_NOTIFY_CONFIRMATION GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 200)
 
 /**
  * Maximum number of trails stored per finger.
  */
-#define MAXIMUM_TRAILS_PER_FINGER 2
+#define MAXIMUM_TRAILS_PER_FINGER 4
 
 /**
  * Finger map index for predecessor entry in finger table.
@@ -630,33 +623,6 @@ struct PeerAddTrailMessage
    */
 };
 
-/**
- * P2P Trail Compression Message.
- */
-struct PeerTrailCompressionMessage
-{
-  /**
-   * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_COMPRESSION
-   */
-  struct GNUNET_MessageHeader header;
-
-  /**
-   * Source peer of this trail.
-   */
-  struct GNUNET_PeerIdentity source_peer;
-
-  /**
-   * Trail from source_peer to destination_peer compressed such that
-   * new_first_friend is the first hop in the trail from source to
-   * destination.
-   */
-  struct GNUNET_PeerIdentity new_first_friend;
-
-  /**
-   * Unique identifier of trail.
-   */
-  struct GNUNET_HashCode trail_id;
-};
 
 GNUNET_NETWORK_STRUCT_END
 
@@ -720,7 +686,7 @@ struct FriendInfo
    */
   struct GNUNET_TIME_Absolute congestion_timestamp;
 
-  
+
   // TODO : Change name of head and tail to pending_messages_list_head and so.
   /**
    * Head of pending messages to be sent to this friend.
@@ -806,7 +772,7 @@ struct FingerInfo
    * Used ONLY for successor. NOT for any other finger.
    */
   struct GNUNET_TIME_Absolute wait_notify_confirmation;
-  
+
   /**
    * Is any finger stored at this finger index.
    */
@@ -864,11 +830,11 @@ struct Closest_Peer
    * to reach to it. In other case, same as best_known_destination.
    */
   struct GNUNET_PeerIdentity next_hop;
-  
+
   /**
    * In case finger is the next hop, it contains a valid finger table index
    * at which the finger is stored. Else, It contains 65, which is out of range
-   * of finger table index. 
+   * of finger table index.
    */
   unsigned int finger_table_index;
 };
@@ -888,25 +854,25 @@ struct VerifySuccessorContext
  * Task that sends FIND FINGER TRAIL requests. This task is started when we have
  * get our first friend.
  */
-static GNUNET_SCHEDULER_TaskIdentifier find_finger_trail_task;
+static struct GNUNET_SCHEDULER_Task * find_finger_trail_task;
 
 /**
  * Task that sends verify successor message. This task is started when we get
  * our successor for the first time.
  */
-static GNUNET_SCHEDULER_TaskIdentifier send_verify_successor_task;
+static struct GNUNET_SCHEDULER_Task * send_verify_successor_task;
 
 /**
  * Task that sends verify successor message. This task is started when we get
  * our successor for the first time.
  */
-static GNUNET_SCHEDULER_TaskIdentifier send_verify_successor_retry_task;
+static struct GNUNET_SCHEDULER_Task * send_verify_successor_retry_task;
 
 /**
  * Task that sends verify successor message. This task is started when we get
  * our successor for the first time.
  */
-static GNUNET_SCHEDULER_TaskIdentifier send_notify_new_successor_retry_task;
+static struct GNUNET_SCHEDULER_Task * send_notify_new_successor_retry_task;
 
 /**
  * Identity of this peer.
@@ -942,12 +908,12 @@ static struct GNUNET_CORE_Handle *core_api;
 static unsigned int current_search_finger_index;
 
 /**
- * Time duration to schedule find finger trail task. 
+ * Time duration to schedule find finger trail task.
  */
 static struct GNUNET_TIME_Relative find_finger_trail_task_next_send_time;
 
 /**
- * Time duration to schedule verify successor task.  
+ * Time duration to schedule verify successor task.
  */
 static struct GNUNET_TIME_Relative verify_successor_next_send_time;
 
@@ -974,19 +940,19 @@ static struct GNUNET_TIME_Relative notify_successor_retry_time;
 unsigned int track_topology;
 
 /**
- * Should I be a malicious peer and drop the PUT/GET packets? 
+ * Should I be a malicious peer and drop the PUT/GET packets?
  * if 0 then NOT malicious.
  */
 unsigned int act_malicious;
 
 /**
- * Count of fingers found. Ideally we should have O(logn) fingers for a 
- * stable network. 
+ * Count of fingers found. Ideally we should have O(logn) fingers for a
+ * stable network.
  */
 static unsigned int total_fingers_found;
 
 /**
- * Number of times we found the same successor. 
+ * Number of times we found the same successor.
  */
 static unsigned int successor_times;
 
@@ -1013,11 +979,18 @@ core_transmit_notify (void *cls, size_t size, void *buf)
   size_t msize;
 
   peer->th = NULL;
-  while ((NULL != (pending = peer->head)) &&
-         (0 == GNUNET_TIME_absolute_get_remaining (pending->timeout).rel_value_us))
+  while ( (NULL != (pending = peer->head)) &&
+          (0 == GNUNET_TIME_absolute_get_remaining (pending->timeout).rel_value_us) )
   {
+    GNUNET_STATISTICS_update (GDS_stats,
+                              gettext_noop
+                              ("# Messages dropped (CORE timeout)"),
+                              1,
+                              GNUNET_NO);
     peer->pending_count--;
-    GNUNET_CONTAINER_DLL_remove (peer->head, peer->tail, pending);
+    GNUNET_CONTAINER_DLL_remove (peer->head,
+                                 peer->tail,
+                                 pending);
     GNUNET_free (pending);
   }
   if (NULL == pending)
@@ -1043,7 +1016,8 @@ core_transmit_notify (void *cls, size_t size, void *buf)
   {
     GNUNET_STATISTICS_update (GDS_stats,
                               gettext_noop
-                              ("# Bytes transmitted to other peers"), msize,
+                              ("# Bytes transmitted to other peers"),
+                              msize,
                               GNUNET_NO);
     memcpy (&cbuf[off], pending->msg, msize);
     off += msize;
@@ -1083,7 +1057,7 @@ process_friend_queue (struct FriendInfo *peer)
   {
     return;
   }
+
   peer->th =
       GNUNET_CORE_notify_transmit_ready (core_api, GNUNET_NO,
                                          pending->importance,
@@ -1100,10 +1074,11 @@ process_friend_queue (struct FriendInfo *peer)
  * Set the ENABLE_MALICIOUS value to malicious.
  * @param malicious
  */
-void 
+int
 GDS_NEIGHBOURS_act_malicious (unsigned int malicious)
 {
   act_malicious = malicious;
+  return GNUNET_OK;
 }
 #endif
 
@@ -1166,7 +1141,7 @@ GDS_NEIGHBOURS_send_trail_setup (struct GNUNET_PeerIdentity source_peer,
   tsm->is_predecessor = htonl (is_predecessor);
   tsm->trail_id = trail_id;
   tsm->intermediate_trail_id = intermediate_trail_id;
-  
+
   if (trail_length > 0)
   {
     peer_list = (struct GNUNET_PeerIdentity *) &tsm[1];
@@ -1226,7 +1201,7 @@ GDS_NEIGHBOURS_send_trail_setup_result (struct GNUNET_PeerIdentity querying_peer
 
   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
   pending->importance = 0;
-  pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT); 
+  pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
   tsrm = (struct PeerTrailSetupResultMessage *) &pending[1];
   pending->msg = &tsrm->header;
   tsrm->header.size = htons (msize);
@@ -1239,7 +1214,7 @@ GDS_NEIGHBOURS_send_trail_setup_result (struct GNUNET_PeerIdentity querying_peer
           GNUNET_htonll (ultimate_destination_finger_value);
   peer_list = (struct GNUNET_PeerIdentity *) &tsrm[1];
   memcpy (peer_list, trail_peer_list, trail_length * sizeof (struct GNUNET_PeerIdentity));
-  
+
   /* Send the message to chosen friend. */
   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
   target_friend->pending_count++;
@@ -1248,7 +1223,7 @@ GDS_NEIGHBOURS_send_trail_setup_result (struct GNUNET_PeerIdentity querying_peer
 
 /**
  * Send notify successor confirmation message.
- * @param trail_id Unique Identifier of the trail. 
+ * @param trail_id Unique Identifier of the trail.
  * @param trail_direction Destination to Source.
  * @param target_friend Friend to get this message next.
  */
@@ -1260,7 +1235,7 @@ GDS_NEIGHBOURS_send_notify_succcessor_confirmation (struct GNUNET_HashCode trail
   struct PeerNotifyConfirmationMessage *ncm;
   struct P2PPendingMessage *pending;
   size_t msize;
-   
+
   msize = sizeof (struct PeerNotifyConfirmationMessage);
   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
   {
@@ -1392,7 +1367,7 @@ GDS_NEIGHBOURS_send_verify_successor_message (struct GNUNET_PeerIdentity source_
 
   msize = sizeof (struct PeerVerifySuccessorMessage) +
          (trail_length * sizeof (struct GNUNET_PeerIdentity));
-  
+
   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
   {
     GNUNET_break (0);
@@ -1431,14 +1406,15 @@ GDS_NEIGHBOURS_send_verify_successor_message (struct GNUNET_PeerIdentity source_
  * the pointer to friend in routing table rather than gnunet_peeridentity.
  * if yes then we should keep friend info in.h  andmake lot of changes.
  * Construct a trail teardown message and forward it to target friend.
+ *
  * @param trail_id Unique identifier of the trail.
  * @param trail_direction Direction of trail.
  * @param target_friend Friend to get this message.
  */
 void
-GDS_NEIGHBOURS_send_trail_teardown (struct GNUNET_HashCode trail_id,
+GDS_NEIGHBOURS_send_trail_teardown (const struct GNUNET_HashCode *trail_id,
                                     unsigned int trail_direction,
-                                    struct GNUNET_PeerIdentity peer)
+                                    const struct GNUNET_PeerIdentity *peer)
 {
   struct PeerTrailTearDownMessage *ttdm;
   struct P2PPendingMessage *pending;
@@ -1446,17 +1422,19 @@ GDS_NEIGHBOURS_send_trail_teardown (struct GNUNET_HashCode trail_id,
   size_t msize;
 
   msize = sizeof (struct PeerTrailTearDownMessage);
-
   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
   {
     GNUNET_break (0);
     return;
   }
 
-  /*FIXME:In what case friend can be null. ?*/
   if (NULL == (target_friend =
-                 GNUNET_CONTAINER_multipeermap_get (friend_peermap, &peer)));
-  return;
+               GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer)))
+  {
+    /* FIXME: In what case friend can be null. ?*/
+    GNUNET_break (0);
+    return;
+  }
 
   if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
   {
@@ -1471,7 +1449,7 @@ GDS_NEIGHBOURS_send_trail_teardown (struct GNUNET_HashCode trail_id,
   pending->msg = &ttdm->header;
   ttdm->header.size = htons (msize);
   ttdm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_TEARDOWN);
-  ttdm->trail_id = trail_id;
+  ttdm->trail_id = *trail_id;
   ttdm->trail_direction = htonl (trail_direction);
 
   /* Send the message to chosen friend. */
@@ -1480,55 +1458,6 @@ GDS_NEIGHBOURS_send_trail_teardown (struct GNUNET_HashCode trail_id,
   process_friend_queue (target_friend);
 }
 
-/**
- * Construct a trail compression message and send it to target_friend.
- * @param source_peer Source of the trail.
- * @param trail_id Unique identifier of trail.
- * @param first_friend First hop in compressed trail to reach from source to finger
- * @param target_friend Next friend to get this message.
- */
-void
-GDS_NEIGHBOURS_send_trail_compression (struct GNUNET_PeerIdentity source_peer,
-                                       struct GNUNET_HashCode trail_id,
-                                       struct GNUNET_PeerIdentity first_friend,
-                                       struct FriendInfo *target_friend)
-{
-  struct P2PPendingMessage *pending;
-  struct PeerTrailCompressionMessage *tcm;
-  size_t msize;
-
-  msize = sizeof (struct PeerTrailCompressionMessage);
-
-  if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
-  {
-    GNUNET_break (0);
-    return;
-  }
-
-  if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
-  {
-    GNUNET_STATISTICS_update (GDS_stats,
-                              gettext_noop ("# P2P messages dropped due to full queue"),
-                                                     1, GNUNET_NO);
-  }
-
-  pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
-  pending->importance = 0;    /* FIXME */
-  pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
-  tcm = (struct PeerTrailCompressionMessage *) &pending[1];
-  pending->msg = &tcm->header;
-  tcm->header.size = htons (msize);
-  tcm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_COMPRESSION);
-  tcm->source_peer = source_peer;
-  tcm->new_first_friend = first_friend;
-  tcm->trail_id = trail_id;
-
-  GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
-  target_friend->pending_count++;
-  process_friend_queue (target_friend);
-
-}
-
 
 /**
  * Construct a verify successor result message and send it to target_friend
@@ -1586,10 +1515,10 @@ GDS_NEIGHBOURS_send_verify_successor_result (struct GNUNET_PeerIdentity querying
   vsmr->current_successor = current_successor;
   vsmr->probable_successor = probable_successor;
   vsmr->trail_direction = htonl (trail_direction);
-  vsmr->trail_id = trail_id; 
+  vsmr->trail_id = trail_id;
   peer_list = (struct GNUNET_PeerIdentity *) &vsmr[1];
   memcpy (peer_list, trail, trail_length * sizeof (struct GNUNET_PeerIdentity));
-  
+
    /* Send the message to chosen friend. */
   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
   target_friend->pending_count++;
@@ -1636,7 +1565,7 @@ GDS_NEIGHBOURS_send_notify_new_successor (struct GNUNET_PeerIdentity source_peer
     GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped due to full queue"),
                                1, GNUNET_NO);
   }
-  
+
   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
   pending->importance = 0;    /* FIXME */
   pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
@@ -1650,7 +1579,7 @@ GDS_NEIGHBOURS_send_notify_new_successor (struct GNUNET_PeerIdentity source_peer
   peer_list = (struct GNUNET_PeerIdentity *) &nsm[1];
   memcpy (peer_list, successor_trail,
           successor_trail_length * sizeof (struct GNUNET_PeerIdentity));
+
    /* Send the message to chosen friend. */
   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
   target_friend->pending_count++;
@@ -1709,7 +1638,7 @@ GDS_NEIGHBOURS_send_add_trail (struct GNUNET_PeerIdentity source_peer,
   adm->trail_id = trail_id;
   peer_list = (struct GNUNET_PeerIdentity *)&adm[1];
   memcpy (peer_list, trail, sizeof (struct GNUNET_PeerIdentity) * trail_length);
-  
+
   /* Send the message to chosen friend. */
   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
   target_friend->pending_count++;
@@ -1733,7 +1662,7 @@ search_my_index (const struct GNUNET_PeerIdentity *trail,
   int i;
   int index_seen = trail_length + 1;
   int flag = 0;
-  
+
   for (i = 0; i < trail_length; i++)
   {
     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &trail[i]))
@@ -1782,7 +1711,7 @@ is_friend_congested (struct FriendInfo *friend)
  * @param value Value to be compare
  * @return Closest peer
  */
-static struct GNUNET_PeerIdentity 
+static struct GNUNET_PeerIdentity
 select_closest_finger (const struct GNUNET_PeerIdentity *peer1,
                        const struct GNUNET_PeerIdentity *peer2,
                        uint64_t value)
@@ -1804,11 +1733,11 @@ select_closest_finger (const struct GNUNET_PeerIdentity *peer1,
   {
     return *peer2;
   }
-  
+
   if (value < peer1_value && peer1_value < peer2_value)
   {
     return *peer1;
-  }  
+  }
   else if (value < peer2_value && peer2_value < peer1_value)
   {
     return *peer2;
@@ -1839,7 +1768,7 @@ select_closest_finger (const struct GNUNET_PeerIdentity *peer1,
  * @param value Value to be compare
  * @return Peer which precedes value in the network.
  */
-static struct GNUNET_PeerIdentity 
+static struct GNUNET_PeerIdentity
 select_closest_predecessor (const struct GNUNET_PeerIdentity *peer1,
                             const struct GNUNET_PeerIdentity *peer2,
                             uint64_t value)
@@ -1861,11 +1790,11 @@ select_closest_predecessor (const struct GNUNET_PeerIdentity *peer1,
   {
     return *peer2;
   }
-  
+
   if (value < peer1_value && peer1_value < peer2_value)
   {
     return *peer2;
-  }  
+  }
   else if (value < peer2_value && peer2_value < peer1_value)
   {
     return *peer1;
@@ -1890,7 +1819,7 @@ select_closest_predecessor (const struct GNUNET_PeerIdentity *peer1,
 
 #if 0
 /**
- * 
+ *
  *
  */
 void
@@ -1899,7 +1828,7 @@ test_print_trail (struct GNUNET_PeerIdentity *trail,
 {
   struct GNUNET_PeerIdentity print_peer;
   int i;
-  
+
   FPRINTF (stderr,_("\nSUPU %s, %s, %d,trail_length = %d"),
   __FILE__, __func__,__LINE__,trail_length);
   for (i =0 ; i< trail_length; i++)
@@ -1997,7 +1926,7 @@ test_finger_table_print()
  * @param is_predecessor Is value a predecessor or any other finger.
  * @return Closest peer among two peers.
  */
-static struct GNUNET_PeerIdentity 
+static struct GNUNET_PeerIdentity
 select_closest_peer (const struct GNUNET_PeerIdentity *peer1,
                      const struct GNUNET_PeerIdentity *peer2,
                      uint64_t value,
@@ -2022,7 +1951,7 @@ select_closest_peer (const struct GNUNET_PeerIdentity *peer1,
  * Note: We use length as parameter. But we can use any other suitable parameter
  * also.
  * @param finger Finger Finger whose trail we have to select.
- * @return Trail Selected Trail. 
+ * @return Trail Selected Trail.
  */
 static struct Trail *
 select_finger_trail (struct FingerInfo *finger)
@@ -2050,7 +1979,7 @@ select_finger_trail (struct FingerInfo *finger)
     if (GNUNET_YES == is_friend_congested (friend))
       continue;
 
-    if (NULL == best_trail || 
+    if (NULL == best_trail ||
         best_trail->trail_length > current_finger_trail->trail_length)
     {
       best_trail = current_finger_trail;
@@ -2093,7 +2022,7 @@ compare_finger_and_current_closest_peer (struct Closest_Peer *current_closest_pe
     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger->finger_identity,
                                               &my_identity))
       continue;
-   
+
    /* If finger is a friend, we have already checked it in previous function. */
     if (NULL != (GNUNET_CONTAINER_multipeermap_get (friend_peermap,
                                                     &finger->finger_identity)))
@@ -2191,7 +2120,7 @@ init_closest_peer (struct GNUNET_PeerIdentity my_identity,
   current_closest_peer.is_predecessor = is_predecessor;
   current_closest_peer.next_hop = my_identity;
   current_closest_peer.best_known_destination = my_identity;
-  current_closest_peer.finger_table_index = 65; //65 is a for non valid finger table index. 
+  current_closest_peer.finger_table_index = 65; //65 is a for non valid finger table index.
   return current_closest_peer;
 }
 
@@ -2199,12 +2128,12 @@ init_closest_peer (struct GNUNET_PeerIdentity my_identity,
 /**
  * Find locally best known peer, among your own identity, friend and finger list,
  * which is closest to given destination_finger_value.
- * 
+ *
  * NOTE: In case a friend is also a finger, then it is always chosen as friend
  * not a finger.
  * @param destination_finger_value Peer closest to this value will be the next destination.
  * @param is_predecessor Are we looking for predecessor or finger?
- * @return Closest_Peer that contains all the relevant field to reach to 
+ * @return Closest_Peer that contains all the relevant field to reach to
  *                      @a destination_finger_value
  */
 static struct Closest_Peer
@@ -2232,9 +2161,8 @@ find_local_best_known_next_hop (uint64_t destination_finger_value,
   return current_closest_peer;
 }
 
+
 /**
- * FIXME; Send put message across all the trail to reach to next hop to handle
- * malicious peers.
  * Construct a Put message and send it to target_peer.
  * @param key Key for the content
  * @param block_type Type of the block
@@ -2270,7 +2198,7 @@ GDS_NEIGHBOURS_send_put (const struct GNUNET_HashCode *key,
   struct FriendInfo *target_friend;
   struct GNUNET_PeerIdentity *pp;
   size_t msize;
-  
+
   msize = put_path_length * sizeof (struct GNUNET_PeerIdentity) + data_size +
           sizeof (struct PeerPutMessage);
   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
@@ -2285,7 +2213,7 @@ GDS_NEIGHBOURS_send_put (const struct GNUNET_HashCode *key,
     GNUNET_break (0);
     return;
   }
+
   GNUNET_assert (NULL !=
                  (target_friend =
                   GNUNET_CONTAINER_multipeermap_get (friend_peermap, target_peer)));
@@ -2319,7 +2247,7 @@ GDS_NEIGHBOURS_send_put (const struct GNUNET_HashCode *key,
 
 
 /**
- * Handle the put request from the client. 
+ * Handle the put request from the client.
  * @param key Key for the content
  * @param block_type Type of the block
  * @param options Routing options
@@ -2341,62 +2269,68 @@ GDS_NEIGHBOURS_handle_put (const struct GNUNET_HashCode *key,
   struct GNUNET_PeerIdentity next_hop;
   uint64_t key_value;
   struct Closest_Peer successor;
-  
+
   memcpy (&key_value, key, sizeof (uint64_t));
   key_value = GNUNET_ntohll (key_value);
-  successor = find_local_best_known_next_hop (key_value, 
+  successor = find_local_best_known_next_hop (key_value,
                                               GDS_FINGER_TYPE_NON_PREDECESSOR);
   best_known_dest = successor.best_known_destination;
   next_hop = successor.next_hop;
   intermediate_trail_id = successor.trail_id;
 
-  DEBUG("PUT_REQUEST_RECEVIED KEY = %s \n",GNUNET_h2s(key));
   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&best_known_dest, &my_identity))
   {
+    DEBUG("\n PUT_REQUEST_SUCCESSFUL for key = %s",GNUNET_h2s(key));
     /* I am the destination. */
     GDS_DATACACHE_handle_put (expiration_time, key, 0, NULL,
                               block_type,data_size,data);
     GDS_CLIENTS_process_put (options, block_type, 0,
                              ntohl (desired_replication_level),
-                             1, &my_identity, expiration_time, //FIXME: GNUNETnthoh something on expiration time. 
+                             1, &my_identity, expiration_time, //FIXME: GNUNETnthoh something on expiration time.
                              key, data, data_size);
     return;
   }
-  
   /* In case we are sending the request to  a finger, then send across all of its
    trail.*/
-#if 0
+#if ENABLE_MALICIOUS
   if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
                                             &successor.next_hop))
   {
     struct FingerInfo *next_hop_finger;
     unsigned int i;
-    
+
     next_hop_finger = &finger_table[successor.finger_table_index];
     for (i = 0; i < next_hop_finger->trails_count; i++)
     {
       if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
       {
+        if(0 == next_hop_finger->trail_list[i].trail_length)
+        {
+           GDS_NEIGHBOURS_send_put (key, block_type, options, desired_replication_level,
+                                    best_known_dest, intermediate_trail_id, &next_hop,
+                                    0, 1, &my_identity, expiration_time,
+                                    data, data_size);
+           return;
+        }
+        next_hop = next_hop_finger->trail_list[i].trail_head->peer;
         GDS_NEIGHBOURS_send_put (key, block_type, options, desired_replication_level,
-                                 best_known_dest, 
-                                 next_hop_finger->trail_list[i].trail_id, 
-                                 &next_hop, hop_count, put_path_length, put_path,
+                                 best_known_dest,
+                                 next_hop_finger->trail_list[i].trail_id,
+                                 &next_hop, 0, 1, &my_identity,
                                  expiration_time,
                                  data, data_size);
        }
     }
+    return;
   }
-  else
 #endif
   GDS_NEIGHBOURS_send_put (key, block_type, options, desired_replication_level,
-                             best_known_dest, intermediate_trail_id, &next_hop,
-                             0, 1, &my_identity, expiration_time,
-                             data, data_size);
+ GDS_NEIGHBOURS_send_put (key, block_type, options, desired_replication_level,
+                          best_known_dest, intermediate_trail_id, &next_hop,
+                          0, 1, &my_identity, expiration_time,
+                          data, data_size);
 }
 
 /**
- * FIXME; Send get message across all the trail to reach to next hop to handle
- * malicious peers.
  * Construct a Get message and send it to target_peer.
  * @param key Key for the content
  * @param block_type Type of the block
@@ -2441,7 +2375,7 @@ GDS_NEIGHBOURS_send_get (const struct GNUNET_HashCode *key,
   }
   GNUNET_assert (NULL !=
                  (target_friend =
-                  GNUNET_CONTAINER_multipeermap_get (friend_peermap, target_peer))); 
+                  GNUNET_CONTAINER_multipeermap_get (friend_peermap, target_peer)));
 
   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
   pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
@@ -2466,15 +2400,15 @@ GDS_NEIGHBOURS_send_get (const struct GNUNET_HashCode *key,
 
 
 /**
- * Handle the get request from the client file. If I am destination do 
+ * Handle the get request from the client file. If I am destination do
  * datacache put and return. Else find the target friend and forward message
- * to it. 
+ * to it.
  * @param key Key for the content
  * @param block_type Type of the block
  * @param options Routing options
  * @param desired_replication_level Desired replication count
  */
-void 
+void
 GDS_NEIGHBOURS_handle_get(const struct GNUNET_HashCode *key,
                           enum GNUNET_BLOCK_Type block_type,
                           enum GNUNET_DHT_RouteOption options,
@@ -2484,17 +2418,16 @@ GDS_NEIGHBOURS_handle_get(const struct GNUNET_HashCode *key,
   struct GNUNET_PeerIdentity best_known_dest;
   struct GNUNET_HashCode intermediate_trail_id;
   uint64_t key_value;
-  
+
   memcpy (&key_value, key, sizeof (uint64_t));
   key_value = GNUNET_ntohll (key_value);
 
-  successor = find_local_best_known_next_hop (key_value, 
+  successor = find_local_best_known_next_hop (key_value,
                                               GDS_FINGER_TYPE_NON_PREDECESSOR);
-  
+
   best_known_dest = successor.best_known_destination;
   intermediate_trail_id = successor.trail_id;
-  
-  DEBUG("GET_REQUEST_RECEVIED KEY = %s \n",GNUNET_h2s(key));
+
   /* I am the destination. I have the data. */
   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
                                             &best_known_dest))
@@ -2503,10 +2436,39 @@ GDS_NEIGHBOURS_handle_get(const struct GNUNET_HashCode *key,
                               NULL, 0, 1, &my_identity, NULL,&my_identity);
     return;
   }
-    
-  /* fixme; for multiple trails, we need to send back finger index and send trail
-   across all the fingers. but in current implementation we don't have this case.
-   compare finger and current_successor returns, */
+
+#if ENABLE_MALICIOUS
+  struct GNUNET_PeerIdentity next_hop;
+  if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
+                                            &successor.next_hop))
+  {
+    struct FingerInfo *next_hop_finger;
+    unsigned int i;
+
+    next_hop_finger = &finger_table[successor.finger_table_index];
+    for (i = 0; i < next_hop_finger->trails_count; i++)
+    {
+      if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
+      {
+        if(0 == next_hop_finger->trail_list[i].trail_length)
+        {
+           GDS_NEIGHBOURS_send_get (key, block_type, options,
+                                    desired_replication_level,
+                                    best_known_dest,intermediate_trail_id,
+                                    &successor.next_hop,
+                                    0, 1, &my_identity);
+           return;
+        }
+        next_hop = next_hop_finger->trail_list[i].trail_head->peer;
+        GDS_NEIGHBOURS_send_get (key, block_type, options, desired_replication_level,
+                                 best_known_dest,
+                                 next_hop_finger->trail_list[i].trail_id,
+                                 &next_hop, 0, 1, &my_identity);
+       }
+    }
+    return;
+  }
+#endif
   GDS_NEIGHBOURS_send_get (key, block_type, options, desired_replication_level,
                            best_known_dest,intermediate_trail_id, &successor.next_hop,
                            0, 1, &my_identity);
@@ -2515,6 +2477,7 @@ GDS_NEIGHBOURS_handle_get(const struct GNUNET_HashCode *key,
 
 /**
  * Send the get result to requesting client.
+ *
  * @param key Key of the requested data.
  * @param type Block type
  * @param target_peer Next peer to forward the message to.
@@ -2553,8 +2516,7 @@ GDS_NEIGHBOURS_send_get_result (const struct GNUNET_HashCode *key,
   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
   {
     put_path_length = 0;
-    msize = msize - put_path_length;
-    return;
+    msize = msize - put_path_length * sizeof (struct GNUNET_PeerIdentity);
   }
 
   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
@@ -2646,7 +2608,7 @@ select_random_friend ()
   for (j = 0; j < index ; j++)
     GNUNET_assert (GNUNET_YES ==
                    GNUNET_CONTAINER_multipeermap_iterator_next (iter, NULL, NULL));
-  
+
   do
   {
     /* Reset the index in friend peermap to 0 as we reached to the end. */
@@ -2724,8 +2686,8 @@ send_find_finger_trail_message (void *cls,
   struct GNUNET_HashCode intermediate_trail_id;
   unsigned int is_predecessor = 0;
   uint64_t finger_id_value;
-  
-  /* Schedule another send_find_finger_trail_message task. After one round of 
+
+  /* Schedule another send_find_finger_trail_message task. After one round of
    * finger search, this time is exponentially backoff. */
   find_finger_trail_task_next_send_time.rel_value_us =
       find_finger_trail_task_next_send_time.rel_value_us +
@@ -2750,7 +2712,7 @@ send_find_finger_trail_message (void *cls,
   finger_id_value = compute_finger_identity_value (current_search_finger_index);
   if (PREDECESSOR_FINGER_ID == current_search_finger_index)
     is_predecessor = 1;
-  
+
   /* Generate a unique trail id for trail we are trying to setup. */
   GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
                               &trail_id, sizeof (trail_id));
@@ -2774,9 +2736,9 @@ send_find_finger_trail_message (void *cls,
  * 2. if the new trail is completely disjoint than the
  *    other trails, then may be choosing it is better.
  *
- * @param finger Finger 
+ * @param finger Finger
  * @param new_finger_trail List of peers to reach from me to @a finger, NOT
- *                         including the endpoints. 
+ *                         including the endpoints.
  * @param new_finger_trail_length Total number of peers in @a new_finger_trail
  * @param new_finger_trail_id Unique identifier of @a new_finger_trail.
  */
@@ -2814,9 +2776,9 @@ select_and_replace_trail (struct FingerInfo *finger,
   {
     next_hop = GDS_ROUTING_get_next_hop (new_trail_id, GDS_ROUTING_SRC_TO_DEST);
     GDS_ROUTING_remove_trail (new_trail_id);
-    GDS_NEIGHBOURS_send_trail_teardown (new_trail_id,
+    GDS_NEIGHBOURS_send_trail_teardown (&new_trail_id,
                                         GDS_ROUTING_SRC_TO_DEST,
-                                        *next_hop);
+                                        next_hop);
     return;
   }
 
@@ -2824,10 +2786,10 @@ select_and_replace_trail (struct FingerInfo *finger,
   struct Trail *replace_trail = &finger->trail_list[largest_trail_index];
   next_hop = GDS_ROUTING_get_next_hop (replace_trail->trail_id, GDS_ROUTING_SRC_TO_DEST);
   GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (replace_trail->trail_id));
-  GDS_NEIGHBOURS_send_trail_teardown (replace_trail->trail_id,
+  GDS_NEIGHBOURS_send_trail_teardown (&replace_trail->trail_id,
                                       GDS_ROUTING_SRC_TO_DEST,
-                                      *next_hop);
+                                      next_hop);
+
   /* Free the trail. */
   while (NULL != (trail_element = replace_trail->trail_head))
   {
@@ -2840,7 +2802,7 @@ select_and_replace_trail (struct FingerInfo *finger,
   replace_trail->is_present = GNUNET_YES;
   replace_trail->trail_length = new_trail_length;
   replace_trail->trail_id = new_trail_id;
-  
+
   for (i = 0; i < new_trail_length; i++)
   {
     struct Trail_Element *element = GNUNET_new (struct Trail_Element);
@@ -2872,7 +2834,7 @@ is_new_trail_unique (struct FingerInfo *existing_finger,
   struct Trail_Element *trail_element;
   int i;
   int j;
-  
+
   GNUNET_assert (existing_finger->trails_count > 0);
 
   /* Iterate over list of trails. */
@@ -2902,11 +2864,11 @@ is_new_trail_unique (struct FingerInfo *existing_finger,
   return GNUNET_NO;
 }
 
-/** 
+/**
  * FIXME; In case of multiple trails, we may have a case where a trail from in
  * between has been removed, then we should try to find a free slot , not simply
- * add a trail at then end of the list. 
- * Add a new trail at a free slot in trail array of existing finger. 
+ * add a trail at then end of the list.
+ * Add a new trail at a free slot in trail array of existing finger.
  * @param existing_finger Finger
  * @param new_finger_trail New trail from me to finger, NOT including endpoints
  * @param new_finger_trail_length Total number of peers in @a new_finger_trail
@@ -2922,11 +2884,11 @@ add_new_trail (struct FingerInfo *existing_finger,
   struct Trail *trail;
   unsigned int i;
   int free_slot = -1;
-  
+
   if (GNUNET_NO == is_new_trail_unique (existing_finger, new_trail,
                                         new_trail_length))
     return;
-  
+
   for (i = 0; i < existing_finger->trails_count; i++)
   {
     if (GNUNET_NO == existing_finger->trail_list[i].is_present)
@@ -2935,10 +2897,10 @@ add_new_trail (struct FingerInfo *existing_finger,
       break;
     }
   }
-  
+
   if (-1 == free_slot)
     free_slot = i;
-  
+
   trail = &existing_finger->trail_list[free_slot];
   GNUNET_assert (GNUNET_NO == trail->is_present);
   trail->trail_id = new_trail_id;
@@ -2955,7 +2917,7 @@ add_new_trail (struct FingerInfo *existing_finger,
     friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
                                                 &new_trail[0]);
   }
-  
+  GNUNET_assert (NULL != friend);
   friend->trails_count++;
   for (i = 0; i < new_trail_length; i++)
   {
@@ -2967,7 +2929,7 @@ add_new_trail (struct FingerInfo *existing_finger,
                                       trail->trail_tail,
                                       element);
   }
-  
+
   existing_finger->trail_list[free_slot].trail_head = trail->trail_head;
   existing_finger->trail_list[free_slot].trail_tail = trail->trail_tail;
   existing_finger->trail_list[free_slot].trail_length = new_trail_length;
@@ -2977,11 +2939,11 @@ add_new_trail (struct FingerInfo *existing_finger,
 
 
 #if 0
-/** 
+/**
  * FIXME; In case of multiple trails, we may have a case where a trail from in
  * between has been removed, then we should try to find a free slot , not simply
- * add a trail at then end of the list. 
- * Add a new trail at a free slot in trail array of existing finger. 
+ * add a trail at then end of the list.
+ * Add a new trail at a free slot in trail array of existing finger.
  * @param existing_finger Finger
  * @param new_finger_trail New trail from me to finger, NOT including endpoints
  * @param new_finger_trail_length Total number of peers in @a new_finger_trail
@@ -2997,11 +2959,11 @@ add_new_trail (struct FingerInfo *existing_finger,
   struct FriendInfo *first_friend;
   int i;
   int index;
-  
+
   if (GNUNET_NO == is_new_trail_unique (existing_finger, new_trail,
                                         new_trail_length))
     return;
-  
+
   index = existing_finger->trails_count;
   trail = &existing_finger->trail_list[index];
   GNUNET_assert (GNUNET_NO == trail->is_present);
@@ -3091,9 +3053,9 @@ send_trail_teardown (struct FingerInfo *finger,
   }
   GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (trail->trail_id));
   friend->trails_count--;
-  GDS_NEIGHBOURS_send_trail_teardown (trail->trail_id,
+  GDS_NEIGHBOURS_send_trail_teardown (&trail->trail_id,
                                       GDS_ROUTING_SRC_TO_DEST,
-                                      friend->id);
+                                      &friend->id);
 }
 
 
@@ -3105,11 +3067,13 @@ static void
 send_all_finger_trails_teardown (struct FingerInfo *finger)
 {
   unsigned int i;
+
   for (i = 0; i < finger->trails_count; i++)
   {
     struct Trail *trail;
+
     trail = &finger->trail_list[i];
-    if (GNUNET_YES == trail->is_present);
+    if (GNUNET_YES == trail->is_present)
     {
       send_trail_teardown (finger, trail);
       trail->is_present = GNUNET_NO;
@@ -3186,13 +3150,13 @@ add_new_finger (struct GNUNET_PeerIdentity finger_identity,
   struct FingerInfo *new_entry;
   struct FriendInfo *first_trail_hop;
   struct Trail *trail;
-  int i;
-  
+  unsigned int i;
+
   new_entry = GNUNET_new (struct FingerInfo);
   new_entry->finger_identity = finger_identity;
   new_entry->finger_table_index = finger_table_index;
   new_entry->is_present = GNUNET_YES;
-  
+
   /* If the new entry is my own identity. */
   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
                                             &finger_identity))
@@ -3202,7 +3166,7 @@ add_new_finger (struct GNUNET_PeerIdentity finger_identity,
     GNUNET_free (new_entry);
     return;
   }
-  
+
   /* Finger is a friend. */
   if (0 == finger_trail_length)
   {
@@ -3228,9 +3192,9 @@ add_new_finger (struct GNUNET_PeerIdentity finger_identity,
                        GNUNET_CONTAINER_multipeermap_get (friend_peermap,
                                                           &finger_trail[0])));
   new_entry->trails_count = 1;
-  first_trail_hop->trails_count++;  
+  first_trail_hop->trails_count++;
   /* Copy the finger trail into trail. */
-  trail = GNUNET_new (struct Trail);
+  trail = &new_entry->trail_list[0];
   for(i = 0; i < finger_trail_length; i++)
   {
     struct Trail_Element *element = GNUNET_new (struct Trail_Element);
@@ -3242,16 +3206,13 @@ add_new_finger (struct GNUNET_PeerIdentity finger_identity,
                                       trail->trail_tail,
                                       element);
   }
+
   /* Add trail to trail list. */
-  new_entry->trail_list[0].trail_head = trail->trail_head;
-  new_entry->trail_list[0].trail_tail = trail->trail_tail;
-  new_entry->trail_list[0].trail_length = finger_trail_length;
-  new_entry->trail_list[0].trail_id = trail_id;
-  new_entry->trail_list[0].is_present = GNUNET_YES;
+  trail->trail_length = finger_trail_length;
+  trail->trail_id = trail_id;
+  trail->is_present = GNUNET_YES;
   finger_table[finger_table_index] = *new_entry;
   GNUNET_free (new_entry);
-  return;
 }
 
 
@@ -3275,10 +3236,10 @@ send_verify_successor_message (void *cls,
   struct FingerInfo *successor;
 
   successor = &finger_table[0];
-  
+
   /* This task will be scheduled when the result for Verify Successor is received. */
-  send_verify_successor_task = GNUNET_SCHEDULER_NO_TASK;
-  
+  send_verify_successor_task = NULL;
+
   /* When verify successor is being called for first time *for current context*
    * cls will be NULL. If send_verify_successor_retry_task is not NO_TASK, we
    * must cancel the retry task scheduled for verify_successor of previous
@@ -3289,42 +3250,42 @@ send_verify_successor_message (void *cls,
     /* FIXME: Here we are scheduling a new verify successor task, as we
      got a new successor. But a send verify successor task may be in progress.
      1. We need to be sure that this is indeed a new successor. As this function
-     is called even if we add a new trail to reach t old successor. 
+     is called even if we add a new trail to reach t old successor.
      2. Assuming the new successor is different, then verify successor message
      * to old successor may be following stages.
      * --> Waiting for verify successor result. Don't wait anymore. there is
      *     no trail to reach from old successor to me, hence, routing
      *     lookup will fail.
-     * --> Waiting for notify confirmation. again don't wait for it. notify 
-     *    confirmation will not succeded. 
+     * --> Waiting for notify confirmation. again don't wait for it. notify
+     *    confirmation will not succeded.
      */
-    if (send_verify_successor_retry_task != GNUNET_SCHEDULER_NO_TASK)
+    if (send_verify_successor_retry_task != NULL)
     {
       /* FIXME: Are we scheduling retry task as soon as we send verify message.
        If yes then here before making this task, first check if the message
        is for the same peer again. */
-      struct VerifySuccessorContext *old_ctx = 
+      struct VerifySuccessorContext *old_ctx =
           GNUNET_SCHEDULER_cancel(send_verify_successor_retry_task);
       /* old_ctx must not be NULL, as the retry task had been scheduled */
       GNUNET_assert(NULL != old_ctx);
       GNUNET_free(old_ctx);
       /* FIXME: Why don't we reset the task to NO_TASK here? */
     }
-    
+
     struct VerifySuccessorContext *ctx;
     ctx = GNUNET_new(struct VerifySuccessorContext);
-    
+
     ctx->num_retries_scheduled++;
     send_verify_successor_retry_task =
         GNUNET_SCHEDULER_add_delayed (verify_successor_retry_time,
                                       &send_verify_successor_message,
                                       ctx);
-  }  
+  }
   else
   {
     /* This is a retry attempt for verify_successor for a previous context */
     struct VerifySuccessorContext *ctx;
-    
+
     ctx = cls;
     ctx->num_retries_scheduled++;
     send_verify_successor_retry_task =
@@ -3332,7 +3293,7 @@ send_verify_successor_message (void *cls,
                                       &send_verify_successor_message,
                                       ctx);
   }
-  
+
   /* Among all the trails to reach to successor, select first one which is present.*/
   for (i = 0; i < successor->trails_count; i++)
   {
@@ -3340,11 +3301,11 @@ send_verify_successor_message (void *cls,
     if(GNUNET_YES == trail->is_present)
       break;
   }
-  
+
   /* No valid trail found to reach to successor. */
   if (i == successor->trails_count)
     return;
-  
+
   GNUNET_assert(0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
                                                       &successor->finger_identity));
   /* Trail stored at this index. */
@@ -3392,7 +3353,7 @@ send_verify_successor_message (void *cls,
 /**
  * FIXME: should this be a periodic task, incrementing the search finger index?
  * Update the current search finger index.
- * @a finger_identity 
+ * @a finger_identity
  * @a finger_table_index
  */
 static void
@@ -3413,9 +3374,9 @@ update_current_search_finger_index (unsigned int finger_table_index)
     current_search_finger_index = PREDECESSOR_FINGER_ID;
     if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &successor->finger_identity))
     {
-      if (GNUNET_SCHEDULER_NO_TASK == send_verify_successor_task)
+      if (NULL == send_verify_successor_task)
       {
-        send_verify_successor_task = 
+        send_verify_successor_task =
                 GNUNET_SCHEDULER_add_now (&send_verify_successor_message, NULL);
       }
     }
@@ -3501,7 +3462,7 @@ get_finger_table_index (uint64_t ultimate_destination_finger_value,
 
 /**
  * Remove finger and its associated data structures from finger table.
- * @param existing_finger Finger to be removed which is in finger table. 
+ * @param existing_finger Finger to be removed which is in finger table.
  * @param finger_table_index Index in finger table where @a existing_finger
  *                           is stored.
  */
@@ -3525,188 +3486,6 @@ remove_existing_finger (struct FingerInfo *existing_finger,
    finger, and free the finger. */
   send_all_finger_trails_teardown (existing_finger);
   free_finger (existing_finger, finger_table_index);
-  return;
-}
-
-/*
- * Core handle for p2p trail tear compression messages.
- * @param cls closure
- * @param message message
- * @param peer peer identity this notification is about
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
- */
-static int
-handle_dht_p2p_trail_compression (void *cls, const struct GNUNET_PeerIdentity *peer,
-                                  const struct GNUNET_MessageHeader *message)
-{
-  const struct PeerTrailCompressionMessage *trail_compression;
-  struct GNUNET_PeerIdentity *next_hop;
-  struct FriendInfo *target_friend;
-  struct GNUNET_HashCode trail_id;
-  size_t msize;
-
-  msize = ntohs (message->size);
-
-  if (msize != sizeof (struct PeerTrailCompressionMessage))
-  {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
-  }
-
-  GNUNET_STATISTICS_update (GDS_stats,
-                            gettext_noop
-                            ("# Bytes received from other peers"), msize,
-                            GNUNET_NO);
-  
-  trail_compression = (const struct PeerTrailCompressionMessage *) message;
-  trail_id = trail_compression->trail_id;
-
-  /* Am I the new first friend to reach to finger of this trail. */
-  if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&trail_compression->new_first_friend,
-                                             &my_identity)))
-  {
-    if (NULL ==
-         (GNUNET_CONTAINER_multipeermap_get (friend_peermap,
-                                             &trail_compression->source_peer)))
-    {
-      GNUNET_break_op(0);
-      return GNUNET_OK;
-    }
-
-    /* Update your prev hop to source of this message. */
-    if(GNUNET_SYSERR ==
-                  (GDS_ROUTING_update_trail_prev_hop (trail_id,
-                                                      trail_compression->source_peer)))
-    {
-      GNUNET_break(0);
-      return GNUNET_OK;
-    }
-    return GNUNET_OK;
-  }
-
-  /* Pass the message to next hop to finally reach to new_first_friend. */
-  next_hop = GDS_ROUTING_get_next_hop (trail_id, GDS_ROUTING_SRC_TO_DEST);
-
-  if (NULL == next_hop)
-  {
-    GNUNET_break (0);
-    return GNUNET_OK;
-  }
-
-  if( NULL == (target_friend =
-                 GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop)))
-  {
-    GNUNET_break_op(0);
-    return GNUNET_OK;
-  }
-
-  GDS_ROUTING_remove_trail (trail_id);
-
-  GDS_NEIGHBOURS_send_trail_compression (trail_compression->source_peer,
-                                         trail_id,
-                                         trail_compression->new_first_friend,
-                                         target_friend);
-  return GNUNET_OK;
-}
-
-
-/**
- * Scan the trail to check if there is any other friend in the trail other than
- * first hop. If yes then shortcut the trail, send trail compression message to
- * peers which are no longer part of trail and send back the updated trail
- * and trail_length to calling function.
- * @param finger_identity Finger whose trail we will scan.
- * @param finger_trail [in, out] Trail to reach from source to finger,
- * @param finger_trail_length  Total number of peers in original finger_trail.
- * @param finger_trail_id Unique identifier of the finger trail.
- * @return updated trail length in case we shortcut the trail, else original
- *         trail length.
- */
-static struct GNUNET_PeerIdentity *
-scan_and_compress_trail (struct GNUNET_PeerIdentity finger_identity,
-                         const struct GNUNET_PeerIdentity *trail,
-                         unsigned int trail_length,
-                         struct GNUNET_HashCode trail_id,
-                         int *new_trail_length)
-{
-  struct FriendInfo *target_friend;
-  struct GNUNET_PeerIdentity *new_trail;
-  unsigned int i;
-
-  /* I am my own finger. */
-  if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &finger_identity))
-  {
-    *new_trail_length = 0;
-    return NULL;
-  }
-
-  if (0 == trail_length)
-  {
-    *new_trail_length = 0;
-    return NULL;
-  }
-
-  /* If finger identity is a friend. */
-  if (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap, &finger_identity))
-  {
-    *new_trail_length = 0;
-
-    /* If there is trail to reach this finger/friend */
-    if (trail_length > 0)
-    {
-      /* Finger is your first friend. */
-      GDS_ROUTING_update_trail_next_hop (trail_id, finger_identity);
-      GNUNET_assert (NULL !=
-                    (target_friend =
-                     GNUNET_CONTAINER_multipeermap_get (friend_peermap,
-                                                        &trail[0])));
-
-
-      GDS_NEIGHBOURS_send_trail_compression (my_identity,
-                                             trail_id, finger_identity,
-                                             target_friend);
-    }
-    return NULL;
-  }
-
-  /*  For other cases, when its neither a friend nor my own identity.*/
-  for (i = trail_length - 1; i > 0; i--)
-  {
-    /* If the element at this index in trail is a friend. */
-    if (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap, &trail[i]))
-    {
-      struct FriendInfo *target_friend;
-      int j = 0;
-
-      GNUNET_assert (NULL !=
-                    (target_friend =
-                     GNUNET_CONTAINER_multipeermap_get (friend_peermap,
-                                                        &trail[0])));
-      GDS_ROUTING_update_trail_next_hop (trail_id, trail[i]);
-      GDS_NEIGHBOURS_send_trail_compression (my_identity,
-                                             trail_id, trail[i],
-                                             target_friend);
-
-
-      /* Copy the trail from index i to index (trail_length -1) into a new trail
-       *  and update new trail length */
-      *new_trail_length = trail_length - i;
-      new_trail = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity) * (*new_trail_length));
-      while (i < trail_length)
-      {
-        memcpy (&new_trail[j], &trail[i], sizeof(struct GNUNET_PeerIdentity));
-        j++;
-        i++;
-      }
-      return new_trail;
-    }
-  }
-
-  /* If we did not compress the trail, return the original trail back.*/
-  *new_trail_length = trail_length;
-  new_trail = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity) * trail_length);  
-  memcpy (new_trail, trail, trail_length * sizeof (struct GNUNET_PeerIdentity));
-  return new_trail;
 }
 
 
@@ -3743,8 +3522,6 @@ finger_table_add (struct GNUNET_PeerIdentity finger_identity,
   struct GNUNET_PeerIdentity closest_peer;
   struct FingerInfo *successor;
   unsigned int finger_table_index;
-  struct GNUNET_PeerIdentity *updated_trail;
-  int updated_finger_trail_length;
 
   /* Get the finger_table_index corresponding to finger_value we got from network.*/
   finger_table_index = get_finger_table_index (finger_value, is_predecessor);
@@ -3771,7 +3548,7 @@ finger_table_add (struct GNUNET_PeerIdentity finger_identity,
     {
       if (0 == fingers_round_count)
       {
-         find_finger_trail_task_next_send_time = 
+         find_finger_trail_task_next_send_time =
               GNUNET_TIME_STD_BACKOFF(find_finger_trail_task_next_send_time);
       }
       else
@@ -3784,7 +3561,7 @@ finger_table_add (struct GNUNET_PeerIdentity finger_identity,
       total_fingers_found  = 0;
       return;
     }
-    
+
     struct FingerInfo prev_finger;
     prev_finger = finger_table[finger_table_index - 1];
     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
@@ -3794,21 +3571,16 @@ finger_table_add (struct GNUNET_PeerIdentity finger_identity,
        return;
     }
   }
-  
+
   total_fingers_found++;
   existing_finger = &finger_table[finger_table_index];
-  
+
   /* No entry present in finger_table for given finger map index. */
   if (GNUNET_NO == existing_finger->is_present)
   {
      /* Shorten the trail if possible. */
-    updated_finger_trail_length = finger_trail_length;
-    updated_trail = scan_and_compress_trail (finger_identity, finger_trail,
-                                             finger_trail_length,
-                                             finger_trail_id,
-                                             &updated_finger_trail_length);
-    add_new_finger (finger_identity, updated_trail,
-                    updated_finger_trail_length,
+    add_new_finger (finger_identity, finger_trail,
+                    finger_trail_length,
                     finger_trail_id, finger_table_index);
     update_current_search_finger_index (finger_table_index);
     return;
@@ -3822,17 +3594,12 @@ finger_table_add (struct GNUNET_PeerIdentity finger_identity,
                                         &finger_identity,
                                         finger_value,
                                         is_predecessor);
+
     /* If the new finger is the closest peer. */
     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity, &closest_peer))
     {
-      updated_finger_trail_length = finger_trail_length;
-      updated_trail = scan_and_compress_trail (finger_identity, finger_trail,
-                                             updated_finger_trail_length,
-                                             finger_trail_id,
-                                             &updated_finger_trail_length);
       remove_existing_finger (existing_finger, finger_table_index);
-      add_new_finger (finger_identity, updated_trail, updated_finger_trail_length,
+      add_new_finger (finger_identity, finger_trail, finger_trail_length,
                       finger_trail_id, finger_table_index);
     }
     else
@@ -3842,13 +3609,13 @@ finger_table_add (struct GNUNET_PeerIdentity finger_identity,
       if (0 != GNUNET_CRYPTO_cmp_peer_identity (&finger_identity, &my_identity))
       {
         if (finger_trail_length > 0)
-          GDS_NEIGHBOURS_send_trail_teardown (finger_trail_id,
+          GDS_NEIGHBOURS_send_trail_teardown (&finger_trail_id,
                                               GDS_ROUTING_SRC_TO_DEST,
-                                              finger_trail[0]);
+                                              &finger_trail[0]);
         else
-          GDS_NEIGHBOURS_send_trail_teardown (finger_trail_id,
+          GDS_NEIGHBOURS_send_trail_teardown (&finger_trail_id,
                                               GDS_ROUTING_SRC_TO_DEST,
-                                              finger_identity);
+                                              &finger_identity);
       }
     }
   }
@@ -3860,18 +3627,14 @@ finger_table_add (struct GNUNET_PeerIdentity finger_identity,
     {
       return;
     }
-    updated_finger_trail_length = finger_trail_length;
-    updated_trail = scan_and_compress_trail (finger_identity, finger_trail,
-                                             finger_trail_length,
-                                             finger_trail_id,
-                                             &updated_finger_trail_length);
+
     /* If there is space to store more trails. */
     if (existing_finger->trails_count < MAXIMUM_TRAILS_PER_FINGER)
-        add_new_trail (existing_finger, updated_trail,
-                       updated_finger_trail_length, finger_trail_id);
+        add_new_trail (existing_finger, finger_trail,
+                       finger_trail_length, finger_trail_id);
     else
-        select_and_replace_trail (existing_finger, updated_trail,
-                                  updated_finger_trail_length, finger_trail_id);
+        select_and_replace_trail (existing_finger, finger_trail,
+                                  finger_trail_length, finger_trail_id);
   }
   update_current_search_finger_index (finger_table_index);
   return;
@@ -3879,8 +3642,6 @@ finger_table_add (struct GNUNET_PeerIdentity finger_identity,
 
 
 /**
- * FIXME: Check for loop in the request. If you already are part of put path,
- * then you need to reset the put path length.
  * Core handler for P2P put messages.
  * @param cls closure
  * @param peer sender of the request
@@ -3898,7 +3659,7 @@ handle_dht_p2p_put (void *cls, const struct GNUNET_PeerIdentity *peer,
   struct GNUNET_PeerIdentity best_known_dest;
   struct GNUNET_HashCode received_intermediate_trail_id;
   struct GNUNET_HashCode intermediate_trail_id;
-  struct GNUNET_PeerIdentity *next_hop;
+  struct GNUNET_PeerIdentity next_hop;
   struct GNUNET_PeerIdentity *next_routing_hop;
   enum GNUNET_DHT_RouteOption options;
   struct GNUNET_HashCode test_key;
@@ -3909,14 +3670,6 @@ handle_dht_p2p_put (void *cls, const struct GNUNET_PeerIdentity *peer,
   size_t payload_size;
   uint64_t key_value;
 
-#if ENABLE_MALICIOUS
-  if(1 == act_malicious)
-  {
-    DEBUG("I am malicious,dropping put request. \n");
-    return GNUNET_OK;
-  }
-#endif
-  
   msize = ntohs (message->size);
   if (msize < sizeof (struct PeerPutMessage))
   {
@@ -3935,12 +3688,18 @@ handle_dht_p2p_put (void *cls, const struct GNUNET_PeerIdentity *peer,
     GNUNET_break_op (0);
     return GNUNET_OK;
   }
-  
+#if ENABLE_MALICIOUS
+  if(1 == act_malicious)
+  {
+    DEBUG("\n I AM MALICIOUS PUT_REQUEST_DROPPED for key = %ss",GNUNET_h2s(&put->key));
+    return GNUNET_OK;
+  }
+#endif
   GNUNET_STATISTICS_update (GDS_stats,
                             gettext_noop
                             ("# Bytes received from other peers"), (int64_t) msize,
                             GNUNET_NO);
-  
+
   current_best_known_dest = put->best_known_destination;
   put_path = (struct GNUNET_PeerIdentity *) &put[1];
   payload = &put_path[putlen];
@@ -3977,6 +3736,7 @@ handle_dht_p2p_put (void *cls, const struct GNUNET_PeerIdentity *peer,
   {
     switch (GNUNET_BLOCK_evaluate (GDS_block_context,
                                    ntohl (put->block_type),
+                                   GNUNET_BLOCK_EO_NONE,
                                    NULL,    /* query */
                                    NULL, 0, /* bloom filer */
                                    NULL, 0, /* xquery */
@@ -3997,7 +3757,7 @@ handle_dht_p2p_put (void *cls, const struct GNUNET_PeerIdentity *peer,
       return GNUNET_OK;
     }
   }
-  
+
   /* Check if you are already a part of put path. */
   unsigned int i;
   for (i = 0; i < putlen; i++)
@@ -4008,7 +3768,7 @@ handle_dht_p2p_put (void *cls, const struct GNUNET_PeerIdentity *peer,
       break;
     }
   }
-    
+
   /* Add yourself to the list. */
   struct GNUNET_PeerIdentity pp[putlen + 1];
   //if (0 != (options & GNUNET_DHT_RO_RECORD_ROUTE))
@@ -4020,29 +3780,28 @@ handle_dht_p2p_put (void *cls, const struct GNUNET_PeerIdentity *peer,
   }
   else
     putlen = 0;
-  
+
   memcpy (&key_value, &(put->key), sizeof (uint64_t));
   struct Closest_Peer successor;
   key_value = GNUNET_ntohll (key_value);
-  successor = find_local_best_known_next_hop (key_value, 
+  successor = find_local_best_known_next_hop (key_value,
                                               GDS_FINGER_TYPE_NON_PREDECESSOR);
-  next_hop = GNUNET_new (struct GNUNET_PeerIdentity);
-  *next_hop = successor.next_hop;
+  next_hop = successor.next_hop;
   intermediate_trail_id = successor.trail_id;
   best_known_dest = successor.best_known_destination;
-  
+
   if (0 != (GNUNET_CRYPTO_cmp_peer_identity (&current_best_known_dest, &my_identity)))
   {
     next_routing_hop = GDS_ROUTING_get_next_hop (received_intermediate_trail_id,
                                                  GDS_ROUTING_SRC_TO_DEST);
     if (NULL != next_routing_hop)
     {
-      next_hop = next_routing_hop;
+      next_hop = *next_routing_hop;
       intermediate_trail_id = received_intermediate_trail_id;
-      best_known_dest = current_best_known_dest; 
+      best_known_dest = current_best_known_dest;
     }
   }
-  
+
   GDS_CLIENTS_process_put (options,
                            ntohl (put->block_type),
                            hop_count,
@@ -4056,19 +3815,57 @@ handle_dht_p2p_put (void *cls, const struct GNUNET_PeerIdentity *peer,
   /* I am the final destination */
   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &best_known_dest))
   {
+    DEBUG("\n PUT_REQUEST_SUCCESSFUL for key = %s",GNUNET_h2s(&put->key));
     GDS_DATACACHE_handle_put (GNUNET_TIME_absolute_ntoh (put->expiration_time),
                               &(put->key),putlen, pp, ntohl (put->block_type),
                               payload_size, payload);
   }
   else
   {
-    GDS_NEIGHBOURS_send_put (&put->key,
-                             ntohl (put->block_type),ntohl (put->options),
-                             ntohl (put->desired_replication_level),
-                             best_known_dest, intermediate_trail_id, next_hop,
-                             hop_count, putlen, pp,
-                             GNUNET_TIME_absolute_ntoh (put->expiration_time),
-                             payload, payload_size);
+#if ENABLE_MALICIOUS
+  if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
+                                            &successor.next_hop))
+  {
+    struct FingerInfo *next_hop_finger;
+    unsigned int i;
+
+    next_hop_finger = &finger_table[successor.finger_table_index];
+    for (i = 0; i < next_hop_finger->trails_count; i++)
+    {
+      if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
+      {
+        if(0 == next_hop_finger->trail_list[i].trail_length)
+        {
+          GDS_NEIGHBOURS_send_put (&put->key,
+                                  ntohl (put->block_type),ntohl (put->options),
+                                  ntohl (put->desired_replication_level),
+                                  best_known_dest, intermediate_trail_id, &next_hop,
+                                  hop_count, putlen, pp,
+                                  GNUNET_TIME_absolute_ntoh (put->expiration_time),
+                                  payload, payload_size);
+          return GNUNET_OK;
+        }
+        next_hop = next_hop_finger->trail_list[i].trail_head->peer;
+        GDS_NEIGHBOURS_send_put (&put->key,
+                                 ntohl (put->block_type),ntohl (put->options),
+                                 ntohl (put->desired_replication_level),
+                                 best_known_dest,
+                                 next_hop_finger->trail_list[i].trail_id,
+                                 &next_hop, hop_count, putlen, pp,
+                                 GNUNET_TIME_absolute_ntoh (put->expiration_time),
+                                 payload, payload_size);
+       }
+    }
+    return GNUNET_OK;
+  }
+#endif
+  GDS_NEIGHBOURS_send_put (&put->key,
+                           ntohl (put->block_type),ntohl (put->options),
+                           ntohl (put->desired_replication_level),
+                           best_known_dest, intermediate_trail_id, &next_hop,
+                           hop_count, putlen, pp,
+                           GNUNET_TIME_absolute_ntoh (put->expiration_time),
+                           payload, payload_size);
    }
   return GNUNET_OK;
 }
@@ -4096,21 +3893,13 @@ handle_dht_p2p_get (void *cls, const struct GNUNET_PeerIdentity *peer,
   struct GNUNET_HashCode intermediate_trail_id;
   struct GNUNET_HashCode received_intermediate_trail_id;
   struct Closest_Peer successor;
-  struct GNUNET_PeerIdentity *next_hop;
+  struct GNUNET_PeerIdentity next_hop;
   struct GNUNET_PeerIdentity *next_routing_hop;
   uint32_t get_length;
   uint64_t key_value;
   uint32_t hop_count;
   size_t msize;
 
-#if ENABLE_MALICIOUS
-  if(1 == act_malicious)
-  {
-    DEBUG("I am malicious,dropping get request. \n");
-    return GNUNET_OK;
-  }
-#endif
-  
   msize = ntohs (message->size);
   if (msize < sizeof (struct PeerGetMessage))
   {
@@ -4120,12 +3909,6 @@ handle_dht_p2p_get (void *cls, const struct GNUNET_PeerIdentity *peer,
 
   get = (const struct PeerGetMessage *)message;
   get_length = ntohl (get->get_path_length);
-  current_best_known_dest = get->best_known_destination;
-  received_intermediate_trail_id = get->intermediate_trail_id;
-  get_path = (const struct GNUNET_PeerIdentity *)&get[1];
-  hop_count = get->hop_count;
-  hop_count++;
-  
   if ((msize <
        sizeof (struct PeerGetMessage) +
        get_length * sizeof (struct GNUNET_PeerIdentity)) ||
@@ -4135,15 +3918,29 @@ handle_dht_p2p_get (void *cls, const struct GNUNET_PeerIdentity *peer,
     GNUNET_break_op (0);
     return GNUNET_YES;
   }
-  
+
+#if ENABLE_MALICIOUS
+  if(1 == act_malicious)
+  {
+    DEBUG("I am malicious,GET_REQUEST_DROPPED for key = %s. \n",GNUNET_h2s(&get->key));
+    return GNUNET_OK;
+  }
+#endif
+  current_best_known_dest = get->best_known_destination;
+  received_intermediate_trail_id = get->intermediate_trail_id;
+  get_path = (const struct GNUNET_PeerIdentity *)&get[1];
+  hop_count = get->hop_count;
+  hop_count++;
+
+
   GNUNET_STATISTICS_update (GDS_stats,
                             gettext_noop
                             ("# Bytes received from other peers"), msize,
                             GNUNET_NO);
-  
+
   memcpy (&key_value, &(get->key), sizeof (uint64_t));
   key_value = GNUNET_ntohll (key_value);
-  
+
   /* Check if you are already a part of get path. */
   unsigned int i;
   for (i = 0; i < get_length; i++)
@@ -4154,7 +3951,7 @@ handle_dht_p2p_get (void *cls, const struct GNUNET_PeerIdentity *peer,
       break;
     }
   }
-  
+
   /* Add yourself in the get path. */
   struct GNUNET_PeerIdentity gp[get_length + 1];
   memcpy (gp, get_path, get_length * sizeof (struct GNUNET_PeerIdentity));
@@ -4163,12 +3960,11 @@ handle_dht_p2p_get (void *cls, const struct GNUNET_PeerIdentity *peer,
   GDS_CLIENTS_process_get (get->options, get->block_type, hop_count,
                            get->desired_replication_level, get->get_path_length,
                            gp, &get->key);
-  
 
-  successor = find_local_best_known_next_hop (key_value, 
+
+  successor = find_local_best_known_next_hop (key_value,
                                                 GDS_FINGER_TYPE_NON_PREDECESSOR);
-  next_hop = GNUNET_new (struct GNUNET_PeerIdentity);
-  *next_hop = successor.next_hop;
+  next_hop = successor.next_hop;
   best_known_dest = successor.best_known_destination;
   intermediate_trail_id = successor.trail_id;
   /* I am not the final destination. I am part of trail to reach final dest. */
@@ -4178,33 +3974,65 @@ handle_dht_p2p_get (void *cls, const struct GNUNET_PeerIdentity *peer,
                                                   GDS_ROUTING_SRC_TO_DEST);
     if (NULL != next_routing_hop)
     {
-      next_hop = next_routing_hop;
+      next_hop = *next_routing_hop;
       best_known_dest = current_best_known_dest;
       intermediate_trail_id = received_intermediate_trail_id;
     }
   }
-   
+
   /* I am the final destination. */
   if (0 == GNUNET_CRYPTO_cmp_peer_identity(&my_identity, &best_known_dest))
   {
     if (1 == get_length)
     {
+      DEBUG("\n GET_REQUEST DONE for key = %s",GNUNET_h2s(&get->key));
       GDS_DATACACHE_handle_get (&(get->key),(get->block_type), NULL, 0,
                                 NULL, 0, 1, &my_identity, NULL,&my_identity);
     }
     else
     {
       GDS_DATACACHE_handle_get (&(get->key),(get->block_type), NULL, 0, NULL, 0,
-                                get_length, gp, &gp[get_length - 2], 
+                                get_length, gp, &gp[get_length - 2],
                                 &my_identity);
     }
   }
   else
   {
+
+#if ENABLE_MALICIOUS
+  if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
+                                            &successor.next_hop))
+  {
+    struct FingerInfo *next_hop_finger;
+    unsigned int i;
+
+    next_hop_finger = &finger_table[successor.finger_table_index];
+    for (i = 0; i < next_hop_finger->trails_count; i++)
+    {
+      if(0 == next_hop_finger->trail_list[i].trail_length)
+      {
+        GDS_NEIGHBOURS_send_get (&(get->key), get->block_type, get->options,
+                                get->desired_replication_level, best_known_dest,
+                                intermediate_trail_id, &next_hop, hop_count,
+                                get_length, gp);
+        return GNUNET_OK;
+      }
+      if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
+      {
+        next_hop = next_hop_finger->trail_list[i].trail_head->peer;
+        GDS_NEIGHBOURS_send_get (&(get->key), get->block_type, get->options,
+                                 get->desired_replication_level, best_known_dest,
+                                 next_hop_finger->trail_list[i].trail_id,
+                                 &next_hop, hop_count,
+                                 get_length, gp);
+       }
+    }
+    return GNUNET_OK;
+  }
+#endif
     GDS_NEIGHBOURS_send_get (&(get->key), get->block_type, get->options,
                              get->desired_replication_level, best_known_dest,
-                             intermediate_trail_id, next_hop, hop_count,
+                             intermediate_trail_id, &next_hop, hop_count,
                              get_length, gp);
   }
   return GNUNET_YES;
@@ -4261,7 +4089,7 @@ handle_dht_p2p_get_result (void *cls, const struct GNUNET_PeerIdentity *peer,
                             gettext_noop
                             ("# Bytes received from other peers"), msize,
                             GNUNET_NO);
-  
+
   put_path = (const struct GNUNET_PeerIdentity *) &get_result[1];
   get_path = &put_path[putlen];
   payload = (const void *) &get_path[getlen];
@@ -4333,7 +4161,7 @@ get_local_best_known_next_hop (uint64_t final_dest_finger_val,
                                             current_dest))
   {
     struct GNUNET_PeerIdentity closest_peer;
-    
+
     /* Select best successor among one found locally and current_destination
      * that we got from network.*/
     closest_peer = select_closest_peer (&peer.best_known_destination,
@@ -4345,7 +4173,7 @@ get_local_best_known_next_hop (uint64_t final_dest_finger_val,
     if (0 == GNUNET_CRYPTO_cmp_peer_identity (current_dest, &closest_peer))
     {
       struct GNUNET_PeerIdentity *next_hop;
-      
+
       next_hop = GDS_ROUTING_get_next_hop (intermediate_trail_id,
                                            GDS_ROUTING_SRC_TO_DEST);
       /* next_hop NULL is a valid case. This intermediate trail id is set by
@@ -4406,12 +4234,12 @@ handle_dht_p2p_trail_setup (void *cls, const struct GNUNET_PeerIdentity *peer,
   }
   trail_length = (msize - sizeof (struct PeerTrailSetupMessage))/
                   sizeof (struct GNUNET_PeerIdentity);
+
   GNUNET_STATISTICS_update (GDS_stats,
                             gettext_noop
                             ("# Bytes received from other peers"), msize,
                             GNUNET_NO);
-  
+
   trail_peer_list = (const struct GNUNET_PeerIdentity *)&trail_setup[1];
   current_dest = trail_setup->best_known_destination;
   trail_id = trail_setup->trail_id;
@@ -4420,7 +4248,7 @@ handle_dht_p2p_trail_setup (void *cls, const struct GNUNET_PeerIdentity *peer,
   source = trail_setup->source_peer;
   is_predecessor = ntohl (trail_setup->is_predecessor);
   intermediate_trail_id = trail_setup->intermediate_trail_id;
-  
+
   /* Did the friend insert its ID in the trail list? */
   if (trail_length > 0 &&
       0 != memcmp (&trail_peer_list[trail_length-1], peer, sizeof (struct GNUNET_PeerIdentity)))
@@ -4428,20 +4256,20 @@ handle_dht_p2p_trail_setup (void *cls, const struct GNUNET_PeerIdentity *peer,
     GNUNET_break_op (0);
     return GNUNET_SYSERR;
   }
-  
+
    /* If I was the source and got the message back, then set trail length to 0.*/
   if (0 == GNUNET_CRYPTO_cmp_peer_identity(&my_identity, &source))
-  {   
+  {
     trail_length = 0;
   }
-  
+
   /* Check if you are present in the trail seen so far? */
   for (i = 0; i < trail_length ; i++)
   {
     if(0 == GNUNET_CRYPTO_cmp_peer_identity(&trail_peer_list[i],&my_identity))
     {
       /* We will add ourself later in code, if NOT destination. */
-      trail_length = i; 
+      trail_length = i;
       break;
     }
   }
@@ -4451,11 +4279,11 @@ handle_dht_p2p_trail_setup (void *cls, const struct GNUNET_PeerIdentity *peer,
   {
     if (trail_length > 0)
       target_friend =
-                   GNUNET_CONTAINER_multipeermap_get (friend_peermap, 
+                   GNUNET_CONTAINER_multipeermap_get (friend_peermap,
                                                       &trail_peer_list[trail_length - 1]);
     else
       target_friend =
-                   GNUNET_CONTAINER_multipeermap_get (friend_peermap, 
+                   GNUNET_CONTAINER_multipeermap_get (friend_peermap,
                                                       &source);
     if(NULL == target_friend)
     {
@@ -4489,13 +4317,13 @@ handle_dht_p2p_trail_setup (void *cls, const struct GNUNET_PeerIdentity *peer,
                         final_dest_finger_val, trail_id);
       return GNUNET_OK;
     }
-    
+
     if (trail_length > 0)
-      target_friend = 
-              GNUNET_CONTAINER_multipeermap_get (friend_peermap, 
+      target_friend =
+              GNUNET_CONTAINER_multipeermap_get (friend_peermap,
                                                  &trail_peer_list[trail_length-1]);
     else
-      target_friend = 
+      target_friend =
               GNUNET_CONTAINER_multipeermap_get (friend_peermap, &source);
     if (NULL == target_friend)
     {
@@ -4587,12 +4415,12 @@ handle_dht_p2p_trail_setup_result(void *cls, const struct GNUNET_PeerIdentity *p
   }
   trail_length = (msize - sizeof (struct PeerTrailSetupResultMessage))/
                   sizeof (struct GNUNET_PeerIdentity);
-  
+
   GNUNET_STATISTICS_update (GDS_stats,
                             gettext_noop
                             ("# Bytes received from other peers"), msize,
                             GNUNET_NO);
-  
+
   is_predecessor = ntohl (trail_result->is_predecessor);
   querying_peer = trail_result->querying_peer;
   finger_identity = trail_result->finger_identity;
@@ -4636,7 +4464,7 @@ handle_dht_p2p_trail_setup_result(void *cls, const struct GNUNET_PeerIdentity *p
     GNUNET_break_op(0);
     return GNUNET_SYSERR;
   }
-  
+
   //TODO; Refactor code here and above to check if sender peer is correct
   if (my_index == 0)
   {
@@ -4652,17 +4480,17 @@ handle_dht_p2p_trail_setup_result(void *cls, const struct GNUNET_PeerIdentity *p
   {
     if(my_index == trail_length - 1)
     {
-      GNUNET_assert(0 == 
+      GNUNET_assert(0 ==
                     GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
-                                                     peer));  
+                                                     peer));
     }
     else
-      GNUNET_assert(0 == 
+      GNUNET_assert(0 ==
                     GNUNET_CRYPTO_cmp_peer_identity (&trail_peer_list[my_index + 1],
                                                       peer));
     next_hop = trail_peer_list[my_index - 1];
   }
-  
+
   target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_hop);
   if (NULL == target_friend)
   {
@@ -4729,8 +4557,6 @@ get_shortest_trail (struct FingerInfo *finger,
   struct GNUNET_PeerIdentity *trail_list;
   unsigned int i;
 
-  trail = GNUNET_new (struct Trail);
-
   /* Get the shortest trail to reach to current successor. */
   for (i = 0; i < finger->trails_count; i++)
   {
@@ -4772,8 +4598,8 @@ get_shortest_trail (struct FingerInfo *finger,
 
 
 /**
- * Check if trail_1 and trail_2 have any common element. If yes then join 
- * them at common element. trail_1 always preceeds trail_2 in joined trail. 
+ * Check if trail_1 and trail_2 have any common element. If yes then join
+ * them at common element. trail_1 always preceeds trail_2 in joined trail.
  * @param trail_1 Trail from source to me, NOT including endpoints.
  * @param trail_1_len Total number of peers @a trail_1
  * @param trail_2 Trail from me to current predecessor, NOT including endpoints.
@@ -4793,28 +4619,28 @@ check_for_duplicate_entries (const struct GNUNET_PeerIdentity *trail_1,
   unsigned int i;
   unsigned int j;
   unsigned int k;
-  
+
   for (i = 0; i < trail_1_len; i++)
   {
     for (j = 0; j < trail_2_len; j++)
     {
       if(0 != GNUNET_CRYPTO_cmp_peer_identity (&trail_1[i],&trail_2[j]))
         continue;
-      
+
       *joined_trail_len = i + (trail_2_len - j);
-      joined_trail = GNUNET_malloc (*joined_trail_len * 
+      joined_trail = GNUNET_malloc (*joined_trail_len *
                                     sizeof(struct GNUNET_PeerIdentity));
-      
-      
+
+
       /* Copy all the elements from 0 to i into joined_trail. */
       for(k = 0; k < ( i+1); k++)
       {
         joined_trail[k] = trail_1[k];
       }
-      
+
       /* Increment j as entry stored is same as entry stored at i*/
       j = j+1;
-      
+
       /* Copy all the elements from j to trail_2_len-1 to joined trail.*/
       while(k <= (*joined_trail_len - 1))
       {
@@ -4822,30 +4648,30 @@ check_for_duplicate_entries (const struct GNUNET_PeerIdentity *trail_1,
         j++;
         k++;
       }
-      
+
       return joined_trail;
     }
   }
+
   /* Here you should join the  trails. */
   *joined_trail_len = trail_1_len + trail_2_len + 1;
-  joined_trail = GNUNET_malloc (*joined_trail_len * 
+  joined_trail = GNUNET_malloc (*joined_trail_len *
                                 sizeof(struct GNUNET_PeerIdentity));
-  
-  
+
+
   for(i = 0; i < trail_1_len;i++)
   {
     joined_trail[i] = trail_1[i];
   }
-  
+
   joined_trail[i] = my_identity;
   i++;
-  
+
   for (j = 0; i < *joined_trail_len; i++,j++)
   {
     joined_trail[i] = trail_2[j];
   }
-  
+
   return joined_trail;
 }
 
@@ -4872,69 +4698,68 @@ get_trail_src_to_curr_pred (struct GNUNET_PeerIdentity source_peer,
   struct FingerInfo *current_predecessor;
   int i;
   unsigned int j;
+  unsigned int len;
 
   current_predecessor = &finger_table[PREDECESSOR_FINGER_ID];
-  
+
   /* Check if trail_src_to_me contains current_predecessor. */
   for (i = 0; i < trail_src_to_me_len; i++)
   {
-    if(0 != GNUNET_CRYPTO_cmp_peer_identity(&trail_src_to_me[i],
-                                            &current_predecessor->finger_identity))
-        continue;
-      
-      
+    if (0 != GNUNET_CRYPTO_cmp_peer_identity(&trail_src_to_me[i],
+                                             &current_predecessor->finger_identity))
+      continue;
+
+
     *trail_src_to_curr_pred_length = i;
-    
+
     if(0 == i)
       return NULL;
-    
+
      trail_src_to_curr_pred = GNUNET_malloc (*trail_src_to_curr_pred_length *
                                               sizeof(struct GNUNET_PeerIdentity));
-     for(j = 0; j < i;j++)
+     for (j = 0; j < i; j++)
        trail_src_to_curr_pred[j] = trail_src_to_me[j];
      return trail_src_to_curr_pred;
   }
 
+
   trail_me_to_curr_pred = get_shortest_trail (current_predecessor,
                                               &trail_me_to_curr_pred_length);
-  
+
   /* Check if trail contains the source_peer. */
-  for(i = trail_me_to_curr_pred_length - 1; i >= 0; i--)
-  {
-    if(0 != GNUNET_CRYPTO_cmp_peer_identity (&source_peer,
-                                             &trail_me_to_curr_pred[i]))
-      continue; 
-    
-     /* Source is NOT part of trail. */
-     i = i+1;
-
-     /* Source is the last element in the trail to reach to my pred.
-         Source is direct friend of the pred. */
-     if (trail_me_to_curr_pred_length == i)
-     {
-        *trail_src_to_curr_pred_length = 0;
-        return NULL;
-     }
-     
-     *trail_src_to_curr_pred_length = trail_me_to_curr_pred_length - i;
-     trail_src_to_curr_pred = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity)*
-                                              *trail_src_to_curr_pred_length);
-     
-     for(j = 0; j < *trail_src_to_curr_pred_length; i++,j++)
-     {
-       trail_src_to_curr_pred[j] = trail_me_to_curr_pred[i];
-     }
-     GNUNET_free_non_null(trail_me_to_curr_pred);
-     return trail_src_to_curr_pred;
+  for (i = trail_me_to_curr_pred_length - 1; i >= 0; i--)
+  {
+    if (0 != GNUNET_CRYPTO_cmp_peer_identity (&source_peer,
+                                              &trail_me_to_curr_pred[i]))
+      continue;
+
+    /* Source is NOT part of trail. */
+    i++;
+
+    /* Source is the last element in the trail to reach to my pred.
+       Source is direct friend of the pred. */
+    if (trail_me_to_curr_pred_length == i)
+    {
+      *trail_src_to_curr_pred_length = 0;
+      GNUNET_free_non_null (trail_me_to_curr_pred);
+      return NULL;
+    }
+
+    *trail_src_to_curr_pred_length = trail_me_to_curr_pred_length - i;
+    trail_src_to_curr_pred = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity)*
+                                            *trail_src_to_curr_pred_length);
+
+    for (j = 0; j < *trail_src_to_curr_pred_length; i++,j++)
+      trail_src_to_curr_pred[j] = trail_me_to_curr_pred[i];
+    GNUNET_free_non_null (trail_me_to_curr_pred);
+    return trail_src_to_curr_pred;
   }
-  
-  unsigned int len;
-  trail_src_to_curr_pred = check_for_duplicate_entries (trail_src_to_me, 
+
+  trail_src_to_curr_pred = check_for_duplicate_entries (trail_src_to_me,
                                                         trail_src_to_me_len,
                                                         trail_me_to_curr_pred,
                                                         trail_me_to_curr_pred_length,
-                                                        &len); 
+                                                        &len);
   *trail_src_to_curr_pred_length = len;
   GNUNET_free_non_null(trail_me_to_curr_pred);
   return trail_src_to_curr_pred;
@@ -4982,7 +4807,7 @@ update_predecessor (struct GNUNET_PeerIdentity finger,
     GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
                                                             &trail[trail_length-1]));
     trail_to_new_predecessor = invert_trail (trail, trail_length);
-    
+
     /* Add an entry in your routing table. */
     GDS_ROUTING_add (trail_to_new_predecessor_id,
                      my_identity,
@@ -5037,7 +4862,7 @@ compare_and_update_predecessor (struct GNUNET_PeerIdentity finger,
     update_predecessor (finger, trail, trail_length);
     return;
   }
-  
+
   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&current_predecessor->finger_identity,
                                             &finger))
   {
@@ -5085,7 +4910,7 @@ handle_dht_p2p_verify_successor(void *cls,
   struct GNUNET_PeerIdentity *trail_src_to_curr_pred;
   unsigned int trail_length;
   size_t msize;
-  
+
   msize = ntohs (message->size);
 
   if (msize < sizeof (struct PeerVerifySuccessorMessage))
@@ -5103,29 +4928,29 @@ handle_dht_p2p_verify_successor(void *cls,
     GNUNET_break_op (0);
     return GNUNET_OK;
   }
-  
+
   GNUNET_STATISTICS_update (GDS_stats,
                             gettext_noop
                             ("# Bytes received from other peers"), msize,
                             GNUNET_NO);
-  
+
   trail_id = vsm->trail_id;
   source_peer = vsm->source_peer;
   successor = vsm->successor;
   trail = (struct GNUNET_PeerIdentity *)&vsm[1];
+
   /* I am NOT the successor of source_peer. Pass the message to next_hop on
    * the trail. */
   if(0 != (GNUNET_CRYPTO_cmp_peer_identity (&successor, &my_identity)))
   {
-    next_hop = GDS_ROUTING_get_next_hop (trail_id, GDS_ROUTING_SRC_TO_DEST);    
+    next_hop = GDS_ROUTING_get_next_hop (trail_id, GDS_ROUTING_SRC_TO_DEST);
     if (NULL == next_hop)
-    { 
+    {
       return GNUNET_OK;
     }
+
     target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop);
-    
+
     if(NULL == target_friend)
     {
       GNUNET_break_op(0);
@@ -5143,12 +4968,12 @@ handle_dht_p2p_verify_successor(void *cls,
    * it.  */
   compare_and_update_predecessor (source_peer, trail, trail_length);
   current_predecessor = finger_table[PREDECESSOR_FINGER_ID];
-  
+
   /* Is source of this message NOT my predecessor. */
   if (0 != (GNUNET_CRYPTO_cmp_peer_identity (&current_predecessor.finger_identity,
                                              &source_peer)))
   {
-    trail_src_to_curr_pred = 
+    trail_src_to_curr_pred =
               get_trail_src_to_curr_pred (source_peer,
                                           trail,
                                           trail_length,
@@ -5159,7 +4984,7 @@ handle_dht_p2p_verify_successor(void *cls,
     trail_src_to_curr_pred_len = trail_length;
     unsigned int i;
 
-    trail_src_to_curr_pred = 
+    trail_src_to_curr_pred =
             GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity)
                            *trail_src_to_curr_pred_len);
     for(i = 0; i < trail_src_to_curr_pred_len; i++)
@@ -5167,7 +4992,7 @@ handle_dht_p2p_verify_successor(void *cls,
       trail_src_to_curr_pred[i] = trail[i];
     }
   }
+
   GNUNET_assert (NULL !=
                 (target_friend =
                  GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer)));
@@ -5204,7 +5029,6 @@ check_trail_me_to_probable_succ (struct GNUNET_PeerIdentity probable_successor,
   struct GNUNET_PeerIdentity *trail_to_new_successor;
 
   /* Probable successor is  a friend */
-  /* SUPUS: Here should I worry about friend,*/
   if (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap,
                                                  &probable_successor))
   {
@@ -5212,7 +5036,7 @@ check_trail_me_to_probable_succ (struct GNUNET_PeerIdentity probable_successor,
     *trail_to_new_successor_length = 0;
     return trail_to_new_successor;
   }
-  
+
   /* Is there any friend of yours in this trail. */
   if(trail_me_to_probable_successor_len > 1)
   {
@@ -5226,12 +5050,12 @@ check_trail_me_to_probable_succ (struct GNUNET_PeerIdentity probable_successor,
       trail_to_new_successor = GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity)*
                                                 *trail_to_new_successor_length);
 
-     
+
       for(j = 0; j < *trail_to_new_successor_length; i++,j++)
       {
         trail_to_new_successor[j] = trail_me_to_probable_successor[i];
       }
-      
+
       return trail_to_new_successor;
     }
   }
@@ -5241,7 +5065,7 @@ check_trail_me_to_probable_succ (struct GNUNET_PeerIdentity probable_successor,
 }
 
 // TODO: Move up
-struct SendNotifyContext 
+struct SendNotifyContext
 {
   struct GNUNET_PeerIdentity source_peer;
   struct GNUNET_PeerIdentity successor;
@@ -5266,7 +5090,7 @@ send_notify_new_successor (void *cls,
  * @param curr_succ Peer to which we sent the verify successor message. It may
  * or may not be our real current successor, as we may have few iterations of
  * find finger trail task.
- * @param probable_successor Peer which should be our successor accroding to @a 
+ * @param probable_successor Peer which should be our successor accroding to @a
  *                           curr_succ
  * @param trail List of peers to reach from me to @a probable successor, NOT including
  *              endpoints.
@@ -5306,12 +5130,12 @@ compare_and_update_successor (struct GNUNET_PeerIdentity curr_succ,
       succ = GNUNET_ntohll(succ);
       GNUNET_asprintf (&key, "XDHT:%s:", my_id_str);
       GNUNET_free (my_id_str);
-     
+
       GNUNET_STATISTICS_set (GDS_stats, key, succ, 0);
       GNUNET_free (key);
     }
-    if (send_verify_successor_task == GNUNET_SCHEDULER_NO_TASK)
-      send_verify_successor_task = 
+    if (send_verify_successor_task == NULL)
+      send_verify_successor_task =
               GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
                                            &send_verify_successor_message,
                                            NULL);
@@ -5325,13 +5149,13 @@ compare_and_update_successor (struct GNUNET_PeerIdentity curr_succ,
   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&closest_peer ,
                                             &current_successor->finger_identity))
   {
-    //FIXME: Is this a good place to return the stats. 
+    //FIXME: Is this a good place to return the stats.
     if ((NULL != GDS_stats))
     {
       char *my_id_str;
       uint64_t succ;
       char *key;
-    
+
       my_id_str = GNUNET_strdup (GNUNET_i2s_full (&my_identity));
       memcpy(&succ, &current_successor->finger_identity, sizeof(uint64_t));
       GNUNET_asprintf (&key, "XDHT:%s:", my_id_str);
@@ -5339,25 +5163,25 @@ compare_and_update_successor (struct GNUNET_PeerIdentity curr_succ,
       GNUNET_STATISTICS_set (GDS_stats, key, succ, 0);
       GNUNET_free (key);
     }
-    
+
     if(0 == successor_times)
     {
 //      successor_times = 3;
-      verify_successor_next_send_time = 
+      verify_successor_next_send_time =
               GNUNET_TIME_STD_BACKOFF (verify_successor_next_send_time);
     }
     else
       successor_times--;
-    
-    
-    if (send_verify_successor_task == GNUNET_SCHEDULER_NO_TASK)
-      send_verify_successor_task = 
+
+
+    if (send_verify_successor_task == NULL)
+      send_verify_successor_task =
               GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
                                            &send_verify_successor_message,
                                            NULL);
     return;
   }
-  
+
   /* Probable successor is the closest peer.*/
   if(trail_length > 0)
   {
@@ -5369,7 +5193,7 @@ compare_and_update_successor (struct GNUNET_PeerIdentity curr_succ,
     GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
                                                             &probable_successor));
   }
-  
+
   trail_me_to_probable_succ_len = 0;
   trail_me_to_probable_succ =
           check_trail_me_to_probable_succ (probable_successor,
@@ -5401,26 +5225,25 @@ compare_and_update_successor (struct GNUNET_PeerIdentity curr_succ,
 
   add_new_finger (probable_successor, trail_me_to_probable_succ,
                   trail_me_to_probable_succ_len, trail_id, 0);
+
   struct SendNotifyContext *notify_ctx;
+
   notify_ctx = GNUNET_new(struct SendNotifyContext);
-  
+
   notify_ctx->source_peer = my_identity;
   notify_ctx->successor = probable_successor;
-  notify_ctx->successor_trail = 
+  notify_ctx->successor_trail =
           GNUNET_malloc(sizeof(struct GNUNET_PeerIdentity) * trail_me_to_probable_succ_len);
-  memcpy(notify_ctx->successor_trail, trail_me_to_probable_succ, 
+  memcpy(notify_ctx->successor_trail, trail_me_to_probable_succ,
          sizeof(struct GNUNET_PeerIdentity) * trail_me_to_probable_succ_len);
   notify_ctx->successor_trail_length = trail_me_to_probable_succ_len;
   notify_ctx->succesor_trail_id = trail_id;
   notify_ctx->target_friend = target_friend;
   notify_ctx->num_retries_scheduled = 0;
-  
+  GNUNET_free_non_null (trail_me_to_probable_succ);
+
   // TODO: Check if we should verify before schedule if already scheduled.
   GNUNET_SCHEDULER_add_now(&send_notify_new_successor, (void*)notify_ctx);
-  
-  return;
 }
 
 
@@ -5431,7 +5254,7 @@ send_notify_new_successor (void *cls,
                            * tc)
 {
   struct SendNotifyContext *ctx = (struct SendNotifyContext *) cls;
-  
+
   GDS_NEIGHBOURS_send_notify_new_successor (ctx->source_peer,
                                             ctx->successor,
                                             ctx->successor_trail,
@@ -5439,8 +5262,8 @@ send_notify_new_successor (void *cls,
                                             ctx->succesor_trail_id,
                                             ctx->target_friend);
 
-  if (0 == ctx->num_retries_scheduled && 
-          send_notify_new_successor_retry_task != GNUNET_SCHEDULER_NO_TASK)
+  if (0 == ctx->num_retries_scheduled &&
+          send_notify_new_successor_retry_task != NULL)
   {
     // Result from previous notify successos hasn't arrived, so the retry task
     // hasn't been cancelled! Already a new notify successor must be called.
@@ -5449,9 +5272,9 @@ send_notify_new_successor (void *cls,
     old_notify_ctx = GNUNET_SCHEDULER_cancel(send_notify_new_successor_retry_task);
     GNUNET_free (old_notify_ctx->successor_trail);
     GNUNET_free (old_notify_ctx);
-    send_notify_new_successor_retry_task = GNUNET_SCHEDULER_NO_TASK;
+    send_notify_new_successor_retry_task = NULL;
   }
-  
+
   ctx->num_retries_scheduled++;
   send_notify_new_successor_retry_task = GNUNET_SCHEDULER_add_delayed(notify_successor_retry_time,
                                                                       &send_notify_new_successor,
@@ -5481,7 +5304,7 @@ handle_dht_p2p_verify_successor_result(void *cls,
   const struct GNUNET_PeerIdentity *trail;
   unsigned int trail_length;
   size_t msize;
-    
+
   msize = ntohs (message->size);
   if (msize < sizeof (struct PeerVerifySuccessorResultMessage))
   {
@@ -5498,35 +5321,35 @@ handle_dht_p2p_verify_successor_result(void *cls,
   }
   trail_length = (msize - sizeof (struct PeerVerifySuccessorResultMessage))/
                       sizeof (struct GNUNET_PeerIdentity);
+
   GNUNET_STATISTICS_update (GDS_stats,
                             gettext_noop
                             ("# Bytes received from other peers"), msize,
                             GNUNET_NO);
-  
+
   trail = (const struct GNUNET_PeerIdentity *) &vsrm[1];
   querying_peer = vsrm->querying_peer;
   trail_direction = ntohl (vsrm->trail_direction);
   trail_id = vsrm->trail_id;
   probable_successor = vsrm->probable_successor;
   current_successor = vsrm->current_successor;
+
   /* I am the querying_peer. */
   if(0 == (GNUNET_CRYPTO_cmp_peer_identity (&querying_peer, &my_identity)))
   {
     /* Cancel Retry Task */
-    if (GNUNET_SCHEDULER_NO_TASK != send_verify_successor_retry_task)
+    if (NULL != send_verify_successor_retry_task)
     {
       struct VerifySuccessorContext *ctx;
       ctx = GNUNET_SCHEDULER_cancel(send_verify_successor_retry_task);
       GNUNET_free(ctx);
-      send_verify_successor_retry_task = GNUNET_SCHEDULER_NO_TASK;
+      send_verify_successor_retry_task = NULL;
     }
     compare_and_update_successor (current_successor,
                                   probable_successor, trail, trail_length);
     return GNUNET_OK;
   }
-  
+
   /*If you are not the querying peer then pass on the message */
   if(NULL == (next_hop =
               GDS_ROUTING_get_next_hop (trail_id, trail_direction)))
@@ -5596,23 +5419,24 @@ handle_dht_p2p_notify_new_successor(void *cls,
                             gettext_noop
                             ("# Bytes received from other peers"), msize,
                             GNUNET_NO);
-  
+
   trail = (struct GNUNET_PeerIdentity *) &nsm[1];
   source  = nsm->source_peer;
   new_successor = nsm->new_successor;
   trail_id = nsm->trail_id;
+
   /* I am the new_successor to source_peer. */
   if ( 0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &new_successor))
   {
     if(trail_length > 0)
       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity(&trail[trail_length - 1],
                                                           peer));
-    else 
+    else
       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity(&source, peer));
-  
+
     compare_and_update_predecessor (source, trail, trail_length);
     target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer);
+    GNUNET_assert (NULL != target_friend);
     GDS_NEIGHBOURS_send_notify_succcessor_confirmation (trail_id,
                                                         GDS_ROUTING_DEST_TO_SRC,
                                                         target_friend);
@@ -5638,7 +5462,7 @@ handle_dht_p2p_notify_new_successor(void *cls,
     next_hop = new_successor;
   else
     next_hop = trail[my_index + 1];
-  
+
   GDS_ROUTING_add(trail_id, *peer, next_hop);
   target_friend =
                  GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_hop);
@@ -5665,7 +5489,7 @@ handle_dht_p2p_notify_new_successor(void *cls,
 static int
 handle_dht_p2p_notify_succ_confirmation (void *cls,
                                          const struct GNUNET_PeerIdentity *peer,
-                                         const struct GNUNET_MessageHeader *message) 
+                                         const struct GNUNET_MessageHeader *message)
 {
   const struct PeerNotifyConfirmationMessage *notify_confirmation;
   enum GDS_ROUTING_trail_direction trail_direction;
@@ -5673,7 +5497,7 @@ handle_dht_p2p_notify_succ_confirmation (void *cls,
   struct FriendInfo *target_friend;
   struct GNUNET_PeerIdentity *next_hop;
   size_t msize;
-  
+
   msize = ntohs (message->size);
 
   if (msize != sizeof (struct PeerNotifyConfirmationMessage))
@@ -5685,21 +5509,21 @@ handle_dht_p2p_notify_succ_confirmation (void *cls,
                             gettext_noop
                             ("# Bytes received from other peers"), msize,
                             GNUNET_NO);
-  
+
   notify_confirmation = (const struct PeerNotifyConfirmationMessage *) message;
   trail_direction = ntohl (notify_confirmation->trail_direction);
   trail_id = notify_confirmation->trail_id;
-  
+
   next_hop = GDS_ROUTING_get_next_hop (trail_id, trail_direction);
   if (NULL == next_hop)
   {
-    /* The source of notify new successor, might have found even a better 
+    /* The source of notify new successor, might have found even a better
      successor. In that case it send a trail teardown message, and hence,
      the next hop is NULL. */
     //Fixme: Add some print to confirm the above theory.
     return GNUNET_OK;
   }
-  
+
   /* I peer which sent the notify successor message to the successor. */
   if (0 == GNUNET_CRYPTO_cmp_peer_identity (next_hop, &my_identity))
   {
@@ -5708,23 +5532,23 @@ handle_dht_p2p_notify_succ_confirmation (void *cls,
     * which may or may not be source of this message. This message is used
     * only to ensure that we have a path setup to reach to our successor.
     */
-    
+
     // TODO: cancel schedule of notify_successor_retry_task
-    if (send_notify_new_successor_retry_task != GNUNET_SCHEDULER_NO_TASK)
+    if (send_notify_new_successor_retry_task != NULL)
     {
       struct SendNotifyContext *notify_ctx;
       notify_ctx = GNUNET_SCHEDULER_cancel(send_notify_new_successor_retry_task);
       GNUNET_free (notify_ctx->successor_trail);
       GNUNET_free (notify_ctx);
-      send_notify_new_successor_retry_task = GNUNET_SCHEDULER_NO_TASK;
+      send_notify_new_successor_retry_task = NULL;
     }
-    if (send_verify_successor_task == GNUNET_SCHEDULER_NO_TASK)
+    if (send_verify_successor_task == NULL)
     {
-      verify_successor_next_send_time.rel_value_us = 
+      verify_successor_next_send_time.rel_value_us =
       DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us +
       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
-                                DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us); 
-      send_verify_successor_task = 
+                                DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us);
+      send_verify_successor_task =
               GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
                                            &send_verify_successor_message,
                                            NULL);
@@ -5789,7 +5613,7 @@ handle_dht_p2p_trail_setup_rejection (void *cls,
                             gettext_noop
                             ("# Bytes received from other peers"), msize,
                             GNUNET_NO);
-  
+
   trail_peer_list = (const struct GNUNET_PeerIdentity *)&trail_rejection[1];
   is_predecessor = ntohl (trail_rejection->is_predecessor);
   congestion_timeout = trail_rejection->congestion_time;
@@ -5820,7 +5644,7 @@ handle_dht_p2p_trail_setup_rejection (void *cls,
     /* First remove yourself from the trail. */
     unsigned int new_trail_length = trail_length - 1;
     struct GNUNET_PeerIdentity trail[new_trail_length];
-    
+
     memcpy (trail, trail_peer_list, new_trail_length * sizeof(struct GNUNET_PeerIdentity));
     if (0 == trail_length)
       next_peer = source;
@@ -5853,9 +5677,9 @@ handle_dht_p2p_trail_setup_rejection (void *cls,
      /*Here you are already part of trail. Copy the trail removing yourself. */
     unsigned int new_trail_length = trail_length - 1;
     struct GNUNET_PeerIdentity trail[new_trail_length];
-    
+
     memcpy (trail, trail_peer_list, new_trail_length * sizeof(struct GNUNET_PeerIdentity));
-    
+
     if (0 == new_trail_length)
       next_peer = source;
     else
@@ -5864,7 +5688,7 @@ handle_dht_p2p_trail_setup_rejection (void *cls,
     }
     target_friend =
                    GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_peer);
-    
+
     if (NULL == target_friend)
     {
       DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
@@ -5883,7 +5707,7 @@ handle_dht_p2p_trail_setup_rejection (void *cls,
   {
     /* Here I was already part of trail. So no need to add. */
     target_friend =
-                   GNUNET_CONTAINER_multipeermap_get (friend_peermap, 
+                   GNUNET_CONTAINER_multipeermap_get (friend_peermap,
                                                       &successor.next_hop);
     if (NULL == target_friend)
     {
@@ -5891,7 +5715,7 @@ handle_dht_p2p_trail_setup_rejection (void *cls,
       GNUNET_break(0);
       return GNUNET_OK;
     }
-   
+
     GDS_NEIGHBOURS_send_trail_setup (source,
                                      ultimate_destination_finger_value,
                                      successor.best_known_destination,
@@ -5933,7 +5757,7 @@ handle_dht_p2p_trail_teardown (void *cls, const struct GNUNET_PeerIdentity *peer
                             gettext_noop
                             ("# Bytes received from other peers"), msize,
                             GNUNET_NO);
-  
+
   trail_teardown = (const struct PeerTrailTearDownMessage *) message;
   trail_direction = ntohl (trail_teardown->trail_direction);
   trail_id = trail_teardown->trail_id;
@@ -5970,7 +5794,7 @@ handle_dht_p2p_trail_teardown (void *cls, const struct GNUNET_PeerIdentity *peer
     /* If not final destination, then send a trail teardown message to next hop.*/
     GNUNET_assert (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop));
     GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (trail_id));
-    GDS_NEIGHBOURS_send_trail_teardown (trail_id, trail_direction, *next_hop);
+    GDS_NEIGHBOURS_send_trail_teardown (&trail_id, trail_direction, next_hop);
   }
 
   return GNUNET_OK;
@@ -6022,7 +5846,7 @@ handle_dht_p2p_add_trail (void *cls, const struct GNUNET_PeerIdentity *peer,
                             gettext_noop
                             ("# Bytes received from other peers"), msize,
                             GNUNET_NO);
-  
+
   trail = (const struct GNUNET_PeerIdentity *)&add_trail[1];
   destination_peer = add_trail->destination_peer;
   source_peer = add_trail->source_peer;
@@ -6096,7 +5920,7 @@ remove_matching_trails (const struct GNUNET_PeerIdentity *disconnected_friend,
     current_trail = &finger->trail_list[i];
     if (GNUNET_NO == current_trail->is_present)
       continue;
-    
+
     /* First friend to reach to finger is disconnected_peer. */
     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&current_trail->trail_head->peer,
                                               disconnected_friend))
@@ -6150,20 +5974,20 @@ remove_matching_fingers (const struct GNUNET_PeerIdentity *disconnected_peer)
   for (i = 0; i < MAX_FINGERS; i++)
   {
     current_finger = &finger_table[i];
-    
+
     /* No finger stored at this trail index or I am the finger. */
     if ((GNUNET_NO == current_finger->is_present) ||
         (0 == GNUNET_CRYPTO_cmp_peer_identity (&current_finger->finger_identity,
                                                &my_identity)))
       continue;
-    
+
     /* Is disconnected_peer a finger? */
     if (0 == GNUNET_CRYPTO_cmp_peer_identity (disconnected_peer,
                                               &current_finger->finger_identity))
     {
       remove_existing_finger (current_finger, i);
     }
-    
+
     /* If finger is a friend but not disconnected_friend, then continue. */
     if (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap,
                                                    &current_finger->finger_identity))
@@ -6197,7 +6021,7 @@ handle_core_disconnect (void *cls,
   struct FriendInfo *remove_friend;
   struct P2PPendingMessage *pos;
   unsigned int discarded;
-  
+
   /* If disconnected to own identity, then return. */
   if (0 == memcmp (&my_identity, peer, sizeof (struct GNUNET_PeerIdentity)))
     return;
@@ -6208,21 +6032,21 @@ handle_core_disconnect (void *cls,
     DEBUG("\n friend already disconnected.");
     return;
   }
-  
+
   remove_matching_fingers (peer);
   GNUNET_assert (GNUNET_SYSERR != GDS_ROUTING_remove_trail_by_peer (peer));
   GNUNET_assert (GNUNET_YES ==
                  GNUNET_CONTAINER_multipeermap_remove (friend_peermap,
                                                        peer,
                                                        remove_friend));
-  
+
   /* Remove all the messages queued in pending list of this peer is discarded.*/
   if (remove_friend->th != NULL)
   {
     GNUNET_CORE_notify_transmit_ready_cancel(remove_friend->th);
     remove_friend->th = NULL;
   }
-  
+
   discarded = 0;
   while (NULL != (pos = remove_friend->head))
   {
@@ -6230,20 +6054,20 @@ handle_core_disconnect (void *cls,
     discarded++;
     GNUNET_free (pos);
   }
-  
+
   GNUNET_STATISTICS_update (GDS_stats,
                             gettext_noop
                             ("# Queued messages discarded (peer disconnected)"),
                             discarded, GNUNET_NO);
   //GNUNET_free (remove_friend);
-  
+
   if (0 != GNUNET_CONTAINER_multipeermap_size (friend_peermap))
     return;
 
-  if (GNUNET_SCHEDULER_NO_TASK != find_finger_trail_task)
+  if (NULL != find_finger_trail_task)
   {
       GNUNET_SCHEDULER_cancel (find_finger_trail_task);
-      find_finger_trail_task = GNUNET_SCHEDULER_NO_TASK;
+      find_finger_trail_task = NULL;
   }
   else
     GNUNET_break (0);
@@ -6275,7 +6099,7 @@ handle_core_connect (void *cls, const struct GNUNET_PeerIdentity *peer_identity)
 
   friend = GNUNET_new (struct FriendInfo);
   friend->id = *peer_identity;
-  
+
   GNUNET_assert (GNUNET_OK ==
                  GNUNET_CONTAINER_multipeermap_put (friend_peermap,
                                                     peer_identity, friend,
@@ -6283,10 +6107,10 @@ handle_core_connect (void *cls, const struct GNUNET_PeerIdentity *peer_identity)
 
   /* FIXME: now we are not making a distinction between fingers which are friends
    * also.But later, we should add a congestion timestamp on the friend, so that it is
-   * selected after some time out. This is to ensure that both peers have added 
+   * selected after some time out. This is to ensure that both peers have added
    * each other as their friend. */
   /* Got a first connection, good time to start with FIND FINGER TRAIL requests...*/
-  if (GNUNET_SCHEDULER_NO_TASK == find_finger_trail_task)
+  if (NULL == find_finger_trail_task)
   {
     find_finger_trail_task = GNUNET_SCHEDULER_add_now (&send_find_finger_trail_message, NULL);
   }
@@ -6336,27 +6160,25 @@ GDS_NEIGHBOURS_init (void)
     {&handle_dht_p2p_trail_setup_rejection, GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_REJECTION, 0},
     {&handle_dht_p2p_trail_teardown, GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_TEARDOWN,
                                      sizeof (struct PeerTrailTearDownMessage)},
-    {&handle_dht_p2p_trail_compression, GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_COMPRESSION,
-                                        sizeof (struct PeerTrailCompressionMessage)},
     {&handle_dht_p2p_add_trail, GNUNET_MESSAGE_TYPE_XDHT_P2P_ADD_TRAIL, 0},
-    {&handle_dht_p2p_notify_succ_confirmation, GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_SUCCESSOR_CONFIRMATION, 
+    {&handle_dht_p2p_notify_succ_confirmation, GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_SUCCESSOR_CONFIRMATION,
                                       sizeof (struct PeerNotifyConfirmationMessage)},
     {NULL, 0, 0}
   };
-  
+
 #if ENABLE_MALICIOUS
   act_malicious = 0;
 #endif
-  
+
   core_api =
     GNUNET_CORE_connect (GDS_cfg, NULL, &core_init, &handle_core_connect,
                          &handle_core_disconnect, NULL, GNUNET_NO, NULL,
                          GNUNET_NO, core_handlers);
-  
+
   if (NULL == core_api)
     return GNUNET_SYSERR;
 
-  //TODO: check size of this peer map? 
+  //TODO: check size of this peer map?
   friend_peermap = GNUNET_CONTAINER_multipeermap_create (256, GNUNET_NO);
   finger_table_init ();
   successor_times = 10;
@@ -6365,42 +6187,42 @@ GDS_NEIGHBOURS_init (void)
       DHT_FIND_FINGER_TRAIL_INTERVAL.rel_value_us +
       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
                                 DHT_FIND_FINGER_TRAIL_INTERVAL.rel_value_us);
-  
-  verify_successor_next_send_time.rel_value_us = 
+
+  verify_successor_next_send_time.rel_value_us =
       DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us +
       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
                                 DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us);
-  
-  verify_successor_retry_time.rel_value_us = 
+
+  verify_successor_retry_time.rel_value_us =
       DHT_SEND_VERIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us +
       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
                                 DHT_SEND_VERIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us);
-  
-  notify_successor_retry_time.rel_value_us = 
+
+  notify_successor_retry_time.rel_value_us =
       DHT_SEND_NOTIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us +
       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
                                 DHT_SEND_NOTIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us);
-      
-  
+
+
   return GNUNET_OK;
 }
 
 
 /**
- * Free the memory held up by trails of a finger. 
+ * Free the memory held up by trails of a finger.
  */
 static void
 delete_finger_table_entries()
 {
   unsigned int i;
   unsigned int j;
-  
+
   for(i = 0; i < MAX_FINGERS; i++)
   {
     if(GNUNET_YES == finger_table[i].is_present)
     {
       for(j = 0; j < finger_table[i].trails_count; j++)
-        free_trail(&finger_table[i].trail_list[i]);
+        free_trail(&finger_table[i].trail_list[j]);
     }
   }
 }
@@ -6423,33 +6245,33 @@ GDS_NEIGHBOURS_done (void)
   GNUNET_CONTAINER_multipeermap_destroy (friend_peermap);
   friend_peermap = NULL;
 
-  if (GNUNET_SCHEDULER_NO_TASK != find_finger_trail_task)
+  if (NULL != find_finger_trail_task)
   {
     GNUNET_SCHEDULER_cancel (find_finger_trail_task);
-    find_finger_trail_task = GNUNET_SCHEDULER_NO_TASK;
+    find_finger_trail_task = NULL;
   }
 
-  if (GNUNET_SCHEDULER_NO_TASK != send_verify_successor_task)
+  if (NULL != send_verify_successor_task)
   {
     GNUNET_SCHEDULER_cancel (send_verify_successor_task);
-    send_verify_successor_task = GNUNET_SCHEDULER_NO_TASK;
+    send_verify_successor_task = NULL;
   }
 
-  if (GNUNET_SCHEDULER_NO_TASK != send_verify_successor_retry_task)
+  if (NULL != send_verify_successor_retry_task)
   {
     struct VerifySuccessorContext *ctx;
     ctx = GNUNET_SCHEDULER_cancel (send_verify_successor_retry_task);
     GNUNET_free(ctx);
-    send_verify_successor_retry_task = GNUNET_SCHEDULER_NO_TASK;
+    send_verify_successor_retry_task = NULL;
   }
-  
-  if (send_notify_new_successor_retry_task != GNUNET_SCHEDULER_NO_TASK)
+
+  if (send_notify_new_successor_retry_task != NULL)
   {
     struct SendNotifyContext *notify_ctx;
     notify_ctx = GNUNET_SCHEDULER_cancel(send_notify_new_successor_retry_task);
     GNUNET_free (notify_ctx->successor_trail);
     GNUNET_free (notify_ctx);
-    send_notify_new_successor_retry_task = GNUNET_SCHEDULER_NO_TASK;
+    send_notify_new_successor_retry_task = NULL;
   }
 }