gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r35559 - in gnunet: po src/dht


From: gnunet
Subject: [GNUnet-SVN] r35559 - in gnunet: po src/dht
Date: Mon, 27 Apr 2015 13:12:22 +0200

Author: arthur
Date: 2015-04-27 13:12:21 +0200 (Mon, 27 Apr 2015)
New Revision: 35559

Added:
   gnunet/src/dht/gnunet-service-wdht.c
   gnunet/src/dht/gnunet-service-wdht.h
   gnunet/src/dht/gnunet-service-wdht_clients.c
   gnunet/src/dht/gnunet-service-wdht_clients.h
   gnunet/src/dht/gnunet-service-wdht_datacache.c
   gnunet/src/dht/gnunet-service-wdht_datacache.h
   gnunet/src/dht/gnunet-service-wdht_hello.c
   gnunet/src/dht/gnunet-service-wdht_hello.h
   gnunet/src/dht/gnunet-service-wdht_neighbours.c
   gnunet/src/dht/gnunet-service-wdht_neighbours.h
   gnunet/src/dht/gnunet-service-wdht_nse.c
   gnunet/src/dht/gnunet-service-wdht_nse.h
   gnunet/src/dht/gnunet-service-wdht_routing.c
   gnunet/src/dht/gnunet-service-wdht_routing.h
Modified:
   gnunet/po/POTFILES.in
   gnunet/po/de.po
   gnunet/po/es.po
   gnunet/po/fr.po
   gnunet/po/sv.po
   gnunet/po/vi.po
   gnunet/po/zh_CN.po
   gnunet/src/dht/Makefile.am
Log:
Adding files for whanau.



Modified: gnunet/po/POTFILES.in
===================================================================
--- gnunet/po/POTFILES.in       2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/POTFILES.in       2015-04-27 11:12:21 UTC (rev 35559)
@@ -3,21 +3,13 @@
 src/arm/gnunet-arm.c
 src/arm/gnunet-service-arm.c
 src/arm/mockup-service.c
-src/ats-tests/ats-testing-experiment.c
-src/ats-tests/ats-testing-log.c
-src/ats-tests/ats-testing-preferences.c
-src/ats-tests/ats-testing-traffic.c
-src/ats-tests/ats-testing.c
-src/ats-tests/gnunet-ats-sim.c
-src/ats-tests/gnunet-solver-eval.c
-src/ats-tool/gnunet-ats.c
 src/ats/ats_api_connectivity.c
 src/ats/ats_api_performance.c
 src/ats/ats_api_scanner.c
 src/ats/ats_api_scheduling.c
 src/ats/gnunet-ats-solver-eval.c
+src/ats/gnunet-service-ats_addresses.c
 src/ats/gnunet-service-ats.c
-src/ats/gnunet-service-ats_addresses.c
 src/ats/gnunet-service-ats_connectivity.c
 src/ats/gnunet-service-ats_feedback.c
 src/ats/gnunet-service-ats_normalization.c
@@ -29,6 +21,14 @@
 src/ats/plugin_ats_mlp.c
 src/ats/plugin_ats_proportional.c
 src/ats/plugin_ats_ril.c
+src/ats-tests/ats-testing.c
+src/ats-tests/ats-testing-experiment.c
+src/ats-tests/ats-testing-log.c
+src/ats-tests/ats-testing-preferences.c
+src/ats-tests/ats-testing-traffic.c
+src/ats-tests/gnunet-ats-sim.c
+src/ats-tests/gnunet-solver-eval.c
+src/ats-tool/gnunet-ats.c
 src/block/block.c
 src/block/plugin_block_template.c
 src/block/plugin_block_test.c
@@ -37,8 +37,8 @@
 src/cadet/cadet_path.c
 src/cadet/cadet_test_lib.c
 src/cadet/cadet_tunnel_tree.c
+src/cadet/gnunet-cadet.c
 src/cadet/gnunet-cadet-profiler.c
-src/cadet/gnunet-cadet.c
 src/cadet/gnunet-service-cadet.c
 src/cadet/gnunet-service-cadet_channel.c
 src/cadet/gnunet-service-cadet_connection.c
@@ -52,12 +52,12 @@
 src/consensus/gnunet-service-consensus.c
 src/conversation/conversation_api.c
 src/conversation/conversation_api_call.c
+src/conversation/gnunet-conversation.c
 src/conversation/gnunet-conversation-test.c
-src/conversation/gnunet-conversation.c
+src/conversation/gnunet-helper-audio-playback.c
 src/conversation/gnunet-helper-audio-playback-gst.c
-src/conversation/gnunet-helper-audio-playback.c
+src/conversation/gnunet-helper-audio-record.c
 src/conversation/gnunet-helper-audio-record-gst.c
-src/conversation/gnunet-helper-audio-record.c
 src/conversation/gnunet-service-conversation.c
 src/conversation/microphone.c
 src/conversation/plugin_gnsrecord_conversation.c
@@ -89,6 +89,7 @@
 src/dht/dht_test_lib.c
 src/dht/gnunet-dht-get.c
 src/dht/gnunet-dht-monitor.c
+src/dht/gnunet_dht_profiler.c
 src/dht/gnunet-dht-put.c
 src/dht/gnunet-service-dht.c
 src/dht/gnunet-service-dht_clients.c
@@ -104,7 +105,6 @@
 src/dht/gnunet-service-xdht_neighbours.c
 src/dht/gnunet-service-xdht_nse.c
 src/dht/gnunet-service-xdht_routing.c
-src/dht/gnunet_dht_profiler.c
 src/dht/plugin_block_dht.c
 src/dns/dns_api.c
 src/dns/dnsparser.c
@@ -120,8 +120,8 @@
 src/dv/plugin_transport_dv.c
 src/env/env.c
 src/exit/gnunet-daemon-exit.c
+src/exit/gnunet-helper-exit.c
 src/exit/gnunet-helper-exit-windows.c
-src/exit/gnunet-helper-exit.c
 src/fragmentation/defragmentation.c
 src/fragmentation/fragmentation.c
 src/fs/fs_api.c
@@ -146,8 +146,8 @@
 src/fs/gnunet-daemon-fsprofiler.c
 src/fs/gnunet-directory.c
 src/fs/gnunet-download.c
+src/fs/gnunet-fs.c
 src/fs/gnunet-fs-profiler.c
-src/fs/gnunet-fs.c
 src/fs/gnunet-helper-fs-publish.c
 src/fs/gnunet-publish.c
 src/fs/gnunet-search.c
@@ -166,10 +166,10 @@
 src/gns/gns_api.c
 src/gns/gnunet-bcd.c
 src/gns/gnunet-dns2gns.c
+src/gns/gnunet-gns.c
 src/gns/gnunet-gns-helper-service-w32.c
 src/gns/gnunet-gns-import.c
 src/gns/gnunet-gns-proxy.c
-src/gns/gnunet-gns.c
 src/gns/gnunet-service-gns.c
 src/gns/gnunet-service-gns_interceptor.c
 src/gns/gnunet-service-gns_resolver.c
@@ -179,15 +179,15 @@
 src/gns/plugin_block_gns.c
 src/gns/plugin_gnsrecord_gns.c
 src/gns/plugin_rest_gns.c
-src/gns/w32nsp-install.c
-src/gns/w32nsp-resolve.c
-src/gns/w32nsp-uninstall.c
-src/gns/w32nsp.c
 src/gnsrecord/gnsrecord.c
 src/gnsrecord/gnsrecord_crypto.c
 src/gnsrecord/gnsrecord_misc.c
 src/gnsrecord/gnsrecord_serialization.c
 src/gnsrecord/plugin_gnsrecord_dns.c
+src/gns/w32nsp.c
+src/gns/w32nsp-install.c
+src/gns/w32nsp-resolve.c
+src/gns/w32nsp-uninstall.c
 src/hello/address.c
 src/hello/gnunet-hello.c
 src/hello/hello.c
@@ -208,31 +208,32 @@
 src/namecache/namecache_api.c
 src/namecache/plugin_namecache_postgres.c
 src/namecache/plugin_namecache_sqlite.c
+src/namestore/gnunet-namestore.c
 src/namestore/gnunet-namestore-fcfsd.c
-src/namestore/gnunet-namestore.c
 src/namestore/gnunet-service-namestore.c
 src/namestore/namestore_api.c
 src/namestore/namestore_api_monitor.c
 src/namestore/plugin_namestore_postgres.c
 src/namestore/plugin_namestore_sqlite.c
+src/namestore/plugin_rest_namestore.c
+src/nat/gnunet-helper-nat-client.c
 src/nat/gnunet-helper-nat-client-windows.c
-src/nat/gnunet-helper-nat-client.c
+src/nat/gnunet-helper-nat-server.c
 src/nat/gnunet-helper-nat-server-windows.c
-src/nat/gnunet-helper-nat-server.c
 src/nat/gnunet-nat-server.c
+src/nat/nat_auto.c
 src/nat/nat.c
-src/nat/nat_auto.c
 src/nat/nat_mini.c
 src/nat/nat_test.c
+src/nse/gnunet-nse.c
 src/nse/gnunet-nse-profiler.c
-src/nse/gnunet-nse.c
 src/nse/gnunet-service-nse.c
 src/nse/nse_api.c
-src/peerinfo-tool/gnunet-peerinfo.c
-src/peerinfo-tool/gnunet-peerinfo_plugins.c
 src/peerinfo/gnunet-service-peerinfo.c
 src/peerinfo/peerinfo_api.c
 src/peerinfo/peerinfo_api_notify.c
+src/peerinfo-tool/gnunet-peerinfo.c
+src/peerinfo-tool/gnunet-peerinfo_plugins.c
 src/peerstore/gnunet-peerstore.c
 src/peerstore/gnunet-service-peerstore.c
 src/peerstore/peerstore_api.c
@@ -276,10 +277,12 @@
 src/secretsharing/gnunet-service-secretsharing.c
 src/secretsharing/secretsharing_api.c
 src/secretsharing/secretsharing_common.c
+src/sensordashboard/gnunet-sensordashboard.c
+src/sensordashboard/gnunet-service-sensordashboard.c
+src/sensor/gnunet-sensor.c
 src/sensor/gnunet-sensor-profiler.c
-src/sensor/gnunet-sensor.c
+src/sensor/gnunet-service-sensor_analysis.c
 src/sensor/gnunet-service-sensor.c
-src/sensor/gnunet-service-sensor_analysis.c
 src/sensor/gnunet-service-sensor_monitoring.c
 src/sensor/gnunet-service-sensor_reporting.c
 src/sensor/gnunet-service-sensor_update.c
@@ -287,8 +290,6 @@
 src/sensor/sensor_api.c
 src/sensor/sensor_util_lib.c
 src/sensor/sensor_util_lib_crypto.c
-src/sensordashboard/gnunet-sensordashboard.c
-src/sensordashboard/gnunet-service-sensordashboard.c
 src/set/gnunet-service-set.c
 src/set/gnunet-service-set_intersection.c
 src/set/gnunet-service-set_union.c
@@ -309,30 +310,30 @@
 src/testbed/gnunet-daemon-testbed-blacklist.c
 src/testbed/gnunet-daemon-testbed-underlay.c
 src/testbed/gnunet-helper-testbed.c
+src/testbed/gnunet_mpi_test.c
 src/testbed/gnunet-service-test-barriers.c
-src/testbed/gnunet-service-testbed-logger.c
+src/testbed/gnunet-service-testbed_barriers.c
 src/testbed/gnunet-service-testbed.c
-src/testbed/gnunet-service-testbed_barriers.c
 src/testbed/gnunet-service-testbed_cache.c
 src/testbed/gnunet-service-testbed_connectionpool.c
 src/testbed/gnunet-service-testbed_cpustatus.c
 src/testbed/gnunet-service-testbed_links.c
+src/testbed/gnunet-service-testbed-logger.c
 src/testbed/gnunet-service-testbed_meminfo.c
 src/testbed/gnunet-service-testbed_oc.c
 src/testbed/gnunet-service-testbed_peers.c
+src/testbed/gnunet_testbed_mpi_spawn.c
 src/testbed/gnunet-testbed-profiler.c
-src/testbed/gnunet_mpi_test.c
-src/testbed/gnunet_testbed_mpi_spawn.c
+src/testbed/testbed_api_barriers.c
 src/testbed/testbed_api.c
-src/testbed/testbed_api_barriers.c
 src/testbed/testbed_api_hosts.c
 src/testbed/testbed_api_operations.c
 src/testbed/testbed_api_peers.c
 src/testbed/testbed_api_sd.c
 src/testbed/testbed_api_services.c
 src/testbed/testbed_api_statistics.c
+src/testbed/testbed_api_testbed.c
 src/testbed/testbed_api_test.c
-src/testbed/testbed_api_testbed.c
 src/testbed/testbed_api_topology.c
 src/testbed/testbed_api_underlay.c
 src/testbed/testbed_logger_api.c
@@ -342,39 +343,39 @@
 src/topology/friends.c
 src/topology/gnunet-daemon-topology.c
 src/transport/gnunet-helper-transport-bluetooth.c
+src/transport/gnunet-helper-transport-wlan.c
 src/transport/gnunet-helper-transport-wlan-dummy.c
-src/transport/gnunet-helper-transport-wlan.c
-src/transport/gnunet-service-transport.c
 src/transport/gnunet-service-transport_ats.c
 src/transport/gnunet-service-transport_blacklist.c
+src/transport/gnunet-service-transport.c
 src/transport/gnunet-service-transport_clients.c
 src/transport/gnunet-service-transport_hello.c
 src/transport/gnunet-service-transport_manipulation.c
 src/transport/gnunet-service-transport_neighbours.c
 src/transport/gnunet-service-transport_plugins.c
 src/transport/gnunet-service-transport_validation.c
+src/transport/gnunet-transport.c
 src/transport/gnunet-transport-certificate-creation.c
 src/transport/gnunet-transport-profiler.c
 src/transport/gnunet-transport-wlan-receiver.c
 src/transport/gnunet-transport-wlan-sender.c
-src/transport/gnunet-transport.c
 src/transport/plugin_transport_http_client.c
 src/transport/plugin_transport_http_common.c
 src/transport/plugin_transport_http_server.c
 src/transport/plugin_transport_smtp.c
 src/transport/plugin_transport_tcp.c
 src/transport/plugin_transport_template.c
+src/transport/plugin_transport_udp_broadcasting.c
 src/transport/plugin_transport_udp.c
-src/transport/plugin_transport_udp_broadcasting.c
 src/transport/plugin_transport_unix.c
 src/transport/plugin_transport_wlan.c
-src/transport/transport-testing.c
-src/transport/transport_api.c
 src/transport/transport_api_address_to_string.c
 src/transport/transport_api_blacklist.c
+src/transport/transport_api.c
 src/transport/transport_api_monitor_peers.c
 src/transport/transport_api_monitor_plugins.c
 src/transport/transport_api_monitor_validation.c
+src/transport/transport-testing.c
 src/tun/regex.c
 src/tun/tun.c
 src/util/bandwidth.c
@@ -389,8 +390,8 @@
 src/util/container_bloomfilter.c
 src/util/container_heap.c
 src/util/container_meta_data.c
+src/util/container_multihashmap32.c
 src/util/container_multihashmap.c
-src/util/container_multihashmap32.c
 src/util/container_multipeermap.c
 src/util/crypto_crc.c
 src/util/crypto_ecc.c
@@ -405,8 +406,8 @@
 src/util/disk.c
 src/util/getopt.c
 src/util/getopt_helpers.c
+src/util/gnunet-config.c
 src/util/gnunet-config-diff.c
-src/util/gnunet-config.c
 src/util/gnunet-ecc.c
 src/util/gnunet-helper-w32-console.c
 src/util/gnunet-resolver.c
@@ -437,8 +438,8 @@
 src/util/w32cat.c
 src/util/win.c
 src/util/winproc.c
+src/vpn/gnunet-helper-vpn.c
 src/vpn/gnunet-helper-vpn-windows.c
-src/vpn/gnunet-helper-vpn.c
 src/vpn/gnunet-service-vpn.c
 src/vpn/gnunet-vpn.c
 src/vpn/vpn_api.c

Modified: gnunet/po/de.po
===================================================================
--- gnunet/po/de.po     2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/de.po     2015-04-27 11:12:21 UTC (rev 35559)
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: gnunet 0.10.1\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2015-03-14 18:00+0100\n"
+"POT-Creation-Date: 2015-04-27 13:05+0200\n"
 "PO-Revision-Date: 2015-03-08 16:16+0100\n"
 "Last-Translator: Mario Blättermann <address@hidden>\n"
 "Language-Team: German <address@hidden>\n"
@@ -496,16 +496,16 @@
 msgid "Could not connect master [%u] and slave [%u]\n"
 msgstr "Verbindung zu gnunetd konnte nicht hergestellt werden.\n"
 
-#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:662
+#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:634
 #, fuzzy
 msgid "Initialization failed, shutdown\n"
 msgstr " Verbindung fehlgeschlagen\n"
 
-#: src/ats-tests/ats-testing-log.c:846
+#: src/ats-tests/ats-testing-log.c:834
 msgid "Stop logging\n"
 msgstr "Protokollierung stoppen\n"
 
-#: src/ats-tests/ats-testing-log.c:897
+#: src/ats-tests/ats-testing-log.c:885
 #, fuzzy, c-format
 msgid "Start logging `%s'\n"
 msgstr "Collection `%s' begonnen.\n"
@@ -553,6 +553,7 @@
 msgstr ""
 
 #: src/ats-tool/gnunet-ats.c:708 src/namestore/gnunet-namestore.c:700
+#: src/namestore/plugin_rest_namestore.c:812
 #: src/transport/gnunet-transport.c:1890
 #: src/transport/gnunet-transport-profiler.c:531
 #, c-format
@@ -1409,29 +1410,29 @@
 msgid "# PAYLOAD dropped (out of order)"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:168
+#: src/core/gnunet-service-core_neighbours.c:177
 msgid "# sessions terminated by transport disconnect"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:184
-#: src/core/gnunet-service-core_neighbours.c:342
+#: src/core/gnunet-service-core_neighbours.c:193
+#: src/core/gnunet-service-core_neighbours.c:355
 msgid "# neighbour entries allocated"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:252
+#: src/core/gnunet-service-core_neighbours.c:264
 msgid "# encrypted bytes given to transport"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:425
+#: src/core/gnunet-service-core_neighbours.c:438
 #, fuzzy, c-format
 msgid "Unsupported message of type %u (%u bytes) received from peer `%s'\n"
 msgstr "Ungültige `%s' Nachricht von Knoten `%s' empfangen.\n"
 
-#: src/core/gnunet-service-core_sessions.c:245
-#: src/core/gnunet-service-core_sessions.c:331
+#: src/core/gnunet-service-core_sessions.c:252
+#: src/core/gnunet-service-core_sessions.c:338
 #: src/dht/gnunet-service-dht_neighbours.c:661
 #: src/dht/gnunet-service-dht_neighbours.c:726
-#: src/fs/gnunet-service-fs_cp.c:645 src/fs/gnunet-service-fs_cp.c:1627
+#: src/fs/gnunet-service-fs_cp.c:654 src/fs/gnunet-service-fs_cp.c:1647
 #: src/topology/gnunet-daemon-topology.c:734
 #: src/topology/gnunet-daemon-topology.c:835
 #: src/transport/gnunet-service-transport_neighbours.c:755
@@ -1439,22 +1440,22 @@
 msgid "# peers connected"
 msgstr "# verbundener Knoten"
 
-#: src/core/gnunet-service-core_sessions.c:278
+#: src/core/gnunet-service-core_sessions.c:285
 #, fuzzy
 msgid "# type map refreshes sent"
 msgstr "# p2p Trace-Antworten gesendet"
 
-#: src/core/gnunet-service-core_sessions.c:397
+#: src/core/gnunet-service-core_sessions.c:404
 #, fuzzy
 msgid "# outdated typemap confirmations received"
 msgstr "# Bytes empfangen über TCP"
 
-#: src/core/gnunet-service-core_sessions.c:408
+#: src/core/gnunet-service-core_sessions.c:415
 #, fuzzy
 msgid "# valid typemap confirmations received"
 msgstr "# Bytes empfangen über TCP"
 
-#: src/core/gnunet-service-core_sessions.c:546
+#: src/core/gnunet-service-core_sessions.c:554
 msgid "# messages discarded (expired prior to transmission)"
 msgstr ""
 
@@ -1469,7 +1470,7 @@
 msgstr ""
 
 #: src/datacache/datacache.c:115 src/datacache/datacache.c:266
-#: src/datastore/gnunet-service-datastore.c:855
+#: src/datastore/gnunet-service-datastore.c:841
 msgid "# bytes stored"
 msgstr "# gespeicherte Bytes"
 
@@ -1478,8 +1479,8 @@
 msgstr "# gespeicherte Objekte"
 
 #: src/datacache/datacache.c:143 src/datacache/datacache.c:150
-#: src/datastore/gnunet-service-datastore.c:1557
-#: src/datastore/gnunet-service-datastore.c:1568
+#: src/datastore/gnunet-service-datastore.c:1598
+#: src/datastore/gnunet-service-datastore.c:1609
 #, fuzzy, c-format
 msgid "No `%s' specified for `%s' in configuration!\n"
 msgstr "In der Konfigurationsdatei wurden keine Anwendungen definiert!\n"
@@ -1512,8 +1513,8 @@
 
 #: src/datacache/plugin_datacache_sqlite.c:69
 #: src/datacache/plugin_datacache_sqlite.c:72
-#: src/datastore/plugin_datastore_mysql.c:809
-#: src/datastore/plugin_datastore_mysql.c:823
+#: src/datastore/plugin_datastore_mysql.c:818
+#: src/datastore/plugin_datastore_mysql.c:834
 #: src/datastore/plugin_datastore_sqlite.c:57 src/mysql/mysql.c:41
 #: src/mysql/mysql.c:48 src/mysql/mysql.c:522 src/mysql/mysql.c:531
 #: src/mysql/mysql.c:591 src/mysql/mysql.c:607
@@ -1716,8 +1717,8 @@
 
 #: src/datastore/gnunet-service-datastore.c:712
 #: src/datastore/gnunet-service-datastore.c:767
-#: src/datastore/gnunet-service-datastore.c:982
-#: src/datastore/gnunet-service-datastore.c:1529
+#: src/datastore/gnunet-service-datastore.c:999
+#: src/datastore/gnunet-service-datastore.c:1570
 msgid "# reserved"
 msgstr ""
 
@@ -1725,133 +1726,148 @@
 msgid "Could not find matching reservation"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:867
+#: src/datastore/gnunet-service-datastore.c:853
 #, c-format
 msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1029
+#: src/datastore/gnunet-service-datastore.c:1046
 #, fuzzy
 msgid "# GET requests received"
 msgstr "# Client Trace-Anfragen empfangen"
 
-#: src/datastore/gnunet-service-datastore.c:1041
+#: src/datastore/gnunet-service-datastore.c:1058
 msgid "# requests filtered by bloomfilter"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1069
+#: src/datastore/gnunet-service-datastore.c:1094
 #, fuzzy
 msgid "# UPDATE requests received"
 msgstr "# Client Trace-Anfragen empfangen"
 
-#: src/datastore/gnunet-service-datastore.c:1099
+#: src/datastore/gnunet-service-datastore.c:1122
 #, fuzzy
 msgid "# GET REPLICATION requests received"
 msgstr "# Client Trace-Anfragen empfangen"
 
-#: src/datastore/gnunet-service-datastore.c:1132
+#: src/datastore/gnunet-service-datastore.c:1155
 #, fuzzy
 msgid "# GET ZERO ANONYMITY requests received"
 msgstr "# Client Trace-Anfragen empfangen"
 
-#: src/datastore/gnunet-service-datastore.c:1157
+#: src/datastore/gnunet-service-datastore.c:1180
 msgid "Content not found"
 msgstr "Kein Inhalt gefunden"
 
-#: src/datastore/gnunet-service-datastore.c:1165
+#: src/datastore/gnunet-service-datastore.c:1188
 msgid "# bytes removed (explicit request)"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1197
+#: src/datastore/gnunet-service-datastore.c:1220
 #, fuzzy
 msgid "# REMOVE requests received"
 msgstr "# Client Trace-Anfragen empfangen"
 
-#: src/datastore/gnunet-service-datastore.c:1241
+#: src/datastore/gnunet-service-datastore.c:1264
 #, c-format
 msgid ""
 "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1269
 #, c-format
 msgid "New payload: %lld\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1299
+#: src/datastore/gnunet-service-datastore.c:1322
 #, c-format
 msgid "Loading `%s' datastore plugin\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1310
+#: src/datastore/gnunet-service-datastore.c:1333
 #, fuzzy, c-format
 msgid "Failed to load datastore plugin for `%s'\n"
 msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n"
 
-#: src/datastore/gnunet-service-datastore.c:1412
+#: src/datastore/gnunet-service-datastore.c:1402
+#: src/datastore/gnunet-service-datastore.c:1463
+msgid "Bloomfilter construction complete.\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1450
 msgid "Rebuilding bloomfilter.  Please be patient.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1419
+#: src/datastore/gnunet-service-datastore.c:1460
 msgid "Plugin does not support get_keys function. Please fix!\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1422
-msgid "Bloomfilter construction complete.\n"
-msgstr ""
-
-#: src/datastore/gnunet-service-datastore.c:1562
+#: src/datastore/gnunet-service-datastore.c:1603
 #, fuzzy, c-format
 msgid "# bytes used in file-sharing datastore `%s'"
 msgstr "# bytes erlaubt in der Datenbank"
 
-#: src/datastore/gnunet-service-datastore.c:1573
+#: src/datastore/gnunet-service-datastore.c:1614
 msgid "# quota"
 msgstr "# Kontingent"
 
-#: src/datastore/gnunet-service-datastore.c:1575
+#: src/datastore/gnunet-service-datastore.c:1616
 msgid "# cache size"
 msgstr "# Zwischenspeichergröße"
 
-#: src/datastore/gnunet-service-datastore.c:1588
+#: src/datastore/gnunet-service-datastore.c:1629
 #, c-format
 msgid "Could not use specified filename `%s' for bloomfilter.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1606
-#: src/datastore/gnunet-service-datastore.c:1622
+#: src/datastore/gnunet-service-datastore.c:1647
+#: src/datastore/gnunet-service-datastore.c:1663
 #, fuzzy, c-format
 msgid "Failed to remove bogus bloomfilter file `%s'\n"
 msgstr "Datei wurde als `%s' gespeichert.\n"
 
-#: src/datastore/gnunet-service-datastore.c:1652
+#: src/datastore/gnunet-service-datastore.c:1693
 msgid "Failed to initialize bloomfilter.\n"
 msgstr "Bloomfilter konnte nicht initialisiert werden.\n"
 
-#: src/datastore/plugin_datastore_heap.c:821
+#: src/datastore/plugin_datastore_heap.c:826
 msgid "Heap database running\n"
 msgstr "Heap-Datenbank läuft\n"
 
-#: src/datastore/plugin_datastore_mysql.c:786
+#: src/datastore/plugin_datastore_mysql.c:309
+#: src/datastore/plugin_datastore_sqlite.c:499
+#, fuzzy
+msgid "Data too large"
+msgstr "Anzahl der Werte"
+
+#: src/datastore/plugin_datastore_mysql.c:328
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:793
 #, fuzzy, c-format
 msgid "Failed to prepare statement `%s'\n"
 msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
 
-#: src/datastore/plugin_datastore_mysql.c:794
+#: src/datastore/plugin_datastore_mysql.c:802
 #, fuzzy, c-format
 msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
 msgstr "`%s' an `%s' schlug fehl bei %s:%d mit dem Fehler: %s\n"
 
-#: src/datastore/plugin_datastore_mysql.c:1025
+#: src/datastore/plugin_datastore_mysql.c:1036
 msgid "Mysql database running\n"
 msgstr "MySQL-Datenbank läuft\n"
 
-#: src/datastore/plugin_datastore_postgres.c:837
+#: src/datastore/plugin_datastore_postgres.c:331
+msgid "Postgress exec failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_postgres.c:846
 #, fuzzy
 msgid "Failed to drop table from database.\n"
 msgstr "Fehler beim Binden an UDP Port %d.\n"
 
-#: src/datastore/plugin_datastore_postgres.c:873
+#: src/datastore/plugin_datastore_postgres.c:882
 #: src/namecache/plugin_namecache_postgres.c:414
 #: src/namestore/plugin_namestore_postgres.c:569
 msgid "Postgres database running\n"
@@ -1874,29 +1890,29 @@
 msgid "Unable to initialize SQLite: %s.\n"
 msgstr "SQLite-Datenbank konnte nicht initialisiert werden: %s.\n"
 
-#: src/datastore/plugin_datastore_sqlite.c:661
+#: src/datastore/plugin_datastore_sqlite.c:680
 #, fuzzy
 msgid "Invalid data in database.  Trying to fix (by deletion).\n"
 msgstr "Ungültige Daten in %s. Korrektur wird versucht (durch Löschung).\n"
 
-#: src/datastore/plugin_datastore_sqlite.c:1156
+#: src/datastore/plugin_datastore_sqlite.c:1177
 msgid "sqlite version to old to determine size, assuming zero\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_sqlite.c:1176
+#: src/datastore/plugin_datastore_sqlite.c:1197
 #, c-format
 msgid ""
 "Using sqlite page utilization to estimate payload (%llu pages of size %llu "
 "bytes)\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_sqlite.c:1216
+#: src/datastore/plugin_datastore_sqlite.c:1237
 #: src/namecache/plugin_namecache_sqlite.c:580
 #: src/namestore/plugin_namestore_sqlite.c:716
 msgid "Sqlite database running\n"
 msgstr "Sqlite-Datenbank läuft\n"
 
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:260
 msgid "Template database running\n"
 msgstr ""
 
@@ -2514,50 +2530,50 @@
 msgid "Change DNS replies to point elsewhere."
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:456
+#: src/dns/gnunet-service-dns.c:459
 msgid "# DNS requests answered via TUN interface"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:603
+#: src/dns/gnunet-service-dns.c:606
 msgid "# DNS exit failed (failed to open socket)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:714
+#: src/dns/gnunet-service-dns.c:717
 msgid "# External DNS response discarded (no matching request)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:792
+#: src/dns/gnunet-service-dns.c:795
 msgid "# Client response discarded (no matching request)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:907
+#: src/dns/gnunet-service-dns.c:910
 msgid "Received malformed IPv4-UDP packet on TUN interface.\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:923
+#: src/dns/gnunet-service-dns.c:926
 msgid "Received malformed IPv6-UDP packet on TUN interface.\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:932
+#: src/dns/gnunet-service-dns.c:935
 #, c-format
 msgid "Got non-IP packet with %u bytes and protocol %u from TUN\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:942
+#: src/dns/gnunet-service-dns.c:945
 msgid "# Non-DNS UDP packet received via TUN interface"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:1009
+#: src/dns/gnunet-service-dns.c:1012
 msgid "# DNS requests received via TUN interface"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:1049
-#, c-format
-msgid "`%s' must be installed SUID, refusing to run\n"
+#: src/dns/gnunet-service-dns.c:1064 src/exit/gnunet-daemon-exit.c:3594
+msgid "need a valid IPv4 or IPv6 address\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:1069 src/exit/gnunet-daemon-exit.c:3594
-msgid "need a valid IPv4 or IPv6 address\n"
+#: src/dns/gnunet-service-dns.c:1082
+#, c-format
+msgid "`%s' must be installed SUID, will not run DNS interceptor\n"
 msgstr ""
 
 #: src/dv/gnunet-dv.c:169
@@ -2796,58 +2812,58 @@
 msgid "Daemon to run to provide an IP exit node for the VPN"
 msgstr ""
 
-#: src/fragmentation/defragmentation.c:271
+#: src/fragmentation/defragmentation.c:277
 msgid "# acknowledgements sent for fragment"
 msgstr ""
 
-#: src/fragmentation/defragmentation.c:463
+#: src/fragmentation/defragmentation.c:470
 #: src/transport/plugin_transport_wlan.c:1515
 #, fuzzy
 msgid "# fragments received"
 msgstr "# verworfener Nachrichten"
 
-#: src/fragmentation/defragmentation.c:533
+#: src/fragmentation/defragmentation.c:540
 #, fuzzy
 msgid "# duplicate fragments received"
 msgstr "# Bytes empfangen über TCP"
 
-#: src/fragmentation/defragmentation.c:549
+#: src/fragmentation/defragmentation.c:558
 msgid "# messages defragmented"
 msgstr "# defragmentierter Nachrichten"
 
-#: src/fragmentation/fragmentation.c:234
+#: src/fragmentation/fragmentation.c:235
 #, fuzzy
 msgid "# fragments transmitted"
 msgstr "# Selbstbekanntmachungen übertragen"
 
-#: src/fragmentation/fragmentation.c:237
+#: src/fragmentation/fragmentation.c:240
 #, fuzzy
 msgid "# fragments retransmitted"
 msgstr "# Selbstbekanntmachungen übertragen"
 
-#: src/fragmentation/fragmentation.c:263
+#: src/fragmentation/fragmentation.c:269
 #, fuzzy
 msgid "# fragments wrap arounds"
 msgstr "# verworfener Nachrichten"
 
-#: src/fragmentation/fragmentation.c:307
+#: src/fragmentation/fragmentation.c:315
 msgid "# messages fragmented"
 msgstr "# fragmentierter Nachrichten"
 
-#: src/fragmentation/fragmentation.c:310
+#: src/fragmentation/fragmentation.c:321
 msgid "# total size of fragmented messages"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:431
+#: src/fragmentation/fragmentation.c:444
 #, fuzzy
 msgid "# fragment acknowledgements received"
 msgstr "# Knotenankündigungen empfangen"
 
-#: src/fragmentation/fragmentation.c:437
+#: src/fragmentation/fragmentation.c:451
 msgid "# bits removed from fragmentation ACKs"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:461
+#: src/fragmentation/fragmentation.c:475
 #, fuzzy
 msgid "# fragmentation transmissions completed"
 msgstr "# Klartext PONG Nachrichten empfangen"
@@ -3120,59 +3136,59 @@
 msgid "Got result with unknown block type `%d', ignoring"
 msgstr ""
 
-#: src/fs/fs_unindex.c:59
+#: src/fs/fs_unindex.c:63
 msgid "Failed to find given position in file"
 msgstr ""
 
-#: src/fs/fs_unindex.c:64
+#: src/fs/fs_unindex.c:68
 #, fuzzy
 msgid "Failed to read file"
 msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n"
 
-#: src/fs/fs_unindex.c:234
+#: src/fs/fs_unindex.c:245
 msgid "Unexpected time for a response from `fs' service."
 msgstr ""
 
-#: src/fs/fs_unindex.c:242
+#: src/fs/fs_unindex.c:253
 msgid "Timeout waiting for `fs' service."
 msgstr ""
 
-#: src/fs/fs_unindex.c:250
+#: src/fs/fs_unindex.c:261
 #, fuzzy
 msgid "Invalid response from `fs' service."
 msgstr "Ungültige Antwort auf `%s'.\n"
 
-#: src/fs/fs_unindex.c:291
+#: src/fs/fs_unindex.c:304
 #, fuzzy
 msgid "Failed to connect to FS service for unindexing."
 msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden."
 
-#: src/fs/fs_unindex.c:347 src/fs/fs_unindex.c:359
+#: src/fs/fs_unindex.c:360 src/fs/fs_unindex.c:372
 #, fuzzy
 msgid "Failed to get KSKs from directory scan."
 msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n"
 
-#: src/fs/fs_unindex.c:355
+#: src/fs/fs_unindex.c:368
 #, fuzzy, c-format
 msgid "Internal error scanning `%s'.\n"
 msgstr "Absicherung fehlgeschlagen bei %s:%d.\n"
 
-#: src/fs/fs_unindex.c:414
+#: src/fs/fs_unindex.c:427
 #, fuzzy, c-format
 msgid "Failed to remove UBlock: %s\n"
 msgstr "Datei wurde als `%s' gespeichert.\n"
 
-#: src/fs/fs_unindex.c:562 src/fs/fs_unindex.c:626
+#: src/fs/fs_unindex.c:590 src/fs/fs_unindex.c:656
 #, fuzzy
 msgid "Failed to connect to `datastore' service."
 msgstr "`%s' Dienst konnte nicht initialisiert werden.\n"
 
-#: src/fs/fs_unindex.c:639
+#: src/fs/fs_unindex.c:669
 #, fuzzy
 msgid "Failed to open file for unindexing."
 msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden."
 
-#: src/fs/fs_unindex.c:673
+#: src/fs/fs_unindex.c:708
 #, fuzzy
 msgid "Failed to compute hash of file."
 msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden."
@@ -3767,96 +3783,96 @@
 msgid "# cadet connections active"
 msgstr " Verbindung fehlgeschlagen\n"
 
-#: src/fs/gnunet-service-fs_cp.c:726
+#: src/fs/gnunet-service-fs_cp.c:735
 #, fuzzy
 msgid "# migration stop messages received"
 msgstr "# verschlüsselter PING Nachrichten empfangen"
 
-#: src/fs/gnunet-service-fs_cp.c:730
+#: src/fs/gnunet-service-fs_cp.c:739
 #, c-format
 msgid "Migration of content to peer `%s' blocked for %s\n"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:768
+#: src/fs/gnunet-service-fs_cp.c:776
 #, fuzzy
 msgid "# replies transmitted to other peers"
 msgstr "# Bytes des Typs %d übertragen"
 
-#: src/fs/gnunet-service-fs_cp.c:774
+#: src/fs/gnunet-service-fs_cp.c:784
 #, fuzzy
 msgid "# replies dropped"
 msgstr "# gap falsche Antworten"
 
-#: src/fs/gnunet-service-fs_cp.c:799 src/fs/gnunet-service-fs_cp.c:1384
+#: src/fs/gnunet-service-fs_cp.c:810 src/fs/gnunet-service-fs_cp.c:1404
 msgid "# P2P searches active"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:904
+#: src/fs/gnunet-service-fs_cp.c:915
 msgid "# artificial delays introduced (ms)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:960
+#: src/fs/gnunet-service-fs_cp.c:971
 msgid "# replies dropped due to type mismatch"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:968
+#: src/fs/gnunet-service-fs_cp.c:979
 #, fuzzy
 msgid "# replies received for other peers"
 msgstr "# Bytes des Typs %d empfangen"
 
-#: src/fs/gnunet-service-fs_cp.c:982
+#: src/fs/gnunet-service-fs_cp.c:993
 msgid "# replies dropped due to insufficient cover traffic"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1030
+#: src/fs/gnunet-service-fs_cp.c:1041
 msgid "# P2P searches destroyed due to ultimate reply"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1098
+#: src/fs/gnunet-service-fs_cp.c:1109
 msgid "# requests done for free (low load)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1123
+#: src/fs/gnunet-service-fs_cp.c:1134
 #, fuzzy
 msgid "# request dropped, priority insufficient"
 msgstr "# gap Anfragen verworfen: Kollision in RT"
 
-#: src/fs/gnunet-service-fs_cp.c:1133
+#: src/fs/gnunet-service-fs_cp.c:1144
 msgid "# requests done for a price (normal load)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1210
+#: src/fs/gnunet-service-fs_cp.c:1221
 msgid "# GET requests received (from other peers)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1245
+#: src/fs/gnunet-service-fs_cp.c:1256
 msgid "# requests dropped due to initiator not being connected"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1266
+#: src/fs/gnunet-service-fs_cp.c:1277
 #, fuzzy
 msgid "# requests dropped due to missing reverse route"
 msgstr "# gap Anfragen verworfen: Kollision in RT"
 
-#: src/fs/gnunet-service-fs_cp.c:1277
+#: src/fs/gnunet-service-fs_cp.c:1288
 #, fuzzy
 msgid "# requests dropped due to full reply queue"
 msgstr "# gap Anfragen verworfen: Kollision in RT"
 
-#: src/fs/gnunet-service-fs_cp.c:1329
+#: src/fs/gnunet-service-fs_cp.c:1340
 msgid "# requests dropped due TTL underflow"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1353
+#: src/fs/gnunet-service-fs_cp.c:1365
 msgid "# requests dropped due to higher-TTL request"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1382
+#: src/fs/gnunet-service-fs_cp.c:1402
 #, fuzzy
 msgid "# P2P query messages received and processed"
 msgstr "# verschlüsselter PING Nachrichten empfangen"
 
-#: src/fs/gnunet-service-fs_cp.c:1821
+#: src/fs/gnunet-service-fs_cp.c:1841
 #, fuzzy
 msgid "# migration stop messages sent"
 msgstr "# verschlüsselter PING Nachrichten empfangen"
@@ -4200,7 +4216,7 @@
 msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:215
+#: src/gns/gnunet-gns.c:215 src/gns/plugin_rest_gns.c:334
 #, c-format
 msgid "Invalid typename specified, assuming `ANY'\n"
 msgstr ""
@@ -4216,6 +4232,7 @@
 msgstr ""
 
 #: src/gns/gnunet-gns.c:353 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/plugin_rest_gns.c:459
 #, c-format
 msgid ""
 "Ego for `gns-master' not found, cannot perform lookup.  Did you run gnunet-"
@@ -4354,7 +4371,7 @@
 msgid "Failed to start HTTPS server for `%s'\n"
 msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n"
 
-#: src/gns/gnunet-gns-proxy.c:2225
+#: src/gns/gnunet-gns-proxy.c:2225 src/rest/gnunet-rest-server.c:529
 #, fuzzy
 msgid "Failed to pass client to MHD\n"
 msgstr "Fehler beim Starten der Collection.\n"
@@ -4459,21 +4476,21 @@
 msgid "GNS lookup resulted in DNS name that is too long (`%s')\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:1886
+#: src/gns/gnunet-service-gns_resolver.c:1891
 msgid "GNS lookup recursion failed (no delegation record found)\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:1910
+#: src/gns/gnunet-service-gns_resolver.c:1915
 #, fuzzy, c-format
 msgid "Failed to cache GNS resolution: %s\n"
 msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
 
-#: src/gns/gnunet-service-gns_resolver.c:2192
+#: src/gns/gnunet-service-gns_resolver.c:2197
 #, c-format
 msgid "Zone %s was revoked, resolution fails\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:2341
+#: src/gns/gnunet-service-gns_resolver.c:2346
 #, c-format
 msgid "Hostname `%s' is not well-formed, resolution fails\n"
 msgstr ""
@@ -4503,6 +4520,15 @@
 msgid "Unable to parse BOX record string `%s'\n"
 msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
 
+#: src/gns/plugin_rest_gns.c:422
+msgid "Ego for not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:652
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr " Verbindung fehlgeschlagen\n"
+
 #: src/gnsrecord/plugin_gnsrecord_dns.c:291
 #, c-format
 msgid "Unable to parse IPv4 address `%s'\n"
@@ -5026,6 +5052,10 @@
 msgid "Failed to create directory `%s' for storing egos\n"
 msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n"
 
+#: src/identity/plugin_rest_identity.c:803
+msgid "Identity REST API initialized\n"
+msgstr ""
+
 #: src/mysql/mysql.c:174
 #, c-format
 msgid "Trying to use file `%s' for MySQL configuration.\n"
@@ -5051,10 +5081,10 @@
 msgid "You must specify which zone should be accessed\n"
 msgstr "Gibt an, welcher TRANSPORT getestet werden soll"
 
-#: src/namecache/gnunet-namecache.c:195 src/namestore/gnunet-namestore.c:844
-#, c-format
-msgid "Invalid public key for reverse lookup `%s'\n"
-msgstr ""
+#: src/namecache/gnunet-namecache.c:195
+#, fuzzy, c-format
+msgid "Invalid public key for zone `%s'\n"
+msgstr "Ungültiger Parameter: `%s'\n"
 
 #: src/namecache/gnunet-namecache.c:203
 #, fuzzy, c-format
@@ -5091,11 +5121,13 @@
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:332
+#: src/namestore/plugin_rest_namestore.c:505
 #, c-format
 msgid "Deleting record failed, record does not exist%s%s\n"
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:339
+#: src/namestore/plugin_rest_namestore.c:514
 #, c-format
 msgid "Deleting record failed%s%s\n"
 msgstr ""
@@ -5113,6 +5145,7 @@
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:628
+#: src/namestore/plugin_rest_namestore.c:538
 #, c-format
 msgid "There are no records under label `%s' that could be deleted.\n"
 msgstr ""
@@ -5130,6 +5163,7 @@
 
 #: src/namestore/gnunet-namestore.c:719
 #: src/namestore/gnunet-namestore-fcfsd.c:984
+#: src/namestore/plugin_rest_namestore.c:821
 #, fuzzy
 msgid "Failed to connect to namestore\n"
 msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
@@ -5147,11 +5181,14 @@
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:745
+#: src/namestore/plugin_rest_namestore.c:608
 #, fuzzy, c-format
 msgid "Unsupported type `%s'\n"
 msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
 
 #: src/namestore/gnunet-namestore.c:765
+#: src/namestore/plugin_rest_namestore.c:626
+#: src/namestore/plugin_rest_namestore.c:666
 #, fuzzy, c-format
 msgid "Value `%s' invalid for record type `%s'\n"
 msgstr "%s: Symbolwert `%s' ist ungültig für %s\n"
@@ -5165,6 +5202,11 @@
 msgid "del"
 msgstr ""
 
+#: src/namestore/gnunet-namestore.c:844
+#, c-format
+msgid "Invalid public key for reverse lookup `%s'\n"
+msgstr ""
+
 #: src/namestore/gnunet-namestore.c:868
 #: src/peerinfo-tool/gnunet-peerinfo.c:817
 #, fuzzy, c-format
@@ -5177,21 +5219,25 @@
 msgstr "Ungültiger Parameter: `%s'\n"
 
 #: src/namestore/gnunet-namestore.c:943
+#: src/namestore/plugin_rest_namestore.c:851
 #, fuzzy, c-format
 msgid "Ego `%s' not known to identity service\n"
 msgstr "`%s': unbekannter Dienst: %s\n"
 
 #: src/namestore/gnunet-namestore.c:970
+#: src/namestore/plugin_rest_namestore.c:878
 #, c-format
 msgid "No default ego configured in identity service\n"
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:1006
+#: src/namestore/plugin_rest_namestore.c:917
 #, c-format
 msgid "Identity service is not running\n"
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:1018
+#: src/namestore/plugin_rest_namestore.c:946
 #, fuzzy, c-format
 msgid "Cannot connect to identity service\n"
 msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n"
@@ -5320,6 +5366,11 @@
 msgid "Namestore failed to store record\n"
 msgstr ""
 
+#: src/namestore/plugin_rest_namestore.c:1023
+#, fuzzy
+msgid "Namestore REST API initialized\n"
+msgstr " Verbindung fehlgeschlagen\n"
+
 #: src/nat/gnunet-nat-server.c:279
 #, c-format
 msgid "Please pass valid port number as the first argument! (got `%s')\n"
@@ -5568,7 +5619,7 @@
 msgstr ""
 
 #: src/nse/gnunet-service-nse.c:1537
-#: src/revocation/gnunet-service-revocation.c:815 src/util/gnunet-scrypt.c:260
+#: src/revocation/gnunet-service-revocation.c:827 src/util/gnunet-scrypt.c:260
 msgid "Value is too large.\n"
 msgstr ""
 
@@ -6101,6 +6152,15 @@
 msgid "Regex `%s' is too long!\n"
 msgstr ""
 
+#: src/rest/gnunet-rest-server.c:766
+msgid "listen on specified port (default: 7776)"
+msgstr ""
+
+#: src/rest/gnunet-rest-server.c:783
+#, fuzzy
+msgid "GNUnet REST server"
+msgstr "GNUnet Netzwerk Topologie tracen."
+
 #: src/revocation/gnunet-revocation.c:126
 #, c-format
 msgid "Key `%s' is valid\n"
@@ -6227,11 +6287,11 @@
 msgstr "# Klartext PONG Nachrichten empfangen"
 
 #: src/revocation/gnunet-service-revocation.c:493
-#: src/revocation/gnunet-service-revocation.c:747
+#: src/revocation/gnunet-service-revocation.c:759
 msgid "SET service crashed, terminating revocation service\n"
 msgstr ""
 
-#: src/revocation/gnunet-service-revocation.c:839
+#: src/revocation/gnunet-service-revocation.c:851
 #, fuzzy
 msgid "Could not open revocation database file!"
 msgstr "Knoten `%s' konnte nicht in der Routing Tabelle gefunden werden!\n"
@@ -7928,7 +7988,7 @@
 msgstr ""
 
 #: src/transport/plugin_transport_http_server.c:2825
-#: src/transport/plugin_transport_udp.c:3336
+#: src/transport/plugin_transport_udp.c:3335
 msgid "Disabling IPv6 since it is not supported on this system!\n"
 msgstr ""
 
@@ -8157,49 +8217,49 @@
 msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
 msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n"
 
-#: src/transport/plugin_transport_udp.c:3082
+#: src/transport/plugin_transport_udp.c:3081
 #, c-format
 msgid ""
 "UDP could not transmit message to `%s': Network seems down, please check "
 "your network configuration\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3096
+#: src/transport/plugin_transport_udp.c:3095
 msgid ""
 "UDP could not transmit IPv6 message! Please check your network configuration "
 "and disable IPv6 if your connection does not have a global IPv6 address\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3412
-#: src/transport/plugin_transport_udp.c:3511
+#: src/transport/plugin_transport_udp.c:3411
+#: src/transport/plugin_transport_udp.c:3510
 #, fuzzy, c-format
 msgid "Failed to bind UDP socket to %s: %s\n"
 msgstr "UDP-Sockets können nicht geöffnet werden\n"
 
-#: src/transport/plugin_transport_udp.c:3430
+#: src/transport/plugin_transport_udp.c:3429
 msgid "Disabling IPv4 since it is not supported on this system!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3521
+#: src/transport/plugin_transport_udp.c:3520
 msgid "Failed to open UDP sockets\n"
 msgstr "UDP-Sockets können nicht geöffnet werden\n"
 
-#: src/transport/plugin_transport_udp.c:3592
-#: src/transport/plugin_transport_udp.c:3606
+#: src/transport/plugin_transport_udp.c:3591
+#: src/transport/plugin_transport_udp.c:3605
 msgid "must be in [0,65535]"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3638
+#: src/transport/plugin_transport_udp.c:3637
 #, fuzzy
 msgid "must be valid IPv4 address"
 msgstr "»%s« ist keine gültige IP-Adresse.\n"
 
-#: src/transport/plugin_transport_udp.c:3665
+#: src/transport/plugin_transport_udp.c:3664
 #, fuzzy
 msgid "must be valid IPv6 address"
 msgstr "»%s« ist keine gültige IP-Adresse.\n"
 
-#: src/transport/plugin_transport_udp.c:3731
+#: src/transport/plugin_transport_udp.c:3730
 #, fuzzy
 msgid "Failed to create UDP network sockets\n"
 msgstr "UDP-Sockets können nicht geöffnet werden\n"
@@ -8425,24 +8485,24 @@
 msgid "Syntax error while deserializing in line %u\n"
 msgstr "Syntaxfehler in Konfigurationsdatei `%s' in Zeile %d.\n"
 
-#: src/util/configuration.c:1026
+#: src/util/configuration.c:1025
 #, c-format
 msgid ""
 "Configuration value '%s' for '%s' in section '%s' is not in set of legal "
 "choices\n"
 msgstr ""
 
-#: src/util/configuration.c:1145
+#: src/util/configuration.c:1144
 #, c-format
 msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
 msgstr ""
 
-#: src/util/configuration.c:1177
+#: src/util/configuration.c:1176
 #, c-format
 msgid "Missing closing `%s' in option `%s'\n"
 msgstr ""
 
-#: src/util/configuration.c:1251
+#: src/util/configuration.c:1250
 #, c-format
 msgid ""
 "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8466,52 +8526,52 @@
 "%llu)\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:731 src/util/crypto_ecc.c:769
-#: src/util/crypto_ecc.c:887 src/util/crypto_ecc.c:925
+#: src/util/crypto_ecc.c:733 src/util/crypto_ecc.c:771
+#: src/util/crypto_ecc.c:889 src/util/crypto_ecc.c:927
 #, fuzzy, c-format
 msgid "Could not acquire lock on file `%s': %s...\n"
 msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n"
 
-#: src/util/crypto_ecc.c:736 src/util/crypto_ecc.c:892
+#: src/util/crypto_ecc.c:738 src/util/crypto_ecc.c:894
 #, fuzzy
 msgid "Creating a new private key.  This may take a while.\n"
 msgstr "Ein neuer Hostkey wird erzeugt (dies kann eine Weile dauern).\n"
 
-#: src/util/crypto_ecc.c:773 src/util/crypto_ecc.c:929
+#: src/util/crypto_ecc.c:775 src/util/crypto_ecc.c:931
 msgid "This may be ok if someone is currently generating a private key.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:803 src/util/crypto_ecc.c:959
+#: src/util/crypto_ecc.c:805 src/util/crypto_ecc.c:961
 #, c-format
 msgid ""
 "When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:807 src/util/crypto_ecc.c:963
+#: src/util/crypto_ecc.c:809 src/util/crypto_ecc.c:965
 msgid "This may be ok if someone is currently generating a key.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:1045
+#: src/util/crypto_ecc.c:1047
 #, fuzzy
 msgid "Could not load peer's private key\n"
 msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n"
 
-#: src/util/crypto_ecc.c:1149
+#: src/util/crypto_ecc.c:1151
 #, fuzzy, c-format
 msgid "ECC signing failed at %s:%d: %s\n"
 msgstr "`%s' schlug fehl bei %s:%d mit dem Fehler: `%s'.\n"
 
-#: src/util/crypto_ecc.c:1199
+#: src/util/crypto_ecc.c:1201
 #, fuzzy, c-format
 msgid "EdDSA signing failed at %s:%d: %s\n"
 msgstr "`%s' schlug fehl bei %s:%d mit dem Fehler: `%s'.\n"
 
-#: src/util/crypto_ecc.c:1273
+#: src/util/crypto_ecc.c:1275
 #, fuzzy, c-format
 msgid "ECDSA signature verification failed at %s:%d: %s\n"
 msgstr "RSA Signaturüberprüfung fehlgeschlagen bei %s:%d: %s\n"
 
-#: src/util/crypto_ecc.c:1330
+#: src/util/crypto_ecc.c:1332
 #, fuzzy, c-format
 msgid "EdDSA signature verification failed at %s:%d: %s\n"
 msgstr "RSA Signaturüberprüfung fehlgeschlagen bei %s:%d: %s\n"
@@ -8522,17 +8582,17 @@
 msgstr ""
 "libgcrypt hat nicht die erwartete Version (Version %s wird vorausgesetzt).\n"
 
-#: src/util/crypto_rsa.c:809
+#: src/util/crypto_rsa.c:825
 #, fuzzy, c-format
 msgid "RSA signature verification failed at %s:%d: %s\n"
 msgstr "RSA Signaturüberprüfung fehlgeschlagen bei %s:%d: %s\n"
 
-#: src/util/disk.c:1218
+#: src/util/disk.c:1222
 #, fuzzy, c-format
 msgid "Expected `%s' to be a directory!\n"
 msgstr "`%s' erwartet, dass `%s' ein Verzeichnis ist!\n"
 
-#: src/util/disk.c:1580 src/util/service.c:1328
+#: src/util/disk.c:1584 src/util/service.c:1328
 #, fuzzy, c-format
 msgid "Cannot obtain information about user `%s': %s\n"
 msgstr "Fehler beim Speichern der Konfigurationsdatei: `%s': %s.\n"
@@ -8597,7 +8657,7 @@
 msgid "Use %s to get a list of options.\n"
 msgstr "Verwenden Sie --help, um eine Liste der Optionen zu erhalten.\n"
 
-#: src/util/getopt_helpers.c:84
+#: src/util/getopt_helpers.c:90
 #, c-format
 msgid ""
 "Arguments mandatory for long options are also mandatory for short options.\n"
@@ -8605,12 +8665,12 @@
 "Argumente, die für lange Optionen zwingend sind, sind auch für kurze "
 "Optionen zwingend.\n"
 
-#: src/util/getopt_helpers.c:268 src/util/getopt_helpers.c:326
+#: src/util/getopt_helpers.c:274 src/util/getopt_helpers.c:332
 #, c-format
 msgid "You must pass a number to the `%s' option.\n"
 msgstr "Sie müssen für die Option »%s« zusätzlich eine Zahl angeben.\n"
 
-#: src/util/getopt_helpers.c:298
+#: src/util/getopt_helpers.c:304
 #, c-format
 msgid "You must pass relative time to the `%s' option.\n"
 msgstr "Sie müssen eine relative Zeit zu der Option »%s« übergeben.\n"
@@ -8854,23 +8914,23 @@
 msgid "GetExitCodeProcess failed for binary %s (%d).\n"
 msgstr ""
 
-#: src/util/plugin.c:87
+#: src/util/plugin.c:86
 #, c-format
 msgid "Initialization of plugin mechanism failed: %s!\n"
 msgstr "Initialisierung des Plugin-Mechanismus fehlgeschlagen: %s!\n"
 
-#: src/util/plugin.c:148
+#: src/util/plugin.c:151
 #, fuzzy, c-format
 msgid "`%s' failed to resolve method '%s' with error: %s\n"
 msgstr ""
 "`%s' konnte die Methode '%s%s' nicht auflösen. Ort: %s:%d. Fehler: %s\n"
 
-#: src/util/plugin.c:223
+#: src/util/plugin.c:226
 #, fuzzy, c-format
 msgid "`%s' failed for library `%s' with error: %s\n"
 msgstr "`%s' fehlgeschlagen für die Bibliothek `%s'. Ort: %s:%d. Fehler: %s\n"
 
-#: src/util/plugin.c:382
+#: src/util/plugin.c:385
 #, fuzzy
 msgid "Could not determine plugin installation path.\n"
 msgstr "Öffentliche IP-Adresse konnte nicht ermittelt werden.\n"
@@ -9452,10 +9512,6 @@
 #~ msgstr "Empfangene Client-Nachricht ist ungültig.\n"
 
 #, fuzzy
-#~ msgid "Mesh initialized\n"
-#~ msgstr " Verbindung fehlgeschlagen\n"
-
-#, fuzzy
 #~ msgid "# SUC responder result messages received"
 #~ msgstr "# verschlüsselter PING Nachrichten empfangen"
 

Modified: gnunet/po/es.po
===================================================================
--- gnunet/po/es.po     2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/es.po     2015-04-27 11:12:21 UTC (rev 35559)
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gnunet 0.9.5a\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2015-03-14 18:00+0100\n"
+"POT-Creation-Date: 2015-04-27 13:05+0200\n"
 "PO-Revision-Date: 2013-02-23 17:50+0100\n"
 "Last-Translator: Miguel Ángel Arruga Vivas <address@hidden>\n"
 "Language-Team: Spanish <address@hidden>\n"
@@ -535,16 +535,16 @@
 msgid "Could not connect master [%u] and slave [%u]\n"
 msgstr "¡No se pudo conectar al servicio %s!\n"
 
-#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:662
+#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:634
 #, fuzzy
 msgid "Initialization failed, shutdown\n"
 msgstr "¡La inicialización del mecanismo de módulos falló: %s!\n"
 
-#: src/ats-tests/ats-testing-log.c:846
+#: src/ats-tests/ats-testing-log.c:834
 msgid "Stop logging\n"
 msgstr ""
 
-#: src/ats-tests/ats-testing-log.c:897
+#: src/ats-tests/ats-testing-log.c:885
 #, fuzzy, c-format
 msgid "Start logging `%s'\n"
 msgstr "Iniciando descarga «%s».\n"
@@ -600,6 +600,7 @@
 msgstr "Cuota para la red «%11s» (entrada/salida): %10s / %10s\n"
 
 #: src/ats-tool/gnunet-ats.c:708 src/namestore/gnunet-namestore.c:700
+#: src/namestore/plugin_rest_namestore.c:812
 #: src/transport/gnunet-transport.c:1890
 #: src/transport/gnunet-transport-profiler.c:531
 #, c-format
@@ -1480,29 +1481,29 @@
 msgid "# PAYLOAD dropped (out of order)"
 msgstr "# bytes omitidos (fuera de secuencia)"
 
-#: src/core/gnunet-service-core_neighbours.c:168
+#: src/core/gnunet-service-core_neighbours.c:177
 msgid "# sessions terminated by transport disconnect"
 msgstr "# sesiones terminadas por desconexión de transporte"
 
-#: src/core/gnunet-service-core_neighbours.c:184
-#: src/core/gnunet-service-core_neighbours.c:342
+#: src/core/gnunet-service-core_neighbours.c:193
+#: src/core/gnunet-service-core_neighbours.c:355
 msgid "# neighbour entries allocated"
 msgstr "# entradas de vecinos alojadas"
 
-#: src/core/gnunet-service-core_neighbours.c:252
+#: src/core/gnunet-service-core_neighbours.c:264
 msgid "# encrypted bytes given to transport"
 msgstr "# bytes cifrados dados al transporte"
 
-#: src/core/gnunet-service-core_neighbours.c:425
+#: src/core/gnunet-service-core_neighbours.c:438
 #, c-format
 msgid "Unsupported message of type %u (%u bytes) received from peer `%s'\n"
 msgstr "Mensaje no soportado del tipo %u (%u bytes) recibido del par «%s»\n"
 
-#: src/core/gnunet-service-core_sessions.c:245
-#: src/core/gnunet-service-core_sessions.c:331
+#: src/core/gnunet-service-core_sessions.c:252
+#: src/core/gnunet-service-core_sessions.c:338
 #: src/dht/gnunet-service-dht_neighbours.c:661
 #: src/dht/gnunet-service-dht_neighbours.c:726
-#: src/fs/gnunet-service-fs_cp.c:645 src/fs/gnunet-service-fs_cp.c:1627
+#: src/fs/gnunet-service-fs_cp.c:654 src/fs/gnunet-service-fs_cp.c:1647
 #: src/topology/gnunet-daemon-topology.c:734
 #: src/topology/gnunet-daemon-topology.c:835
 #: src/transport/gnunet-service-transport_neighbours.c:755
@@ -1510,21 +1511,21 @@
 msgid "# peers connected"
 msgstr "# pares conectados"
 
-#: src/core/gnunet-service-core_sessions.c:278
+#: src/core/gnunet-service-core_sessions.c:285
 msgid "# type map refreshes sent"
 msgstr "# envíos de refrescos del mapa de tipos"
 
-#: src/core/gnunet-service-core_sessions.c:397
+#: src/core/gnunet-service-core_sessions.c:404
 #, fuzzy
 msgid "# outdated typemap confirmations received"
 msgstr "Se produjo un fallo al encolar una confirmación de recepción\n"
 
-#: src/core/gnunet-service-core_sessions.c:408
+#: src/core/gnunet-service-core_sessions.c:415
 #, fuzzy
 msgid "# valid typemap confirmations received"
 msgstr "Se produjo un fallo al encolar una confirmación de recepción\n"
 
-#: src/core/gnunet-service-core_sessions.c:546
+#: src/core/gnunet-service-core_sessions.c:554
 msgid "# messages discarded (expired prior to transmission)"
 msgstr "# mensajes descartados (expirados antes de su transmisión)"
 
@@ -1538,7 +1539,7 @@
 msgstr "# actualizaciones de mi mapa de tipos"
 
 #: src/datacache/datacache.c:115 src/datacache/datacache.c:266
-#: src/datastore/gnunet-service-datastore.c:855
+#: src/datastore/gnunet-service-datastore.c:841
 msgid "# bytes stored"
 msgstr "# bytes almacenados"
 
@@ -1547,8 +1548,8 @@
 msgstr "# elementos almacenados"
 
 #: src/datacache/datacache.c:143 src/datacache/datacache.c:150
-#: src/datastore/gnunet-service-datastore.c:1557
-#: src/datastore/gnunet-service-datastore.c:1568
+#: src/datastore/gnunet-service-datastore.c:1598
+#: src/datastore/gnunet-service-datastore.c:1609
 #, c-format
 msgid "No `%s' specified for `%s' in configuration!\n"
 msgstr "¡No se ha especificado ningún «%s» para «%s» en la configuración!\n"
@@ -1582,8 +1583,8 @@
 
 #: src/datacache/plugin_datacache_sqlite.c:69
 #: src/datacache/plugin_datacache_sqlite.c:72
-#: src/datastore/plugin_datastore_mysql.c:809
-#: src/datastore/plugin_datastore_mysql.c:823
+#: src/datastore/plugin_datastore_mysql.c:818
+#: src/datastore/plugin_datastore_mysql.c:834
 #: src/datastore/plugin_datastore_sqlite.c:57 src/mysql/mysql.c:41
 #: src/mysql/mysql.c:48 src/mysql/mysql.c:522 src/mysql/mysql.c:531
 #: src/mysql/mysql.c:591 src/mysql/mysql.c:607
@@ -1788,8 +1789,8 @@
 
 #: src/datastore/gnunet-service-datastore.c:712
 #: src/datastore/gnunet-service-datastore.c:767
-#: src/datastore/gnunet-service-datastore.c:982
-#: src/datastore/gnunet-service-datastore.c:1529
+#: src/datastore/gnunet-service-datastore.c:999
+#: src/datastore/gnunet-service-datastore.c:1570
 msgid "# reserved"
 msgstr "# reservado"
 
@@ -1797,46 +1798,46 @@
 msgid "Could not find matching reservation"
 msgstr "No se pudo encontrar una reserva coincidente"
 
-#: src/datastore/gnunet-service-datastore.c:867
+#: src/datastore/gnunet-service-datastore.c:853
 #, c-format
 msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
 msgstr ""
 "Se necesitan %llu bytes más de espacio (%llu permitidos, usando %llu)\n"
 
-#: src/datastore/gnunet-service-datastore.c:1029
+#: src/datastore/gnunet-service-datastore.c:1046
 msgid "# GET requests received"
 msgstr "# peticiones «GET» recibidas"
 
-#: src/datastore/gnunet-service-datastore.c:1041
+#: src/datastore/gnunet-service-datastore.c:1058
 msgid "# requests filtered by bloomfilter"
 msgstr "# peticiones filtradas por el «bloomfilter»"
 
-#: src/datastore/gnunet-service-datastore.c:1069
+#: src/datastore/gnunet-service-datastore.c:1094
 msgid "# UPDATE requests received"
 msgstr "# peticiones «UPDATE» recibidas"
 
-#: src/datastore/gnunet-service-datastore.c:1099
+#: src/datastore/gnunet-service-datastore.c:1122
 msgid "# GET REPLICATION requests received"
 msgstr "# peticiones «GET REPLICATION» recibidas"
 
-#: src/datastore/gnunet-service-datastore.c:1132
+#: src/datastore/gnunet-service-datastore.c:1155
 msgid "# GET ZERO ANONYMITY requests received"
 msgstr "# peticiones «GET ZERO ANONYMITY» recibidas"
 
-#: src/datastore/gnunet-service-datastore.c:1157
+#: src/datastore/gnunet-service-datastore.c:1180
 msgid "Content not found"
 msgstr "Contenido no encontrado"
 
-#: src/datastore/gnunet-service-datastore.c:1165
+#: src/datastore/gnunet-service-datastore.c:1188
 msgid "# bytes removed (explicit request)"
 msgstr "# bytes eliminados (petición explícita)"
 
-#: src/datastore/gnunet-service-datastore.c:1197
+#: src/datastore/gnunet-service-datastore.c:1220
 msgid "# REMOVE requests received"
 msgstr "# peticiones «REMOVE» recibidas"
 
 # Miguel: ¿Cómo traducir «payload»? ¿Código cargado?
-#: src/datastore/gnunet-service-datastore.c:1241
+#: src/datastore/gnunet-service-datastore.c:1264
 #, fuzzy, c-format
 msgid ""
 "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
@@ -1844,88 +1845,103 @@
 "El «payload» del almacén de datos es impreciso (%lld < %lld).  Intentando "
 "repararlo.\n"
 
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1269
 #, c-format
 msgid "New payload: %lld\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1299
+#: src/datastore/gnunet-service-datastore.c:1322
 #, c-format
 msgid "Loading `%s' datastore plugin\n"
 msgstr "Cargando el módulo del almacén de datos «%s»\n"
 
-#: src/datastore/gnunet-service-datastore.c:1310
+#: src/datastore/gnunet-service-datastore.c:1333
 #, c-format
 msgid "Failed to load datastore plugin for `%s'\n"
 msgstr ""
 "Se produjo un fallo al inicializar el módulo del almacén de datos para «%s»\n"
 
-#: src/datastore/gnunet-service-datastore.c:1412
+#: src/datastore/gnunet-service-datastore.c:1402
+#: src/datastore/gnunet-service-datastore.c:1463
+msgid "Bloomfilter construction complete.\n"
+msgstr "Construcción de «bloomfilter» completa.\n"
+
+#: src/datastore/gnunet-service-datastore.c:1450
 msgid "Rebuilding bloomfilter.  Please be patient.\n"
 msgstr "Reconstruyendo «bloomfilter».  Por favor, tenga paciencia.\n"
 
-#: src/datastore/gnunet-service-datastore.c:1419
+#: src/datastore/gnunet-service-datastore.c:1460
 msgid "Plugin does not support get_keys function. Please fix!\n"
 msgstr "El módulo no soporta la función «get_keys». Por favor, corríjalo.\n"
 
-#: src/datastore/gnunet-service-datastore.c:1422
-msgid "Bloomfilter construction complete.\n"
-msgstr "Construcción de «bloomfilter» completa.\n"
-
-#: src/datastore/gnunet-service-datastore.c:1562
+#: src/datastore/gnunet-service-datastore.c:1603
 #, c-format
 msgid "# bytes used in file-sharing datastore `%s'"
 msgstr "# bytes usados en el almacén de ficheros compartidos «%s»"
 
-#: src/datastore/gnunet-service-datastore.c:1573
+#: src/datastore/gnunet-service-datastore.c:1614
 msgid "# quota"
 msgstr "# cuota"
 
-#: src/datastore/gnunet-service-datastore.c:1575
+#: src/datastore/gnunet-service-datastore.c:1616
 msgid "# cache size"
 msgstr "# tamaño de la caché"
 
-#: src/datastore/gnunet-service-datastore.c:1588
+#: src/datastore/gnunet-service-datastore.c:1629
 #, c-format
 msgid "Could not use specified filename `%s' for bloomfilter.\n"
 msgstr ""
 "No se pudo usar el nombre de fichero especificado «%s» para «bloomfilter».\n"
 
-#: src/datastore/gnunet-service-datastore.c:1606
-#: src/datastore/gnunet-service-datastore.c:1622
+#: src/datastore/gnunet-service-datastore.c:1647
+#: src/datastore/gnunet-service-datastore.c:1663
 #, c-format
 msgid "Failed to remove bogus bloomfilter file `%s'\n"
 msgstr ""
 "Se produjo un fallo al borrar el fichero de configuración defectuoso de "
 "«bloomfilter» «%s»:\n"
 
-#: src/datastore/gnunet-service-datastore.c:1652
+#: src/datastore/gnunet-service-datastore.c:1693
 msgid "Failed to initialize bloomfilter.\n"
 msgstr "Se produjo un fallo al inicializar «bloomfilter».\n"
 
-#: src/datastore/plugin_datastore_heap.c:821
+#: src/datastore/plugin_datastore_heap.c:826
 msgid "Heap database running\n"
 msgstr "Base de datos de montículo ejecutándose\n"
 
-#: src/datastore/plugin_datastore_mysql.c:786
+#: src/datastore/plugin_datastore_mysql.c:309
+#: src/datastore/plugin_datastore_sqlite.c:499
+#, fuzzy
+msgid "Data too large"
+msgstr "número de valores"
+
+#: src/datastore/plugin_datastore_mysql.c:328
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:793
 #, c-format
 msgid "Failed to prepare statement `%s'\n"
 msgstr "Se produjo un fallo al preparar la sentencia «%s»\n"
 
-#: src/datastore/plugin_datastore_mysql.c:794
+#: src/datastore/plugin_datastore_mysql.c:802
 #, c-format
 msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
 msgstr "«%s» para «%s» falló en %s: %d con error: %s\n"
 
-#: src/datastore/plugin_datastore_mysql.c:1025
+#: src/datastore/plugin_datastore_mysql.c:1036
 msgid "Mysql database running\n"
 msgstr "Base de datos Mysql ejecutándose\n"
 
-#: src/datastore/plugin_datastore_postgres.c:837
+#: src/datastore/plugin_datastore_postgres.c:331
+msgid "Postgress exec failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_postgres.c:846
 msgid "Failed to drop table from database.\n"
 msgstr "Se produjo un fallo al borrar una tabla de la base de datos.\n"
 
-#: src/datastore/plugin_datastore_postgres.c:873
+#: src/datastore/plugin_datastore_postgres.c:882
 #: src/namecache/plugin_namecache_postgres.c:414
 #: src/namestore/plugin_namestore_postgres.c:569
 msgid "Postgres database running\n"
@@ -1948,19 +1964,19 @@
 msgid "Unable to initialize SQLite: %s.\n"
 msgstr "Imposible inicializar SQLite: %s.\n"
 
-#: src/datastore/plugin_datastore_sqlite.c:661
+#: src/datastore/plugin_datastore_sqlite.c:680
 msgid "Invalid data in database.  Trying to fix (by deletion).\n"
 msgstr ""
 "Datos no válidos en la base de datos.  Intentando arreglar (por borrado).\n"
 
 # to should be too, i think
-#: src/datastore/plugin_datastore_sqlite.c:1156
+#: src/datastore/plugin_datastore_sqlite.c:1177
 msgid "sqlite version to old to determine size, assuming zero\n"
 msgstr ""
 "la versión de sqlite es muy antigua para determinar el tamaño, se asume "
 "cero\n"
 
-#: src/datastore/plugin_datastore_sqlite.c:1176
+#: src/datastore/plugin_datastore_sqlite.c:1197
 #, c-format
 msgid ""
 "Using sqlite page utilization to estimate payload (%llu pages of size %llu "
@@ -1969,13 +1985,13 @@
 "Usando la utilización de páginas de sqlite para estimar el «payload» (%llu "
 "páginas de %llu bytes de tamaño)\n"
 
-#: src/datastore/plugin_datastore_sqlite.c:1216
+#: src/datastore/plugin_datastore_sqlite.c:1237
 #: src/namecache/plugin_namecache_sqlite.c:580
 #: src/namestore/plugin_namestore_sqlite.c:716
 msgid "Sqlite database running\n"
 msgstr "Base de datos sqlite ejecutándose\n"
 
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:260
 msgid "Template database running\n"
 msgstr "Base de datos de plantilla ejecutándose\n"
 
@@ -2600,52 +2616,52 @@
 msgid "Change DNS replies to point elsewhere."
 msgstr "Cambiar las respuestas DNS apuntando a cualquier otro lado."
 
-#: src/dns/gnunet-service-dns.c:456
+#: src/dns/gnunet-service-dns.c:459
 msgid "# DNS requests answered via TUN interface"
 msgstr "# Peticiones DNS contestadas vía interfaz TUN"
 
-#: src/dns/gnunet-service-dns.c:603
+#: src/dns/gnunet-service-dns.c:606
 msgid "# DNS exit failed (failed to open socket)"
 msgstr "# Salidas DNS fallidas (se produjo un fallo al abrir el «socket»)"
 
-#: src/dns/gnunet-service-dns.c:714
+#: src/dns/gnunet-service-dns.c:717
 msgid "# External DNS response discarded (no matching request)"
 msgstr "# Respuestas DNS externas descartadas (ninguna petición coincidente)"
 
-#: src/dns/gnunet-service-dns.c:792
+#: src/dns/gnunet-service-dns.c:795
 msgid "# Client response discarded (no matching request)"
 msgstr "# Respuestas de cliente descartadas (ninguna petición coincidente)"
 
-#: src/dns/gnunet-service-dns.c:907
+#: src/dns/gnunet-service-dns.c:910
 msgid "Received malformed IPv4-UDP packet on TUN interface.\n"
 msgstr "Recibido paquete UDP IPv4 mal formado en interfaz TUN.\n"
 
-#: src/dns/gnunet-service-dns.c:923
+#: src/dns/gnunet-service-dns.c:926
 msgid "Received malformed IPv6-UDP packet on TUN interface.\n"
 msgstr "Recibido paquete UDP IPv6 mal formado en interfaz TUN.\n"
 
-#: src/dns/gnunet-service-dns.c:932
+#: src/dns/gnunet-service-dns.c:935
 #, c-format
 msgid "Got non-IP packet with %u bytes and protocol %u from TUN\n"
 msgstr "Se obtuvo un paquete no-IP con %u bytes y protocolo %u de TUN\n"
 
-#: src/dns/gnunet-service-dns.c:942
+#: src/dns/gnunet-service-dns.c:945
 msgid "# Non-DNS UDP packet received via TUN interface"
 msgstr "# Paquetes UDP no-DNS recibidos vía interfaz TUN"
 
-#: src/dns/gnunet-service-dns.c:1009
+#: src/dns/gnunet-service-dns.c:1012
 msgid "# DNS requests received via TUN interface"
 msgstr "# Peticiones DNS recibidas vía interfaz TUN"
 
-#: src/dns/gnunet-service-dns.c:1049
-#, c-format
-msgid "`%s' must be installed SUID, refusing to run\n"
-msgstr "«%s» debe ser instalado con SUID, se niega a arrancar\n"
-
-#: src/dns/gnunet-service-dns.c:1069 src/exit/gnunet-daemon-exit.c:3594
+#: src/dns/gnunet-service-dns.c:1064 src/exit/gnunet-daemon-exit.c:3594
 msgid "need a valid IPv4 or IPv6 address\n"
 msgstr "se necesita una dirección IPv4 o IPv6 válida\n"
 
+#: src/dns/gnunet-service-dns.c:1082
+#, fuzzy, c-format
+msgid "`%s' must be installed SUID, will not run DNS interceptor\n"
+msgstr "«%s» debe ser instalado con SUID, se niega a arrancar\n"
+
 #: src/dv/gnunet-dv.c:169
 msgid "verbose output"
 msgstr ""
@@ -2888,52 +2904,52 @@
 msgid "Daemon to run to provide an IP exit node for the VPN"
 msgstr "Demonio a ejecutar para obtener un nodo de salida IP para la VPN"
 
-#: src/fragmentation/defragmentation.c:271
+#: src/fragmentation/defragmentation.c:277
 msgid "# acknowledgements sent for fragment"
 msgstr "# reconocimientos enviados por framentos"
 
-#: src/fragmentation/defragmentation.c:463
+#: src/fragmentation/defragmentation.c:470
 #: src/transport/plugin_transport_wlan.c:1515
 msgid "# fragments received"
 msgstr "# fragmentos recibidos"
 
-#: src/fragmentation/defragmentation.c:533
+#: src/fragmentation/defragmentation.c:540
 msgid "# duplicate fragments received"
 msgstr "# fragmentos duplicados recibidos"
 
-#: src/fragmentation/defragmentation.c:549
+#: src/fragmentation/defragmentation.c:558
 msgid "# messages defragmented"
 msgstr "# mensajes defragmentados"
 
-#: src/fragmentation/fragmentation.c:234
+#: src/fragmentation/fragmentation.c:235
 msgid "# fragments transmitted"
 msgstr "# fragmentos transmitidos"
 
-#: src/fragmentation/fragmentation.c:237
+#: src/fragmentation/fragmentation.c:240
 msgid "# fragments retransmitted"
 msgstr "# fragmentos retransmitidos"
 
-#: src/fragmentation/fragmentation.c:263
+#: src/fragmentation/fragmentation.c:269
 msgid "# fragments wrap arounds"
 msgstr "# encajes de fragmentos"
 
-#: src/fragmentation/fragmentation.c:307
+#: src/fragmentation/fragmentation.c:315
 msgid "# messages fragmented"
 msgstr "# mensajes fragmentados"
 
-#: src/fragmentation/fragmentation.c:310
+#: src/fragmentation/fragmentation.c:321
 msgid "# total size of fragmented messages"
 msgstr "# tamaño total de los mensajes fragmentados"
 
-#: src/fragmentation/fragmentation.c:431
+#: src/fragmentation/fragmentation.c:444
 msgid "# fragment acknowledgements received"
 msgstr "# reconocimientos de fragmentos recibidos"
 
-#: src/fragmentation/fragmentation.c:437
+#: src/fragmentation/fragmentation.c:451
 msgid "# bits removed from fragmentation ACKs"
 msgstr "# bits eliminados de reconocimientos de fragmentos"
 
-#: src/fragmentation/fragmentation.c:461
+#: src/fragmentation/fragmentation.c:475
 msgid "# fragmentation transmissions completed"
 msgstr "# transmisiones de fragmentos completadas"
 
@@ -3225,56 +3241,56 @@
 msgstr ""
 "Se obtuvo un resultado con un tipo desconocido de bloque «%d», ignorándolo"
 
-#: src/fs/fs_unindex.c:59
+#: src/fs/fs_unindex.c:63
 msgid "Failed to find given position in file"
 msgstr "Se produjo un fallo al buscar la posición dada en el fichero"
 
-#: src/fs/fs_unindex.c:64
+#: src/fs/fs_unindex.c:68
 msgid "Failed to read file"
 msgstr "No se pudo leer el fichero"
 
-#: src/fs/fs_unindex.c:234
+#: src/fs/fs_unindex.c:245
 msgid "Unexpected time for a response from `fs' service."
 msgstr "Tiempo inesperado para una respuesta del servicio «fs»."
 
-#: src/fs/fs_unindex.c:242
+#: src/fs/fs_unindex.c:253
 msgid "Timeout waiting for `fs' service."
 msgstr "Esperando al servicio «fs»."
 
-#: src/fs/fs_unindex.c:250
+#: src/fs/fs_unindex.c:261
 msgid "Invalid response from `fs' service."
 msgstr "Respuesta no válida del servicio «fs»."
 
-#: src/fs/fs_unindex.c:291
+#: src/fs/fs_unindex.c:304
 msgid "Failed to connect to FS service for unindexing."
 msgstr ""
 "Se produjo un fallo al conectar con el servicio «FS» para el desindexado."
 
-#: src/fs/fs_unindex.c:347 src/fs/fs_unindex.c:359
+#: src/fs/fs_unindex.c:360 src/fs/fs_unindex.c:372
 msgid "Failed to get KSKs from directory scan."
 msgstr "Se produjo un fallo al obtener KSKs de la búsqueda de directorios."
 
-#: src/fs/fs_unindex.c:355
+#: src/fs/fs_unindex.c:368
 #, c-format
 msgid "Internal error scanning `%s'.\n"
 msgstr "Error interno escaneando «%s».\n"
 
-#: src/fs/fs_unindex.c:414
+#: src/fs/fs_unindex.c:427
 #, fuzzy, c-format
 msgid "Failed to remove UBlock: %s\n"
 msgstr "Se produjo un fallo al eliminar el KBlock: %s\n"
 
-#: src/fs/fs_unindex.c:562 src/fs/fs_unindex.c:626
+#: src/fs/fs_unindex.c:590 src/fs/fs_unindex.c:656
 msgid "Failed to connect to `datastore' service."
 msgstr ""
 "Se produjo un fallo al conectar con el servicio de almacenamiento de datos "
 "(datastore)."
 
-#: src/fs/fs_unindex.c:639
+#: src/fs/fs_unindex.c:669
 msgid "Failed to open file for unindexing."
 msgstr "Se produjo un fallo al abrir el fichero para desindexado."
 
-#: src/fs/fs_unindex.c:673
+#: src/fs/fs_unindex.c:708
 msgid "Failed to compute hash of file."
 msgstr "Se produjo un fallo al calcular el hash del fichero."
 
@@ -3890,89 +3906,89 @@
 msgid "# cadet connections active"
 msgstr "# conexiones «stream» activas"
 
-#: src/fs/gnunet-service-fs_cp.c:726
+#: src/fs/gnunet-service-fs_cp.c:735
 msgid "# migration stop messages received"
 msgstr "# mensajes de detención de migración recibidos"
 
-#: src/fs/gnunet-service-fs_cp.c:730
+#: src/fs/gnunet-service-fs_cp.c:739
 #, c-format
 msgid "Migration of content to peer `%s' blocked for %s\n"
 msgstr "Migración de contenido al par «%s» bloqueada durante %s\n"
 
-#: src/fs/gnunet-service-fs_cp.c:768
+#: src/fs/gnunet-service-fs_cp.c:776
 msgid "# replies transmitted to other peers"
 msgstr "# respuestas transmitidas a otros pares"
 
-#: src/fs/gnunet-service-fs_cp.c:774
+#: src/fs/gnunet-service-fs_cp.c:784
 msgid "# replies dropped"
 msgstr "# respuestas omitidas"
 
-#: src/fs/gnunet-service-fs_cp.c:799 src/fs/gnunet-service-fs_cp.c:1384
+#: src/fs/gnunet-service-fs_cp.c:810 src/fs/gnunet-service-fs_cp.c:1404
 msgid "# P2P searches active"
 msgstr "# busquedas P2P activas"
 
-#: src/fs/gnunet-service-fs_cp.c:904
+#: src/fs/gnunet-service-fs_cp.c:915
 msgid "# artificial delays introduced (ms)"
 msgstr "# retardos artificiales introducidos (ms)"
 
-#: src/fs/gnunet-service-fs_cp.c:960
+#: src/fs/gnunet-service-fs_cp.c:971
 msgid "# replies dropped due to type mismatch"
 msgstr "# respuestas omitidas debido a incompatibilidad de tipos"
 
-#: src/fs/gnunet-service-fs_cp.c:968
+#: src/fs/gnunet-service-fs_cp.c:979
 msgid "# replies received for other peers"
 msgstr "# respuestas recibidas de otros pares"
 
-#: src/fs/gnunet-service-fs_cp.c:982
+#: src/fs/gnunet-service-fs_cp.c:993
 msgid "# replies dropped due to insufficient cover traffic"
 msgstr "# respuestas omitidas debido a insuficiente tráfico de cobertura"
 
-#: src/fs/gnunet-service-fs_cp.c:1030
+#: src/fs/gnunet-service-fs_cp.c:1041
 msgid "# P2P searches destroyed due to ultimate reply"
 msgstr "# búsquedas P2P destruidas debido a respuesta definitiva"
 
-#: src/fs/gnunet-service-fs_cp.c:1098
+#: src/fs/gnunet-service-fs_cp.c:1109
 msgid "# requests done for free (low load)"
 msgstr "# peticiones realizadas gratuitamente (baja carga)"
 
-#: src/fs/gnunet-service-fs_cp.c:1123
+#: src/fs/gnunet-service-fs_cp.c:1134
 msgid "# request dropped, priority insufficient"
 msgstr "# peticiones omitidas, prioridad insuficiente"
 
-#: src/fs/gnunet-service-fs_cp.c:1133
+#: src/fs/gnunet-service-fs_cp.c:1144
 msgid "# requests done for a price (normal load)"
 msgstr "# peticiones realizadas por un precio (carga normal)"
 
-#: src/fs/gnunet-service-fs_cp.c:1210
+#: src/fs/gnunet-service-fs_cp.c:1221
 msgid "# GET requests received (from other peers)"
 msgstr "# peticiones «GET» recibidas (de otros pares)"
 
-#: src/fs/gnunet-service-fs_cp.c:1245
+#: src/fs/gnunet-service-fs_cp.c:1256
 msgid "# requests dropped due to initiator not being connected"
 msgstr "# peticiones omitidas debido a que el iniciador no está conectado"
 
-#: src/fs/gnunet-service-fs_cp.c:1266
+#: src/fs/gnunet-service-fs_cp.c:1277
 msgid "# requests dropped due to missing reverse route"
 msgstr "# peticiones omitidas debido a falta de ruta inversa"
 
-#: src/fs/gnunet-service-fs_cp.c:1277
+#: src/fs/gnunet-service-fs_cp.c:1288
 #, fuzzy
 msgid "# requests dropped due to full reply queue"
 msgstr "# Mensajes P2P omitidos debido a saturación de la cola"
 
-#: src/fs/gnunet-service-fs_cp.c:1329
+#: src/fs/gnunet-service-fs_cp.c:1340
 msgid "# requests dropped due TTL underflow"
 msgstr "# peticiones omitidas debido a expiración del TTL"
 
-#: src/fs/gnunet-service-fs_cp.c:1353
+#: src/fs/gnunet-service-fs_cp.c:1365
 msgid "# requests dropped due to higher-TTL request"
 msgstr "# peticiones omitidas debido a una petición de mayor TTL"
 
-#: src/fs/gnunet-service-fs_cp.c:1382
+#: src/fs/gnunet-service-fs_cp.c:1402
 msgid "# P2P query messages received and processed"
 msgstr "# mensajes de búsqueda P2P recibidos y procesados"
 
-#: src/fs/gnunet-service-fs_cp.c:1821
+#: src/fs/gnunet-service-fs_cp.c:1841
 msgid "# migration stop messages sent"
 msgstr "# mensajes de detención de migración enviados"
 
@@ -4313,7 +4329,7 @@
 msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
 msgstr "Pasarela GNUnet DNS-a-GNS (un servidor DNS)"
 
-#: src/gns/gnunet-gns.c:215
+#: src/gns/gnunet-gns.c:215 src/gns/plugin_rest_gns.c:334
 #, c-format
 msgid "Invalid typename specified, assuming `ANY'\n"
 msgstr ""
@@ -4329,6 +4345,7 @@
 msgstr ""
 
 #: src/gns/gnunet-gns.c:353 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/plugin_rest_gns.c:459
 #, c-format
 msgid ""
 "Ego for `gns-master' not found, cannot perform lookup.  Did you run gnunet-"
@@ -4469,7 +4486,7 @@
 msgid "Failed to start HTTPS server for `%s'\n"
 msgstr "Se produjo un fallo al iniciar el servidor HTTP\n"
 
-#: src/gns/gnunet-gns-proxy.c:2225
+#: src/gns/gnunet-gns-proxy.c:2225 src/rest/gnunet-rest-server.c:529
 #, fuzzy
 msgid "Failed to pass client to MHD\n"
 msgstr "Se produjo un fallo al conectar con GNS\n"
@@ -4573,21 +4590,21 @@
 msgid "GNS lookup resulted in DNS name that is too long (`%s')\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:1886
+#: src/gns/gnunet-service-gns_resolver.c:1891
 msgid "GNS lookup recursion failed (no delegation record found)\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:1910
+#: src/gns/gnunet-service-gns_resolver.c:1915
 #, fuzzy, c-format
 msgid "Failed to cache GNS resolution: %s\n"
 msgstr "Se produjo un fallo al mandar la petición DNS a %s\n"
 
-#: src/gns/gnunet-service-gns_resolver.c:2192
+#: src/gns/gnunet-service-gns_resolver.c:2197
 #, c-format
 msgid "Zone %s was revoked, resolution fails\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:2341
+#: src/gns/gnunet-service-gns_resolver.c:2346
 #, c-format
 msgid "Hostname `%s' is not well-formed, resolution fails\n"
 msgstr ""
@@ -4619,6 +4636,15 @@
 msgid "Unable to parse BOX record string `%s'\n"
 msgstr "No se pudo procesar la cadena de registro VPN «%s»\n"
 
+#: src/gns/plugin_rest_gns.c:422
+msgid "Ego for not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:652
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr "Conexión fallida\n"
+
 #: src/gnsrecord/plugin_gnsrecord_dns.c:291
 #, c-format
 msgid "Unable to parse IPv4 address `%s'\n"
@@ -5181,6 +5207,11 @@
 msgid "Failed to create directory `%s' for storing egos\n"
 msgstr "Se produjo un fallo al leer el directorio «%s»\n"
 
+#: src/identity/plugin_rest_identity.c:803
+#, fuzzy
+msgid "Identity REST API initialized\n"
+msgstr "Conexión fallida\n"
+
 #: src/mysql/mysql.c:174
 #, c-format
 msgid "Trying to use file `%s' for MySQL configuration.\n"
@@ -5206,9 +5237,9 @@
 msgid "You must specify which zone should be accessed\n"
 msgstr "Se debe especificar un apodo\n"
 
-#: src/namecache/gnunet-namecache.c:195 src/namestore/gnunet-namestore.c:844
+#: src/namecache/gnunet-namecache.c:195
 #, fuzzy, c-format
-msgid "Invalid public key for reverse lookup `%s'\n"
+msgid "Invalid public key for zone `%s'\n"
 msgstr "Parámetro no válido «%s»\n"
 
 #: src/namecache/gnunet-namecache.c:203
@@ -5245,11 +5276,13 @@
 msgstr "No se pudo añadir el registro: %s\n"
 
 #: src/namestore/gnunet-namestore.c:332
+#: src/namestore/plugin_rest_namestore.c:505
 #, fuzzy, c-format
 msgid "Deleting record failed, record does not exist%s%s\n"
 msgstr "No se pudo borrar el registro: %s\n"
 
 #: src/namestore/gnunet-namestore.c:339
+#: src/namestore/plugin_rest_namestore.c:514
 #, fuzzy, c-format
 msgid "Deleting record failed%s%s\n"
 msgstr "No se pudo borrar el registro: %s\n"
@@ -5267,6 +5300,7 @@
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:628
+#: src/namestore/plugin_rest_namestore.c:538
 #, c-format
 msgid "There are no records under label `%s' that could be deleted.\n"
 msgstr ""
@@ -5284,6 +5318,7 @@
 
 #: src/namestore/gnunet-namestore.c:719
 #: src/namestore/gnunet-namestore-fcfsd.c:984
+#: src/namestore/plugin_rest_namestore.c:821
 msgid "Failed to connect to namestore\n"
 msgstr "Se produjo un fallo al conectar con el almacén de nombres\n"
 
@@ -5300,11 +5335,14 @@
 msgstr "añadir"
 
 #: src/namestore/gnunet-namestore.c:745
+#: src/namestore/plugin_rest_namestore.c:608
 #, c-format
 msgid "Unsupported type `%s'\n"
 msgstr "Tipo no soportado «%s»\n"
 
 #: src/namestore/gnunet-namestore.c:765
+#: src/namestore/plugin_rest_namestore.c:626
+#: src/namestore/plugin_rest_namestore.c:666
 #, c-format
 msgid "Value `%s' invalid for record type `%s'\n"
 msgstr "Valor «%s» no válido para el tipo de registro «%s»\n"
@@ -5318,6 +5356,11 @@
 msgid "del"
 msgstr "borrar"
 
+#: src/namestore/gnunet-namestore.c:844
+#, fuzzy, c-format
+msgid "Invalid public key for reverse lookup `%s'\n"
+msgstr "Parámetro no válido «%s»\n"
+
 #: src/namestore/gnunet-namestore.c:868
 #: src/peerinfo-tool/gnunet-peerinfo.c:817
 #, c-format
@@ -5330,21 +5373,25 @@
 msgstr "URI no válida: «%s»\n"
 
 #: src/namestore/gnunet-namestore.c:943
+#: src/namestore/plugin_rest_namestore.c:851
 #, fuzzy, c-format
 msgid "Ego `%s' not known to identity service\n"
 msgstr "'%s': servicio desconocido: %s\n"
 
 #: src/namestore/gnunet-namestore.c:970
+#: src/namestore/plugin_rest_namestore.c:878
 #, fuzzy, c-format
 msgid "No default ego configured in identity service\n"
 msgstr "'%s': servicio desconocido: %s\n"
 
 #: src/namestore/gnunet-namestore.c:1006
+#: src/namestore/plugin_rest_namestore.c:917
 #, fuzzy, c-format
 msgid "Identity service is not running\n"
 msgstr "El servicio «%s» no está ejecutandose\n"
 
 #: src/namestore/gnunet-namestore.c:1018
+#: src/namestore/plugin_rest_namestore.c:946
 #, fuzzy, c-format
 msgid "Cannot connect to identity service\n"
 msgstr "¡No se pudo conectar al servicio %s!\n"
@@ -5481,6 +5528,11 @@
 msgid "Namestore failed to store record\n"
 msgstr "El almacén de nombres no pudo añadir el registro\n"
 
+#: src/namestore/plugin_rest_namestore.c:1023
+#, fuzzy
+msgid "Namestore REST API initialized\n"
+msgstr "Conexión fallida\n"
+
 #: src/nat/gnunet-nat-server.c:279
 #, c-format
 msgid "Please pass valid port number as the first argument! (got `%s')\n"
@@ -5742,7 +5794,7 @@
 msgstr "Medir la calidad y rendimiento del servicio NSE."
 
 #: src/nse/gnunet-service-nse.c:1537
-#: src/revocation/gnunet-service-revocation.c:815 src/util/gnunet-scrypt.c:260
+#: src/revocation/gnunet-service-revocation.c:827 src/util/gnunet-scrypt.c:260
 msgid "Value is too large.\n"
 msgstr ""
 
@@ -6294,6 +6346,16 @@
 msgid "Regex `%s' is too long!\n"
 msgstr "El servicio «%s» no está ejecutandose\n"
 
+#: src/rest/gnunet-rest-server.c:766
+#, fuzzy
+msgid "listen on specified port (default: 7776)"
+msgstr "escuchar en el puerto especificado (predeterminado: 7777)"
+
+#: src/rest/gnunet-rest-server.c:783
+#, fuzzy
+msgid "GNUnet REST server"
+msgstr "Herramienta de acceso GNUnet GNS"
+
 #: src/revocation/gnunet-revocation.c:126
 #, fuzzy, c-format
 msgid "Key `%s' is valid\n"
@@ -6426,11 +6488,11 @@
 msgstr "# transmisiones de fragmentos completadas"
 
 #: src/revocation/gnunet-service-revocation.c:493
-#: src/revocation/gnunet-service-revocation.c:747
+#: src/revocation/gnunet-service-revocation.c:759
 msgid "SET service crashed, terminating revocation service\n"
 msgstr ""
 
-#: src/revocation/gnunet-service-revocation.c:839
+#: src/revocation/gnunet-service-revocation.c:851
 #, fuzzy
 msgid "Could not open revocation database file!"
 msgstr "No se pudo conectar con el almacén de datos."
@@ -8231,7 +8293,7 @@
 msgstr "Encontradas %u direcciones para comunicar al servicio NAT\n"
 
 #: src/transport/plugin_transport_http_server.c:2825
-#: src/transport/plugin_transport_udp.c:3336
+#: src/transport/plugin_transport_udp.c:3335
 msgid "Disabling IPv6 since it is not supported on this system!\n"
 msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n"
 
@@ -8466,7 +8528,7 @@
 "Se produjo un fallo al establecer la opción de «broadcast» IPv4 para el "
 "«socket» en el puerto %d\n"
 
-#: src/transport/plugin_transport_udp.c:3082
+#: src/transport/plugin_transport_udp.c:3081
 #, c-format
 msgid ""
 "UDP could not transmit message to `%s': Network seems down, please check "
@@ -8475,7 +8537,7 @@
 "UDP no pudo transmitir el mensaje a «%s»: La red parece caída, por favor, "
 "compruebe su configuración de red\n"
 
-#: src/transport/plugin_transport_udp.c:3096
+#: src/transport/plugin_transport_udp.c:3095
 #, fuzzy
 msgid ""
 "UDP could not transmit IPv6 message! Please check your network configuration "
@@ -8485,37 +8547,37 @@
 "configuración de red y deshabilite IPv6 si su conexión carece de una "
 "dirección IPv6 global\n"
 
-#: src/transport/plugin_transport_udp.c:3412
-#: src/transport/plugin_transport_udp.c:3511
+#: src/transport/plugin_transport_udp.c:3411
+#: src/transport/plugin_transport_udp.c:3510
 #, fuzzy, c-format
 msgid "Failed to bind UDP socket to %s: %s\n"
 msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
 
-#: src/transport/plugin_transport_udp.c:3430
+#: src/transport/plugin_transport_udp.c:3429
 #, fuzzy
 msgid "Disabling IPv4 since it is not supported on this system!\n"
 msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n"
 
-#: src/transport/plugin_transport_udp.c:3521
+#: src/transport/plugin_transport_udp.c:3520
 msgid "Failed to open UDP sockets\n"
 msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
 
-#: src/transport/plugin_transport_udp.c:3592
-#: src/transport/plugin_transport_udp.c:3606
+#: src/transport/plugin_transport_udp.c:3591
+#: src/transport/plugin_transport_udp.c:3605
 msgid "must be in [0,65535]"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3638
+#: src/transport/plugin_transport_udp.c:3637
 #, fuzzy
 msgid "must be valid IPv4 address"
 msgstr "«%s» no es una dirección IP válida.\n"
 
-#: src/transport/plugin_transport_udp.c:3665
+#: src/transport/plugin_transport_udp.c:3664
 #, fuzzy
 msgid "must be valid IPv6 address"
 msgstr "«%s» no es una dirección IP válida.\n"
 
-#: src/transport/plugin_transport_udp.c:3731
+#: src/transport/plugin_transport_udp.c:3730
 #, fuzzy
 msgid "Failed to create UDP network sockets\n"
 msgstr "Se produjo un fallo al crear una nueva firma"
@@ -8745,7 +8807,7 @@
 msgid "Syntax error while deserializing in line %u\n"
 msgstr "Error de sintaxis en la línea %u mientras se deserializaba\n"
 
-#: src/util/configuration.c:1026
+#: src/util/configuration.c:1025
 #, c-format
 msgid ""
 "Configuration value '%s' for '%s' in section '%s' is not in set of legal "
@@ -8754,17 +8816,17 @@
 "El valor de configuración «%s» para «%s» de la sección «%s» no está dentro "
 "de las opciones legales\n"
 
-#: src/util/configuration.c:1145
+#: src/util/configuration.c:1144
 #, c-format
 msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
 msgstr ""
 
-#: src/util/configuration.c:1177
+#: src/util/configuration.c:1176
 #, fuzzy, c-format
 msgid "Missing closing `%s' in option `%s'\n"
 msgstr "Falta la opción «%s» para la operación «%s»\n"
 
-#: src/util/configuration.c:1251
+#: src/util/configuration.c:1250
 #, c-format
 msgid ""
 "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8790,23 +8852,23 @@
 "El tamaño del fichero en disco es incorrecto para este «Bloom "
 "filter» (esperado %llu, tiene %llu)\n"
 
-#: src/util/crypto_ecc.c:731 src/util/crypto_ecc.c:769
-#: src/util/crypto_ecc.c:887 src/util/crypto_ecc.c:925
+#: src/util/crypto_ecc.c:733 src/util/crypto_ecc.c:771
+#: src/util/crypto_ecc.c:889 src/util/crypto_ecc.c:927
 #, c-format
 msgid "Could not acquire lock on file `%s': %s...\n"
 msgstr "No se pudo bloquear el fichero «%s»: %s...\n"
 
-#: src/util/crypto_ecc.c:736 src/util/crypto_ecc.c:892
+#: src/util/crypto_ecc.c:738 src/util/crypto_ecc.c:894
 msgid "Creating a new private key.  This may take a while.\n"
 msgstr "Generando una clave privada nueva.  Esto puede tomar un tiempo.\n"
 
-#: src/util/crypto_ecc.c:773 src/util/crypto_ecc.c:929
+#: src/util/crypto_ecc.c:775 src/util/crypto_ecc.c:931
 msgid "This may be ok if someone is currently generating a private key.\n"
 msgstr ""
 "Esto puede estar bien si alguien está actualmente generando una clave "
 "privada.\n"
 
-#: src/util/crypto_ecc.c:803 src/util/crypto_ecc.c:959
+#: src/util/crypto_ecc.c:805 src/util/crypto_ecc.c:961
 #, c-format
 msgid ""
 "When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
@@ -8814,33 +8876,33 @@
 "Cuando se intentaba leer el fichero de claves «%s» se encontraron %u bytes "
 "pero al menos %u son necesarios.\n"
 
-#: src/util/crypto_ecc.c:807 src/util/crypto_ecc.c:963
+#: src/util/crypto_ecc.c:809 src/util/crypto_ecc.c:965
 msgid "This may be ok if someone is currently generating a key.\n"
 msgstr ""
 "Esto puede ser correcto si alguien está actualmente generando una clave de "
 "máquina.\n"
 
-#: src/util/crypto_ecc.c:1045
+#: src/util/crypto_ecc.c:1047
 #, fuzzy
 msgid "Could not load peer's private key\n"
 msgstr "No se pudo acceder a la clave de máquina.\n"
 
-#: src/util/crypto_ecc.c:1149
+#: src/util/crypto_ecc.c:1151
 #, c-format
 msgid "ECC signing failed at %s:%d: %s\n"
 msgstr "El firmado ECC falló en %s:%d: %s\n"
 
-#: src/util/crypto_ecc.c:1199
+#: src/util/crypto_ecc.c:1201
 #, fuzzy, c-format
 msgid "EdDSA signing failed at %s:%d: %s\n"
 msgstr "El firmado ECC falló en %s:%d: %s\n"
 
-#: src/util/crypto_ecc.c:1273
+#: src/util/crypto_ecc.c:1275
 #, fuzzy, c-format
 msgid "ECDSA signature verification failed at %s:%d: %s\n"
 msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n"
 
-#: src/util/crypto_ecc.c:1330
+#: src/util/crypto_ecc.c:1332
 #, fuzzy, c-format
 msgid "EdDSA signature verification failed at %s:%d: %s\n"
 msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n"
@@ -8850,17 +8912,17 @@
 msgid "libgcrypt has not the expected version (version %s is required).\n"
 msgstr "libgcrypt no tiene la versión esperada (se necesita la versión %s).\n"
 
-#: src/util/crypto_rsa.c:809
+#: src/util/crypto_rsa.c:825
 #, c-format
 msgid "RSA signature verification failed at %s:%d: %s\n"
 msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n"
 
-#: src/util/disk.c:1218
+#: src/util/disk.c:1222
 #, c-format
 msgid "Expected `%s' to be a directory!\n"
 msgstr "¡Se esperaba que «%s» fuera un directorio!\n"
 
-#: src/util/disk.c:1580 src/util/service.c:1328
+#: src/util/disk.c:1584 src/util/service.c:1328
 #, c-format
 msgid "Cannot obtain information about user `%s': %s\n"
 msgstr "No se pudo obtener información acerca del usuario «%s»: %s\n"
@@ -8925,7 +8987,7 @@
 msgid "Use %s to get a list of options.\n"
 msgstr "Use %s para obtener una lista de opciones.\n"
 
-#: src/util/getopt_helpers.c:84
+#: src/util/getopt_helpers.c:90
 #, c-format
 msgid ""
 "Arguments mandatory for long options are also mandatory for short options.\n"
@@ -8933,12 +8995,12 @@
 "Los parámetros obligatorios para las opciones largas también lo son para sus "
 "versiones cortas.\n"
 
-#: src/util/getopt_helpers.c:268 src/util/getopt_helpers.c:326
+#: src/util/getopt_helpers.c:274 src/util/getopt_helpers.c:332
 #, c-format
 msgid "You must pass a number to the `%s' option.\n"
 msgstr "Tienes que introducir un número en la opción «%s».\n"
 
-#: src/util/getopt_helpers.c:298
+#: src/util/getopt_helpers.c:304
 #, c-format
 msgid "You must pass relative time to the `%s' option.\n"
 msgstr "Debes introducir un tiempo relativo en la opción «%s».\n"
@@ -9188,22 +9250,22 @@
 msgid "GetExitCodeProcess failed for binary %s (%d).\n"
 msgstr ""
 
-#: src/util/plugin.c:87
+#: src/util/plugin.c:86
 #, c-format
 msgid "Initialization of plugin mechanism failed: %s!\n"
 msgstr "¡La inicialización del mecanismo de módulos falló: %s!\n"
 
-#: src/util/plugin.c:148
+#: src/util/plugin.c:151
 #, c-format
 msgid "`%s' failed to resolve method '%s' with error: %s\n"
 msgstr "«%s» falló al resolver el método «%s» con error: %s\n"
 
-#: src/util/plugin.c:223
+#: src/util/plugin.c:226
 #, c-format
 msgid "`%s' failed for library `%s' with error: %s\n"
 msgstr "Falló «%s» para la biblioteca «%s» con error: %s\n"
 
-#: src/util/plugin.c:382
+#: src/util/plugin.c:385
 msgid "Could not determine plugin installation path.\n"
 msgstr "No se pudo determinar la ruta de instalación de los módulos.\n"
 
@@ -9695,6 +9757,9 @@
 msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
 msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n"
 
+#~ msgid "`%s' must be installed SUID, refusing to run\n"
+#~ msgstr "«%s» debe ser instalado con SUID, se niega a arrancar\n"
+
 # Miguel: "Outbound" lo he traducido como salida en todo el texto.
 #~ msgid "Outbound quota configure for network `%s' is %llu\n"
 #~ msgstr "La cuota de salida configurada para la red «%s» es %llu\n"
@@ -9935,10 +10000,6 @@
 #~ msgstr "Desconectado de %s\n"
 
 #, fuzzy
-#~ msgid "CADET initialized\n"
-#~ msgstr "Conexión fallida\n"
-
-#, fuzzy
 #~ msgid "Reloading sensor definitions from directory `%s'\n"
 #~ msgstr "Descarga los ficheros de GNUnet"
 

Modified: gnunet/po/fr.po
===================================================================
--- gnunet/po/fr.po     2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/fr.po     2015-04-27 11:12:21 UTC (rev 35559)
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gnunet 0.10.1\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2014-04-08 11:11+0200\n"
+"POT-Creation-Date: 2015-04-27 13:05+0200\n"
 "PO-Revision-Date: 2015-03-24 01:41+0100\n"
 "Last-Translator: Stéphane  Aulery <address@hidden>\n"
 "Language-Team: French <address@hidden>\n"
@@ -21,7 +21,8 @@
 msgstr ""
 
 #: src/arm/arm_monitor_api.c:321
-msgid "Monitoring client was disconnected from arm service, trying to 
reconnect.\n"
+msgid ""
+"Monitoring client was disconnected from arm service, trying to reconnect.\n"
 msgstr ""
 
 #: src/arm/gnunet-arm.c:164
@@ -279,173 +280,177 @@
 msgid "ARM now monitors connections to service `%s' at `%s'\n"
 msgstr ""
 
-#: src/arm/gnunet-service-arm.c:831
+#: src/arm/gnunet-service-arm.c:835
 #, c-format
 msgid "Preparing to stop `%s'\n"
 msgstr ""
 
-#: src/arm/gnunet-service-arm.c:1100
+#: src/arm/gnunet-service-arm.c:1105
 #, c-format
 msgid "Restarting service `%s'.\n"
 msgstr ""
 
-#: src/arm/gnunet-service-arm.c:1193
+#: src/arm/gnunet-service-arm.c:1199
 msgid "exit"
 msgstr "exit"
 
-#: src/arm/gnunet-service-arm.c:1198
+#: src/arm/gnunet-service-arm.c:1204
 msgid "signal"
 msgstr "signal"
 
-#: src/arm/gnunet-service-arm.c:1203
+#: src/arm/gnunet-service-arm.c:1209
 msgid "unknown"
 msgstr "inconnu"
 
-#: src/arm/gnunet-service-arm.c:1209
+#: src/arm/gnunet-service-arm.c:1215
 #, c-format
 msgid "Service `%s' took %s to terminate\n"
 msgstr ""
 
-#: src/arm/gnunet-service-arm.c:1231
+#: src/arm/gnunet-service-arm.c:1237
 #, c-format
 msgid "Service `%s' terminated normally, will restart at any time\n"
 msgstr ""
 
-#: src/arm/gnunet-service-arm.c:1246
+#: src/arm/gnunet-service-arm.c:1252
 #, c-format
 msgid "Service `%s' terminated with status %s/%d, will restart in %s\n"
 msgstr ""
 
-#: src/arm/gnunet-service-arm.c:1500
-#, c-format
-msgid "Starting default services `%s'\n"
+#: src/arm/mockup-service.c:41
+msgid "Initiating shutdown as requested by client.\n"
 msgstr ""
 
-#: src/arm/gnunet-service-arm.c:1511
+#: src/ats/gnunet-ats-solver-eval.c:2778 src/ats/gnunet-ats-solver-eval.c:2819
 #, c-format
-msgid "Default service `%s' not configured correctly!\n"
+msgid ""
+"Could not load quota for network `%s':  `%s', assigning default bandwidth "
+"%llu\n"
 msgstr ""
 
-#: src/arm/gnunet-service-arm.c:1524
-msgid "No default services configured, GNUnet will not really start right 
now.\n"
+#: src/ats/gnunet-ats-solver-eval.c:2796
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
 msgstr ""
 
-#: src/arm/mockup-service.c:41
-msgid "Initiating shutdown as requested by client.\n"
-msgstr ""
-
-#: src/ats/ats_api_performance.c:468
+#: src/ats/gnunet-ats-solver-eval.c:2837
 #, c-format
-msgid "Received %s message\n"
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
 msgstr ""
 
-#: src/ats/ats_api_performance.c:511
-#, c-format
-msgid "Received last message for %s \n"
+#: src/ats/gnunet-ats-solver-eval.c:3290
+#: src/ats-tests/gnunet-solver-eval.c:918
+msgid "solver to use"
+msgstr "solveur utilisé"
+
+#: src/ats/gnunet-ats-solver-eval.c:3293
+#: src/ats-tests/gnunet-solver-eval.c:921
+#: src/ats-tests/gnunet-solver-eval.c:924
+msgid "experiment to use"
 msgstr ""
 
-#: src/ats/gnunet-ats-solver-eval.c:2199 src/ats/gnunet-ats-solver-eval.c:2233
-#: src/ats/gnunet-service-ats_addresses.c:1980
-#: src/ats/gnunet-service-ats_addresses.c:2024
-#, c-format
-msgid "Could not load quota for network `%s':  `%s', assigning default 
bandwidth %llu\n"
+#: src/ats/gnunet-ats-solver-eval.c:3296
+msgid "be verbose"
 msgstr ""
 
-#: src/ats/gnunet-ats-solver-eval.c:2205
-#: src/ats/gnunet-service-ats_addresses.c:1987
-#, c-format
-msgid "Outbound quota configure for network `%s' is %llu\n"
+#: src/ats/gnunet-ats-solver-eval.c:3299
+msgid "print logging"
+msgstr "afficher le journal"
+
+#: src/ats/gnunet-ats-solver-eval.c:3302
+msgid "save logging to disk"
 msgstr ""
 
-#: src/ats/gnunet-ats-solver-eval.c:2212
-#: src/ats/gnunet-service-ats_addresses.c:1995
-#, c-format
-msgid "No outbound quota configured for network `%s', assigning default 
bandwidth %llu\n"
+#: src/ats/gnunet-ats-solver-eval.c:3305
+msgid "disable normalization"
 msgstr ""
 
-#: src/ats/gnunet-ats-solver-eval.c:2239
-#: src/ats/gnunet-service-ats_addresses.c:2031
+#: src/ats/gnunet-service-ats_plugins.c:304
 #, c-format
-msgid "Inbound quota configured for network `%s' is %llu\n"
+msgid ""
+"Could not load %s quota for network `%s':  `%s', assigning default bandwidth "
+"%llu\n"
 msgstr ""
 
-#: src/ats/gnunet-ats-solver-eval.c:2246
-#: src/ats/gnunet-service-ats_addresses.c:2039
+#: src/ats/gnunet-service-ats_plugins.c:314
 #, c-format
-msgid "No outbound quota configure for network `%s', assigning default 
bandwidth %llu\n"
+msgid "%s quota configured for network `%s' is %llu\n"
 msgstr ""
 
-#: src/ats/gnunet-ats-solver-eval.c:2671
-#: src/ats-tests/gnunet-solver-eval.c:919
-msgid "solver to use"
-msgstr "solveur utilisé"
-
-#: src/ats/gnunet-ats-solver-eval.c:2674 src/ats/gnunet-ats-solver-eval.c:2677
-#: src/ats-tests/gnunet-solver-eval.c:922
-#: src/ats-tests/gnunet-solver-eval.c:925
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:2680
-msgid "print logging"
-msgstr "afficher le journal"
-
-#: src/ats/gnunet-service-ats_addresses.c:2217
+#: src/ats/gnunet-service-ats_plugins.c:359
 #, c-format
-msgid "Initializing solver `%s '`%s'\n"
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
 msgstr ""
 
-#: src/ats/gnunet-service-ats_addresses.c:2220
+#: src/ats/gnunet-service-ats_plugins.c:451
 #, c-format
 msgid "Failed to initialize solver `%s'!\n"
 msgstr ""
 
-#: src/ats/gnunet-service-ats_addresses.c:2243
-msgid "Failed to initialize solver!\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:892
+#: src/ats/plugin_ats_mlp.c:1274
 msgid "Problem size too large, cannot allocate memory!\n"
 msgstr ""
 
-#: src/ats/plugin_ats_mlp.c:1329
+#: src/ats/plugin_ats_mlp.c:1869
 #, c-format
 msgid "Adding address for peer `%s' multiple times\n"
 msgstr ""
 
-#: src/ats/plugin_ats_mlp.c:1376
+#: src/ats/plugin_ats_mlp.c:1913
 #, c-format
-msgid "Updating address property `%s' for peer `%s' %p not added before\n"
+msgid "Updating address property for peer `%s' %p not added before\n"
 msgstr ""
 
-#: src/ats/plugin_ats_mlp.c:2122
+#: src/ats/plugin_ats_mlp.c:2475
+msgid ""
+"MLP solver is not optimizing for anything, changing to feasibility check\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
+#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
+#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1140
+#: src/ats/plugin_ats_ril.c:2613 src/ats/plugin_ats_ril.c:2630
+#: src/ats/plugin_ats_ril.c:2647 src/ats/plugin_ats_ril.c:2664
+#: src/ats/plugin_ats_ril.c:2681 src/ats/plugin_ats_ril.c:2698
+#: src/ats/plugin_ats_ril.c:2715 src/ats/plugin_ats_ril.c:2732
 #, c-format
-msgid "Adjusting inconsistent outbound quota configuration for network `%s', 
is %llu must be at least %llu\n"
+msgid "Invalid %s configuration %f \n"
 msgstr ""
 
-#: src/ats/plugin_ats_mlp.c:2131
+#: src/ats/plugin_ats_mlp.c:2670
 #, c-format
-msgid "Adjusting inconsistent inbound quota configuration for network `%s', is 
%llu must be at least %llu\n"
+msgid ""
+"Adjusting inconsistent outbound quota configuration for network `%s', is "
+"%llu must be at least %llu\n"
 msgstr ""
 
-#: src/ats/plugin_ats_mlp.c:2142
+#: src/ats/plugin_ats_mlp.c:2679
 #, c-format
-msgid "Adjusting outbound quota configuration for network `%s'from %llu to 
%.0f\n"
+msgid ""
+"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
+"must be at least %llu\n"
 msgstr ""
 
-#: src/ats/plugin_ats_mlp.c:2150
+#: src/ats/plugin_ats_mlp.c:2689
 #, c-format
-msgid "Adjusting inbound quota configuration for network `%s' from %llu to 
%.0f\n"
+msgid ""
+"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
 msgstr ""
 
-#: src/ats/plugin_ats_mlp.c:2161
+#: src/ats/plugin_ats_mlp.c:2698
 #, c-format
-msgid "Using default quota configuration for network `%s' (in/out) %llu/%llu\n"
+msgid ""
+"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
 msgstr ""
 
-#: src/ats/plugin_ats_proportional.c:1511
+#: src/ats/plugin_ats_proportional.c:1163
 #, c-format
-msgid "Invalid network type `%u' `%s': Disconnect!\n"
+msgid "Invalid %s configuration %f\n"
 msgstr ""
 
 #: src/ats-tests/ats-testing.c:72
@@ -481,131 +486,202 @@
 msgid "Could not connect master [%u] and slave [%u]\n"
 msgstr ""
 
-#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:671
+#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:634
 msgid "Initialization failed, shutdown\n"
 msgstr ""
 
-#: src/ats-tests/ats-testing-log.c:842
+#: src/ats-tests/ats-testing-log.c:834
 msgid "Stop logging\n"
 msgstr "Arrêter la journalisation\n"
 
-#: src/ats-tests/ats-testing-log.c:893
+#: src/ats-tests/ats-testing-log.c:885
 #, c-format
 msgid "Start logging `%s'\n"
 msgstr "Démarrer la journalisation « %s »\n"
 
 #: src/ats-tests/gnunet-ats-sim.c:86
 #, c-format
-msgid "Master [%u]: sent: %u KiB in %u sec. = %u KiB/s, received: %u KiB in %u 
sec. = %u KiB/s\n"
+msgid ""
+"Master [%u]: sent: %u KiB in %u sec. = %u KiB/s, received: %u KiB in %u sec. "
+"= %u KiB/s\n"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:169
+#: src/ats-tool/gnunet-ats.c:289
 #, c-format
 msgid "%u address resolutions had a timeout\n"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:171
+#: src/ats-tool/gnunet-ats.c:293
 #, c-format
-msgid "ATS returned results for %u addresses\n"
+msgid "ATS returned stat_results for %u addresses\n"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:232
+#: src/ats-tool/gnunet-ats.c:366
 #, c-format
-msgid "Peer `%s' plugin `%s', address `%s', `%s' bw out: %u Bytes/s, bw in %u 
Bytes/s, %s\n"
+msgid ""
+"Peer `%s' plugin `%s', address `%s', `%s' bw out: %u Bytes/s, bw in %u Bytes/"
+"s, %s\n"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:413
+#: src/ats-tool/gnunet-ats.c:373
+msgid "active "
+msgstr ""
+
+#: src/ats-tool/gnunet-ats.c:373
+msgid "inactive "
+msgstr ""
+
+#: src/ats-tool/gnunet-ats.c:483
 #, c-format
+msgid "Removed address of peer `%s' with plugin `%s'\n"
+msgstr ""
+
+#: src/ats-tool/gnunet-ats.c:676
+#, c-format
 msgid "Quota for network `%11s' (in/out): %10s / %10s\n"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:433 src/core/gnunet-core.c:163
-#: src/namestore/gnunet-namestore.c:550 src/transport/gnunet-transport.c:1246
+#: src/ats-tool/gnunet-ats.c:708 src/namestore/gnunet-namestore.c:700
+#: src/namestore/plugin_rest_namestore.c:812
+#: src/transport/gnunet-transport.c:1890
+#: src/transport/gnunet-transport-profiler.c:531
 #, c-format
 msgid "Service `%s' is not running\n"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:445 src/transport/gnunet-transport.c:1255
+#: src/ats-tool/gnunet-ats.c:722 src/transport/gnunet-transport.c:1899
+#: src/transport/gnunet-transport-profiler.c:549
 #, c-format
 msgid "Failed to parse peer identity `%s'\n"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:454
+#: src/ats-tool/gnunet-ats.c:732
 #, c-format
 msgid "Please select one operation : %s or %s or %s or %s or %s\n"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:470 src/ats-tool/gnunet-ats.c:489
-#: src/ats-tool/gnunet-ats.c:506 src/ats-tool/gnunet-ats.c:543
-#, c-format
+#: src/ats-tool/gnunet-ats.c:754 src/ats-tool/gnunet-ats.c:780
+#: src/ats-tool/gnunet-ats.c:808 src/ats-tool/gnunet-ats.c:854
 msgid "Cannot connect to ATS service, exiting...\n"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:478 src/ats-tool/gnunet-ats.c:495
-#, c-format
+#: src/ats-tool/gnunet-ats.c:766 src/ats-tool/gnunet-ats.c:792
 msgid "Cannot issue request to ATS service, exiting...\n"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:515
-#, c-format
+#: src/ats-tool/gnunet-ats.c:820
 msgid "No preference type given!\n"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:520
-#, c-format
+#: src/ats-tool/gnunet-ats.c:827
 msgid "No peer given!\n"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:536
+#: src/ats-tool/gnunet-ats.c:845
 msgid "Valid type required\n"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:594
+#: src/ats-tool/gnunet-ats.c:916
 msgid "get list of active addresses currently used"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:596
+#: src/ats-tool/gnunet-ats.c:918
 msgid "get list of all active addresses"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:599
+#: src/ats-tool/gnunet-ats.c:921
 msgid "do not resolve IP addresses to hostnames"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:601
+#: src/ats-tool/gnunet-ats.c:923
 msgid "monitor mode"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:603
+#: src/ats-tool/gnunet-ats.c:925
 msgid "set preference for the given peer"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:605
+#: src/ats-tool/gnunet-ats.c:927
 msgid "print all configured quotas"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:607
+#: src/ats-tool/gnunet-ats.c:929
 msgid "peer id"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:610
+#: src/ats-tool/gnunet-ats.c:932
 msgid "preference type to set: latency | bandwidth"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:612
+#: src/ats-tool/gnunet-ats.c:934
 msgid "preference value"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:615
+#: src/ats-tool/gnunet-ats.c:937
 msgid "verbose output (include ATS address properties)"
 msgstr ""
 
-#: src/ats-tool/gnunet-ats.c:622
+#: src/ats-tool/gnunet-ats.c:944
 msgid "Print information about ATS state"
 msgstr ""
 
+#: src/cadet/gnunet-cadet.c:376
+#, c-format
+msgid "Invalid target `%s'\n"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:626
+#, c-format
+msgid "Invalid peer ID `%s'\n"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:669
+#, c-format
+msgid "Invalid tunnel owner `%s'\n"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:735
+msgid "You must NOT give a TARGETwhen using 'request all' options\n"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:832
+msgid "provide information about a particular connection"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:835
+msgid "activate echo mode"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:838
+msgid "dump debug information to STDERR"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:844
+msgid "port to listen to (default; 0)"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:847
+msgid "provide information about a patricular peer"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:850
+msgid "provide information about all peers"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:853
+msgid "provide information about a particular tunnel"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:856
+msgid "provide information about all tunnels"
+msgstr ""
+
+#: src/cadet/gnunet-service-cadet_peer.c:507
+msgid "Wrong CORE service\n"
+msgstr ""
+
 #: src/consensus/gnunet-consensus-profiler.c:437
-#: src/secretsharing/gnunet-secretsharing-profiler.c:535
+#: src/secretsharing/gnunet-secretsharing-profiler.c:610
 msgid "number of peers in consensus"
 msgstr ""
 
@@ -614,8 +690,8 @@
 msgstr ""
 
 #: src/consensus/gnunet-consensus-profiler.c:443
-#: src/set/gnunet-set-profiler.c:286 src/set/gnunet-set-profiler.c:289
-#: src/set/gnunet-set-profiler.c:292
+#: src/set/gnunet-set-profiler.c:289 src/set/gnunet-set-profiler.c:292
+#: src/set/gnunet-set-profiler.c:295
 msgid "number of values"
 msgstr "nombre de valeurs"
 
@@ -628,260 +704,271 @@
 msgstr ""
 
 #: src/consensus/gnunet-consensus-profiler.c:452
-#: src/secretsharing/gnunet-secretsharing-profiler.c:550
+#: src/secretsharing/gnunet-secretsharing-profiler.c:625
 msgid "be more verbose (print received values)"
 msgstr ""
 
-#: src/conversation/conversation_api.c:557
-#: src/conversation/conversation_api_call.c:470
+#: src/conversation/conversation_api.c:493
+#: src/conversation/conversation_api_call.c:475
 msgid "Connection to conversation service lost, trying to reconnect\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:264
+#: src/conversation/conversation_api.c:617
+#, fuzzy
+msgid "number too large"
+msgstr "nombre de valeurs"
+
+#: src/conversation/gnunet-conversation.c:269
 #, c-format
-msgid "Incoming call from `%s'. Please /accept #%u or /cancel %u the call.\n"
+msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:286
+#: src/conversation/gnunet-conversation.c:294
 #, c-format
 msgid "Call from `%s' terminated\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:319
+#: src/conversation/gnunet-conversation.c:329
 #, c-format
 msgid "Call from `%s' suspended by other user\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:324
+#: src/conversation/gnunet-conversation.c:334
 #, c-format
 msgid "Call from `%s' resumed by other user\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:342
+#: src/conversation/gnunet-conversation.c:352
 #, c-format
 msgid "Ego `%s' no longer available, phone is now down.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:356
+#: src/conversation/gnunet-conversation.c:366
 msgid "Failed to setup phone (internal error)\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:368
+#: src/conversation/gnunet-conversation.c:378
 #, c-format
-msgid "Phone active on line %u.  Type `/help' for a list of available 
commands\n"
+msgid ""
+"Phone active on line %u.  Type `/help' for a list of available commands\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:390
+#: src/conversation/gnunet-conversation.c:400
 #, c-format
 msgid "Resolved address of `%s'. Now ringing other party.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:397
+#: src/conversation/gnunet-conversation.c:407
 #, c-format
 msgid "Connection established to `%s'\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:404
+#: src/conversation/gnunet-conversation.c:414
 #, c-format
 msgid "Failed to resolve `%s'\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:411
-msgid "Call terminated\n"
+#: src/conversation/gnunet-conversation.c:422
+#, c-format
+msgid "Call to `%s' terminated\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:417
+#: src/conversation/gnunet-conversation.c:431
 #, c-format
 msgid "Connection to `%s' suspended (by other user)\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:423
+#: src/conversation/gnunet-conversation.c:437
 #, c-format
 msgid "Connection to `%s' resumed (by other user)\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:428
+#: src/conversation/gnunet-conversation.c:442
 msgid "Error with the call, restarting it\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:495
+#: src/conversation/gnunet-conversation.c:511
 #, c-format
 msgid "Unknown command `%s'\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:511
-#: src/conversation/gnunet-conversation.c:525
+#: src/conversation/gnunet-conversation.c:527
+#: src/conversation/gnunet-conversation.c:541
 #, c-format
 msgid "Ego `%s' not available\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:518
-#: src/conversation/gnunet-conversation.c:575
+#: src/conversation/gnunet-conversation.c:534
+#: src/conversation/gnunet-conversation.c:591
 msgid "You are calling someone else already, hang up first!\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:533
-#: src/conversation/gnunet-conversation.c:588
+#: src/conversation/gnunet-conversation.c:549
+#: src/conversation/gnunet-conversation.c:604
 #, c-format
 msgid "You are answering call from `%s', hang up or suspend that call first!\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:544
+#: src/conversation/gnunet-conversation.c:559
 msgid "Call recipient missing.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:599
+#: src/conversation/gnunet-conversation.c:615
 msgid "There is no incoming call to accept here!\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:616
+#: src/conversation/gnunet-conversation.c:632
 #, c-format
 msgid "There is no incoming call `%s' to accept right now!\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:647
+#: src/conversation/gnunet-conversation.c:662
 msgid "We currently do not have an address.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:670
+#: src/conversation/gnunet-conversation.c:685
 #, c-format
 msgid "We are currently trying to locate the private key for the ego `%s'.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:675
+#: src/conversation/gnunet-conversation.c:690
 #, c-format
 msgid "We are listening for incoming calls for ego `%s' on line %u.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:681
-#: src/conversation/gnunet-conversation.c:705
+#: src/conversation/gnunet-conversation.c:696
+#: src/conversation/gnunet-conversation.c:720
 #, c-format
 msgid "You are having a conversation with `%s'.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:686
-msgid "We had an internal error setting up our phone line. You can still make 
calls.\n"
+#: src/conversation/gnunet-conversation.c:701
+msgid ""
+"We had an internal error setting up our phone line. You can still make "
+"calls.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:695
+#: src/conversation/gnunet-conversation.c:710
 #, c-format
 msgid "We are trying to find the network address to call `%s'.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:700
+#: src/conversation/gnunet-conversation.c:715
 #, c-format
 msgid "We are calling `%s', his phone should be ringing.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:719
+#: src/conversation/gnunet-conversation.c:734
 msgid "Calls waiting:\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:725
+#: src/conversation/gnunet-conversation.c:740
 #, c-format
 msgid "#%u: `%s'\n"
 msgstr "#%u : « %s »\n"
 
-#: src/conversation/gnunet-conversation.c:753
 #: src/conversation/gnunet-conversation.c:768
+#: src/conversation/gnunet-conversation.c:783
 msgid "There is no call that could be suspended right now.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:801
-#: src/conversation/gnunet-conversation.c:817
+#: src/conversation/gnunet-conversation.c:816
+#: src/conversation/gnunet-conversation.c:832
 msgid "There is no call that could be resumed right now.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:824
+#: src/conversation/gnunet-conversation.c:839
 #, c-format
 msgid "Already talking with `%s', cannot resume a call right now.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:833
+#: src/conversation/gnunet-conversation.c:848
 msgid "There is no incoming call to resume here!\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:850
+#: src/conversation/gnunet-conversation.c:865
 #, c-format
 msgid "There is no incoming call `%s' to resume right now!\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:885
+#: src/conversation/gnunet-conversation.c:900
 msgid "There is no call that could be cancelled right now.\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:893
+#: src/conversation/gnunet-conversation.c:908
 msgid "There is no incoming call to refuse here!\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:910
+#: src/conversation/gnunet-conversation.c:925
 #, c-format
 msgid "There is no incoming call `%s' to refuse right now!\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:937
+#: src/conversation/gnunet-conversation.c:951
 msgid "Use `/address' to find out which address this phone should have in GNS"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:939
+#: src/conversation/gnunet-conversation.c:953
 msgid "Use `/call USER.gnu' to call USER"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:941
+#: src/conversation/gnunet-conversation.c:955
 msgid "Use `/accept #NUM' to accept incoming call #NUM"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:943
+#: src/conversation/gnunet-conversation.c:957
 msgid "Use `/suspend' to suspend the active call"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:945
-msgid "Use `/resume [#NUM]' to resume a call, #NUM is needed to resume 
incoming calls, no argument is needed to resume the current outgoing call."
+#: src/conversation/gnunet-conversation.c:959
+msgid ""
+"Use `/resume [#NUM]' to resume a call, #NUM is needed to resume incoming "
+"calls, no argument is needed to resume the current outgoing call."
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:947
+#: src/conversation/gnunet-conversation.c:961
 msgid "Use `/cancel' to reject or terminate a call"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:949
+#: src/conversation/gnunet-conversation.c:963
 msgid "Use `/status' to print status information"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:951
+#: src/conversation/gnunet-conversation.c:965
 msgid "Use `/quit' to terminate gnunet-conversation"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:953
+#: src/conversation/gnunet-conversation.c:967
 msgid "Use `/help command' to get help for a specific command"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:1151
+#: src/conversation/gnunet-conversation.c:1175
 #, c-format
 msgid "Name of our ego changed to `%s'\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:1164
+#: src/conversation/gnunet-conversation.c:1188
 #, c-format
 msgid "Our ego `%s' was deleted!\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:1199
+#: src/conversation/gnunet-conversation.c:1223
 msgid "You must specify the NAME of an ego to use\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:1223
+#: src/conversation/gnunet-conversation.c:1247
 msgid "Failed to start gnunet-helper-w32-console\n"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:1249
+#: src/conversation/gnunet-conversation.c:1273
 msgid "sets the NAME of the ego to use for the phone (and name resolution)"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:1252
+#: src/conversation/gnunet-conversation.c:1276
 msgid "sets the LINE to use for the phone"
 msgstr ""
 
-#: src/conversation/gnunet-conversation.c:1276
+#: src/conversation/gnunet-conversation.c:1302
 msgid "Enables having a conversation with other GNUnet users."
 msgstr ""
 
@@ -896,16 +983,20 @@
 #, c-format
 msgid ""
 "\n"
-"We are now playing your recording back.  If you can hear it, your audio 
settings are working..."
+"We are now playing your recording back.  If you can hear it, your audio "
+"settings are working..."
 msgstr ""
 
 #: src/conversation/gnunet-conversation-test.c:215
 #, c-format
-msgid "We will now be recording you for %s. After that time, the recording 
will be played back to you..."
+msgid ""
+"We will now be recording you for %s. After that time, the recording will be "
+"played back to you..."
 msgstr ""
 
 #: src/conversation/gnunet-conversation-test.c:248
 #: src/multicast/gnunet-multicast.c:70 src/revocation/gnunet-revocation.c:522
+#: src/sensordashboard/gnunet-sensordashboard.c:70
 #: src/template/gnunet-template.c:70
 msgid "help text"
 msgstr ""
@@ -915,59 +1006,59 @@
 msgid "pa_stream_write() failed: %s\n"
 msgstr "pa_stream_write() échoué : %s\n"
 
-#: src/conversation/gnunet-helper-audio-playback.c:587
+#: src/conversation/gnunet-helper-audio-playback.c:589
 msgid "gnunet-helper-audio-playback - Got signal, exiting\n"
 msgstr ""
 
-#: src/conversation/gnunet-helper-audio-playback.c:612
+#: src/conversation/gnunet-helper-audio-playback.c:614
 #: src/conversation/gnunet-helper-audio-record.c:545
 msgid "Connection established.\n"
 msgstr ""
 
-#: src/conversation/gnunet-helper-audio-playback.c:617
+#: src/conversation/gnunet-helper-audio-playback.c:619
 #: src/conversation/gnunet-helper-audio-record.c:550
 #, c-format
 msgid "pa_stream_new() failed: %s\n"
 msgstr "pa_stream_new() échoué : %s\n"
 
-#: src/conversation/gnunet-helper-audio-playback.c:631
+#: src/conversation/gnunet-helper-audio-playback.c:633
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s\n"
 msgstr "pa_stream_connect_playback() échoué : %s\n"
 
-#: src/conversation/gnunet-helper-audio-playback.c:644
+#: src/conversation/gnunet-helper-audio-playback.c:646
 #: src/conversation/gnunet-helper-audio-record.c:576
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr ""
 
-#: src/conversation/gnunet-helper-audio-playback.c:665
+#: src/conversation/gnunet-helper-audio-playback.c:667
 #: src/conversation/gnunet-helper-audio-record.c:599
 msgid "Wrong Spec\n"
 msgstr "Spécification incorrecte\n"
 
-#: src/conversation/gnunet-helper-audio-playback.c:671
+#: src/conversation/gnunet-helper-audio-playback.c:673
 #: src/conversation/gnunet-helper-audio-record.c:605
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() échoué.\n"
 
-#: src/conversation/gnunet-helper-audio-playback.c:685
+#: src/conversation/gnunet-helper-audio-playback.c:687
 #: src/conversation/gnunet-helper-audio-record.c:620
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() échoué.\n"
 
-#: src/conversation/gnunet-helper-audio-playback.c:692
+#: src/conversation/gnunet-helper-audio-playback.c:694
 #: src/conversation/gnunet-helper-audio-record.c:626
 #, c-format
 msgid "pa_context_connect() failed: %s\n"
 msgstr "pa_context_connect() échoué : %s\n"
 
-#: src/conversation/gnunet-helper-audio-playback.c:698
+#: src/conversation/gnunet-helper-audio-playback.c:700
 #: src/conversation/gnunet-helper-audio-record.c:632
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() échoué.\n"
 
-#: src/conversation/gnunet-helper-audio-playback.c:768
+#: src/conversation/gnunet-helper-audio-playback.c:770
 #, c-format
 msgid "Read error from STDIN: %s\n"
 msgstr ""
@@ -1034,18 +1125,19 @@
 msgid "Failed to allocate %d bytes for second packet\n"
 msgstr ""
 
-#: src/conversation/gnunet-service-conversation.c:841
-msgid "Mesh audio channel not ready; audio data dropped\n"
+#: src/conversation/gnunet-service-conversation.c:853
+msgid "Cadet audio channel not ready; audio data dropped\n"
 msgstr ""
 
-#: src/conversation/gnunet-service-conversation.c:932
+#: src/conversation/gnunet-service-conversation.c:944
 #, c-format
-msgid "No available phone for incoming call on line %u, sending HANG_UP 
signal\n"
+msgid ""
+"No available phone for incoming call on line %u, sending HANG_UP signal\n"
 msgstr ""
 
-#: src/conversation/gnunet-service-conversation.c:1338
+#: src/conversation/gnunet-service-conversation.c:1351
 #, c-format
-msgid "Received incoming channel on port %u\n"
+msgid "Received incoming Cadet channel on port %u\n"
 msgstr ""
 
 #: src/conversation/microphone.c:121
@@ -1061,238 +1153,275 @@
 msgid "Could not start playback audio helper.\n"
 msgstr ""
 
-#: src/core/core_api.c:767
+#: src/core/core_api.c:787
 msgid "Client was disconnected from core service, trying to reconnect.\n"
 msgstr ""
 
-#: src/core/gnunet-core.c:80
-#, c-format
-msgid "Peer `%s'\n"
+#: src/core/gnunet-core.c:92
+msgid "fresh connection"
 msgstr ""
 
-#: src/core/gnunet-core.c:110 src/core/gnunet-core.c:138
-#: src/transport/gnunet-transport.c:910 src/transport/gnunet-transport.c:930
-#, c-format
-msgid "%24s: %-17s %4s   (%u connections in total)\n"
+#: src/core/gnunet-core.c:95
+msgid "key sent"
 msgstr ""
 
-#: src/core/gnunet-core.c:112 src/transport/gnunet-transport.c:911
-msgid "Connected to"
+#: src/core/gnunet-core.c:98
+msgid "key received"
 msgstr ""
 
-#: src/core/gnunet-core.c:140 src/transport/gnunet-transport.c:931
-msgid "Disconnected from"
+#: src/core/gnunet-core.c:101
+msgid "connection established"
 msgstr ""
 
-#: src/core/gnunet-core.c:211 src/peerinfo-tool/gnunet-peerinfo.c:694
+#: src/core/gnunet-core.c:104
+msgid "rekeying"
+msgstr ""
+
+#: src/core/gnunet-core.c:107
+msgid "disconnected"
+msgstr ""
+
+#: src/core/gnunet-core.c:114
+msgid "Connection to CORE service lost (reconnecting)"
+msgstr ""
+
+#: src/core/gnunet-core.c:117
+#, fuzzy
+msgid "unknown state"
+msgstr "inconnu"
+
+#: src/core/gnunet-core.c:122
 #, c-format
+msgid "%24s: %-30s %4s (timeout in %6s)\n"
+msgstr ""
+
+#: src/core/gnunet-core.c:146 src/peerinfo-tool/gnunet-peerinfo.c:786
+#, c-format
 msgid "Invalid command line argument `%s'\n"
 msgstr ""
 
-#: src/core/gnunet-core.c:233 src/transport/gnunet-transport.c:1486
+#: src/core/gnunet-core.c:157
+msgid "Failed to connect to CORE service!\n"
+msgstr ""
+
+#: src/core/gnunet-core.c:179 src/transport/gnunet-transport.c:2154
 msgid "provide information about all current connections (continuously)"
 msgstr ""
 
-#: src/core/gnunet-core.c:244
+#: src/core/gnunet-core.c:188
 msgid "Print information about connected peers."
 msgstr ""
 
-#: src/core/gnunet-service-core.c:105
+#: src/core/gnunet-service-core.c:104
 msgid "Core service is lacking HOSTKEY configuration setting.  Exiting.\n"
 msgstr ""
 
-#: src/core/gnunet-service-core.c:126
+#: src/core/gnunet-service-core.c:128
 #, c-format
 msgid "Core service of `%4s' ready.\n"
 msgstr ""
 
-#: src/core/gnunet-service-core_clients.c:370
+#: src/core/gnunet-service-core_clients.c:375
 msgid "# send requests dropped (disconnected)"
 msgstr ""
 
-#: src/core/gnunet-service-core_clients.c:480
+#: src/core/gnunet-service-core_clients.c:490
 msgid "# messages discarded (session disconnected)"
 msgstr ""
 
-#: src/core/gnunet-service-core_clients.c:526
+#: src/core/gnunet-service-core_clients.c:536
 #, c-format
 msgid "# bytes of messages of type %u received"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:535
+#: src/core/gnunet-service-core_kx.c:571
 msgid "# bytes encrypted"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:586
+#: src/core/gnunet-service-core_kx.c:630
 msgid "# bytes decrypted"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:673
+#: src/core/gnunet-service-core_kx.c:719
 msgid "# key exchanges initiated"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:713
+#: src/core/gnunet-service-core_kx.c:765
 msgid "# key exchanges stopped"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:810
+#: src/core/gnunet-service-core_kx.c:795
+msgid "# PING messages transmitted"
+msgstr ""
+
+#: src/core/gnunet-service-core_kx.c:870
 msgid "# old ephemeral keys ignored"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:816
+#: src/core/gnunet-service-core_kx.c:877
 msgid "# ephemeral keys received"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:850
+#: src/core/gnunet-service-core_kx.c:916
 #, c-format
-msgid "Ephemeral key message from peer `%s' rejected as its validity range 
does not match our system time (%llu not in [%llu,%llu]).\n"
+msgid ""
+"Ephemeral key message from peer `%s' rejected as its validity range does not "
+"match our system time (%llu not in [%llu,%llu]).\n"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:861
+#: src/core/gnunet-service-core_kx.c:927
 msgid "# EPHEMERAL_KEY messages received"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:951
-#: src/transport/gnunet-service-transport_validation.c:1016
+#: src/core/gnunet-service-core_kx.c:1029
+#: src/transport/gnunet-service-transport_validation.c:1053
 msgid "# PING messages received"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:959
+#: src/core/gnunet-service-core_kx.c:1038
 msgid "# PING messages dropped (out of order)"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:986
+#: src/core/gnunet-service-core_kx.c:1067
 #, c-format
-msgid "Received PING from `%s' for different identity: I am `%s', PONG 
identity: `%s'\n"
+msgid ""
+"Received PING from `%s' for different identity: I am `%s', PONG identity: `"
+"%s'\n"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1003
+#: src/core/gnunet-service-core_kx.c:1093
 msgid "# PONG messages created"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1029
+#: src/core/gnunet-service-core_kx.c:1122
 msgid "# sessions terminated by timeout"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1039
+#: src/core/gnunet-service-core_kx.c:1135
 msgid "# keepalive messages sent"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1096
-#: src/transport/gnunet-service-transport_validation.c:1328
+#: src/core/gnunet-service-core_kx.c:1206
+#: src/transport/gnunet-service-transport_validation.c:1370
 msgid "# PONG messages received"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1102
+#: src/core/gnunet-service-core_kx.c:1213
 msgid "# PONG messages dropped (connection down)"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1107
+#: src/core/gnunet-service-core_kx.c:1218
 msgid "# PONG messages dropped (out of order)"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1137
+#: src/core/gnunet-service-core_kx.c:1254
 msgid "# PONG messages decrypted"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1171
+#: src/core/gnunet-service-core_kx.c:1292
 msgid "# session keys confirmed via PONG"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1181
+#: src/core/gnunet-service-core_kx.c:1303
 msgid "# timeouts prevented via PONG"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1188
+#: src/core/gnunet-service-core_kx.c:1310
 msgid "# rekey operations confirmed via PONG"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1328
+#: src/core/gnunet-service-core_kx.c:1466
 msgid "# DATA message dropped (out of order)"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1335
+#: src/core/gnunet-service-core_kx.c:1474
 #, c-format
-msgid "Session to peer `%s' went down due to key expiration (should not 
happen)\n"
+msgid ""
+"Session to peer `%s' went down due to key expiration (should not happen)\n"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1338
+#: src/core/gnunet-service-core_kx.c:1477
 msgid "# sessions terminated by key expiration"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1383
-#: src/core/gnunet-service-core_kx.c:1408
+#: src/core/gnunet-service-core_kx.c:1535
+#: src/core/gnunet-service-core_kx.c:1561
 msgid "# bytes dropped (duplicates)"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1395
+#: src/core/gnunet-service-core_kx.c:1548
 msgid "# bytes dropped (out of sequence)"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1437
+#: src/core/gnunet-service-core_kx.c:1590
 msgid "# bytes dropped (ancient message)"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1445
+#: src/core/gnunet-service-core_kx.c:1598
 msgid "# bytes of payload decrypted"
 msgstr ""
 
-#: src/core/gnunet-service-core_kx.c:1480
+#: src/core/gnunet-service-core_kx.c:1632
 msgid "# PAYLOAD dropped (out of order)"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:168
+#: src/core/gnunet-service-core_neighbours.c:177
 msgid "# sessions terminated by transport disconnect"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:184
-#: src/core/gnunet-service-core_neighbours.c:335
+#: src/core/gnunet-service-core_neighbours.c:193
+#: src/core/gnunet-service-core_neighbours.c:355
 msgid "# neighbour entries allocated"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:252
+#: src/core/gnunet-service-core_neighbours.c:264
 msgid "# encrypted bytes given to transport"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:418
+#: src/core/gnunet-service-core_neighbours.c:438
 #, c-format
 msgid "Unsupported message of type %u (%u bytes) received from peer `%s'\n"
 msgstr ""
 
-#: src/core/gnunet-service-core_sessions.c:216
-#: src/core/gnunet-service-core_sessions.c:288
-#: src/dht/gnunet-service-dht_neighbours.c:662
-#: src/dht/gnunet-service-dht_neighbours.c:727
-#: src/dht/gnunet-service-xdht_neighbours.c:1304
-#: src/fs/gnunet-service-fs_cp.c:606 src/fs/gnunet-service-fs_cp.c:1501
-#: src/topology/gnunet-daemon-topology.c:707
-#: src/topology/gnunet-daemon-topology.c:808
-#: src/transport/gnunet-service-transport_neighbours.c:917
-#: src/transport/gnunet-service-transport_neighbours.c:1141
-#: src/transport/gnunet-service-transport_neighbours.c:3142
-#: src/transport/gnunet-service-transport_neighbours.c:3438
+#: src/core/gnunet-service-core_sessions.c:252
+#: src/core/gnunet-service-core_sessions.c:338
+#: src/dht/gnunet-service-dht_neighbours.c:661
+#: src/dht/gnunet-service-dht_neighbours.c:726
+#: src/fs/gnunet-service-fs_cp.c:654 src/fs/gnunet-service-fs_cp.c:1647
+#: src/topology/gnunet-daemon-topology.c:734
+#: src/topology/gnunet-daemon-topology.c:835
+#: src/transport/gnunet-service-transport_neighbours.c:755
+#: src/transport/gnunet-service-transport_neighbours.c:763
 msgid "# peers connected"
 msgstr ""
 
-#: src/core/gnunet-service-core_sessions.c:255
+#: src/core/gnunet-service-core_sessions.c:285
 msgid "# type map refreshes sent"
 msgstr ""
 
-#: src/core/gnunet-service-core_sessions.c:426
+#: src/core/gnunet-service-core_sessions.c:404
+msgid "# outdated typemap confirmations received"
+msgstr ""
+
+#: src/core/gnunet-service-core_sessions.c:415
+msgid "# valid typemap confirmations received"
+msgstr ""
+
+#: src/core/gnunet-service-core_sessions.c:554
 msgid "# messages discarded (expired prior to transmission)"
 msgstr ""
 
-#: src/core/gnunet-service-core_typemap.c:110
-#: src/core/gnunet-service-core_typemap.c:121
+#: src/core/gnunet-service-core_typemap.c:169
+#: src/core/gnunet-service-core_typemap.c:180
 msgid "# type maps received"
 msgstr ""
 
-#: src/core/gnunet-service-core_typemap.c:151
+#: src/core/gnunet-service-core_typemap.c:210
 msgid "# updates to my type map"
 msgstr ""
 
 #: src/datacache/datacache.c:115 src/datacache/datacache.c:266
-#: src/datastore/gnunet-service-datastore.c:838
+#: src/datastore/gnunet-service-datastore.c:841
 msgid "# bytes stored"
 msgstr ""
 
@@ -1301,8 +1430,8 @@
 msgstr ""
 
 #: src/datacache/datacache.c:143 src/datacache/datacache.c:150
-#: src/datastore/gnunet-service-datastore.c:1487
-#: src/datastore/gnunet-service-datastore.c:1498
+#: src/datastore/gnunet-service-datastore.c:1598
+#: src/datastore/gnunet-service-datastore.c:1609
 #, c-format
 msgid "No `%s' specified for `%s' in configuration!\n"
 msgstr ""
@@ -1329,14 +1458,14 @@
 msgid "Heap datacache running\n"
 msgstr ""
 
-#: src/datacache/plugin_datacache_postgres.c:392
+#: src/datacache/plugin_datacache_postgres.c:391
 msgid "Postgres datacache running\n"
 msgstr ""
 
 #: src/datacache/plugin_datacache_sqlite.c:69
 #: src/datacache/plugin_datacache_sqlite.c:72
-#: src/datastore/plugin_datastore_mysql.c:806
-#: src/datastore/plugin_datastore_mysql.c:820
+#: src/datastore/plugin_datastore_mysql.c:818
+#: src/datastore/plugin_datastore_mysql.c:834
 #: src/datastore/plugin_datastore_sqlite.c:57 src/mysql/mysql.c:41
 #: src/mysql/mysql.c:48 src/mysql/mysql.c:522 src/mysql/mysql.c:531
 #: src/mysql/mysql.c:591 src/mysql/mysql.c:607
@@ -1344,28 +1473,29 @@
 #: src/namecache/plugin_namecache_sqlite.c:52
 #: src/namestore/plugin_namestore_postgres.c:52
 #: src/namestore/plugin_namestore_sqlite.c:52
+#: src/peerstore/plugin_peerstore_sqlite.c:50
 #: src/testbed/generate-underlay-topology.c:47
 #: src/testbed/gnunet-daemon-latency-logger.c:52
 #: src/testbed/gnunet-daemon-testbed-underlay.c:55
 #: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:51
-#: src/util/crypto_mpi.c:39 src/include/gnunet_common.h:602
-#: src/include/gnunet_common.h:611 src/scalarproduct/scalarproduct.h:50
+#: src/util/crypto_mpi.c:39 src/include/gnunet_common.h:626
+#: src/include/gnunet_common.h:635 src/scalarproduct/scalarproduct.h:35
 #, c-format
 msgid "`%s' failed at %s:%d with error: %s\n"
 msgstr ""
 
-#: src/datacache/plugin_datacache_sqlite.c:450
+#: src/datacache/plugin_datacache_sqlite.c:449
 msgid "Sqlite datacache running\n"
 msgstr ""
 
-#: src/datacache/plugin_datacache_sqlite.c:484
-#: src/datastore/plugin_datastore_sqlite.c:404
-#: src/namecache/plugin_namecache_sqlite.c:295
-#: src/namestore/plugin_namestore_sqlite.c:327
+#: src/datacache/plugin_datacache_sqlite.c:483
+#: src/datastore/plugin_datastore_sqlite.c:401
+#: src/namecache/plugin_namecache_sqlite.c:292
+#: src/namestore/plugin_namestore_sqlite.c:324
 msgid "Tried to close sqlite without finalizing all prepared statements.\n"
 msgstr ""
 
-#: src/datacache/plugin_datacache_sqlite.c:491
+#: src/datacache/plugin_datacache_sqlite.c:490
 #, c-format
 msgid "Failed to close statement %p: %d\n"
 msgstr ""
@@ -1398,67 +1528,63 @@
 msgid "# datastore connections (re)created"
 msgstr ""
 
-#: src/datastore/datastore_api.c:616 src/scalarproduct/scalarproduct_api.c:279
+#: src/datastore/datastore_api.c:621
 msgid "# transmission request failures"
 msgstr ""
 
-#: src/datastore/datastore_api.c:638
+#: src/datastore/datastore_api.c:645
 msgid "# bytes sent to datastore"
 msgstr ""
 
-#: src/datastore/datastore_api.c:770
+#: src/datastore/datastore_api.c:787
 msgid "Failed to receive status response from database."
 msgstr ""
 
-#: src/datastore/datastore_api.c:784
+#: src/datastore/datastore_api.c:801
 msgid "Error reading response from datastore service"
 msgstr ""
 
-#: src/datastore/datastore_api.c:796 src/datastore/datastore_api.c:802
+#: src/datastore/datastore_api.c:813 src/datastore/datastore_api.c:819
 msgid "Invalid error message received from datastore service"
 msgstr ""
 
-#: src/datastore/datastore_api.c:806
+#: src/datastore/datastore_api.c:823
 msgid "# status messages received"
 msgstr ""
 
-#: src/datastore/datastore_api.c:876
+#: src/datastore/datastore_api.c:893
 msgid "# PUT requests executed"
 msgstr ""
 
-#: src/datastore/datastore_api.c:944
+#: src/datastore/datastore_api.c:959
 msgid "# RESERVE requests executed"
 msgstr ""
 
-#: src/datastore/datastore_api.c:1005
+#: src/datastore/datastore_api.c:1020
 msgid "# RELEASE RESERVE requests executed"
 msgstr ""
 
-#: src/datastore/datastore_api.c:1065
+#: src/datastore/datastore_api.c:1080
 msgid "# UPDATE requests executed"
 msgstr ""
 
-#: src/datastore/datastore_api.c:1129
+#: src/datastore/datastore_api.c:1144
 msgid "# REMOVE requests executed"
 msgstr ""
 
-#: src/datastore/datastore_api.c:1174
-msgid "Failed to receive response from database.\n"
-msgstr ""
-
-#: src/datastore/datastore_api.c:1233
+#: src/datastore/datastore_api.c:1248
 msgid "# Results received"
 msgstr ""
 
-#: src/datastore/datastore_api.c:1300
+#: src/datastore/datastore_api.c:1315
 msgid "# GET REPLICATION requests executed"
 msgstr ""
 
-#: src/datastore/datastore_api.c:1363
+#: src/datastore/datastore_api.c:1378
 msgid "# GET ZERO ANONYMITY requests executed"
 msgstr ""
 
-#: src/datastore/datastore_api.c:1424
+#: src/datastore/datastore_api.c:1447
 msgid "# GET requests executed"
 msgstr ""
 
@@ -1473,179 +1599,207 @@
 msgstr ""
 
 #: src/datastore/gnunet-datastore.c:246
-msgid "specifies the configuration to use to access an alternative datastore; 
will merge that datastore into our current datastore"
+msgid ""
+"specifies the configuration to use to access an alternative datastore; will "
+"merge that datastore into our current datastore"
 msgstr ""
 
 #: src/datastore/gnunet-datastore.c:255
 msgid "Manipulate GNUnet datastore"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:351
+#: src/datastore/gnunet-service-datastore.c:365
 msgid "# bytes expired"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:425
+#: src/datastore/gnunet-service-datastore.c:439
 msgid "# bytes purged (low-priority)"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:483
+#: src/datastore/gnunet-service-datastore.c:497
 #: src/gns/gnunet-gns-helper-service-w32.c:223
 msgid "Transmission to client failed!\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:514
+#: src/datastore/gnunet-service-datastore.c:528
 #: src/gns/gnunet-gns-helper-service-w32.c:262
 msgid "Shutdown in progress, aborting transmission.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:630
+#: src/datastore/gnunet-service-datastore.c:643
 msgid "# results found"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:673
+#: src/datastore/gnunet-service-datastore.c:686
 #, c-format
-msgid "Insufficient space (%llu bytes are available) to satisfy `%s' request 
for %llu bytes\n"
+msgid ""
+"Insufficient space (%llu bytes are available) to satisfy `%s' request for "
+"%llu bytes\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:684
+#: src/datastore/gnunet-service-datastore.c:697
 #, c-format
-msgid "The requested amount (%llu bytes) is larger than the cache size (%llu 
bytes)\n"
+msgid ""
+"The requested amount (%llu bytes) is larger than the cache size (%llu "
+"bytes)\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:688
-msgid "Insufficient space to satisfy request and requested amount is larger 
than cache size"
+#: src/datastore/gnunet-service-datastore.c:701
+msgid ""
+"Insufficient space to satisfy request and requested amount is larger than "
+"cache size"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:694
+#: src/datastore/gnunet-service-datastore.c:707
 msgid "Insufficient space to satisfy request"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:699
-#: src/datastore/gnunet-service-datastore.c:751
-#: src/datastore/gnunet-service-datastore.c:964
-#: src/datastore/gnunet-service-datastore.c:1421
+#: src/datastore/gnunet-service-datastore.c:712
+#: src/datastore/gnunet-service-datastore.c:767
+#: src/datastore/gnunet-service-datastore.c:999
+#: src/datastore/gnunet-service-datastore.c:1570
 msgid "# reserved"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:764
+#: src/datastore/gnunet-service-datastore.c:780
 msgid "Could not find matching reservation"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:850
+#: src/datastore/gnunet-service-datastore.c:853
 #, c-format
 msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1010
+#: src/datastore/gnunet-service-datastore.c:1046
 msgid "# GET requests received"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1022
+#: src/datastore/gnunet-service-datastore.c:1058
 msgid "# requests filtered by bloomfilter"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1050
+#: src/datastore/gnunet-service-datastore.c:1094
 msgid "# UPDATE requests received"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1080
+#: src/datastore/gnunet-service-datastore.c:1122
 msgid "# GET REPLICATION requests received"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1113
+#: src/datastore/gnunet-service-datastore.c:1155
 msgid "# GET ZERO ANONYMITY requests received"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1138
+#: src/datastore/gnunet-service-datastore.c:1180
 msgid "Content not found"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1146
+#: src/datastore/gnunet-service-datastore.c:1188
 msgid "# bytes removed (explicit request)"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1178
+#: src/datastore/gnunet-service-datastore.c:1220
 msgid "# REMOVE requests received"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1220
+#: src/datastore/gnunet-service-datastore.c:1264
 #, c-format
-msgid "Datastore payload inaccurate (%lld < %lld).  Trying to fix.\n"
+msgid ""
+"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1281
+#: src/datastore/gnunet-service-datastore.c:1269
 #, c-format
+msgid "New payload: %lld\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1322
+#, c-format
 msgid "Loading `%s' datastore plugin\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1290
+#: src/datastore/gnunet-service-datastore.c:1333
 #, c-format
 msgid "Failed to load datastore plugin for `%s'\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1492
+#: src/datastore/gnunet-service-datastore.c:1402
+#: src/datastore/gnunet-service-datastore.c:1463
+msgid "Bloomfilter construction complete.\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1450
+msgid "Rebuilding bloomfilter.  Please be patient.\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1460
+msgid "Plugin does not support get_keys function. Please fix!\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1603
 #, c-format
 msgid "# bytes used in file-sharing datastore `%s'"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1503
+#: src/datastore/gnunet-service-datastore.c:1614
 msgid "# quota"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1505
+#: src/datastore/gnunet-service-datastore.c:1616
 msgid "# cache size"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1518
+#: src/datastore/gnunet-service-datastore.c:1629
 #, c-format
 msgid "Could not use specified filename `%s' for bloomfilter.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1536
-#: src/datastore/gnunet-service-datastore.c:1552
+#: src/datastore/gnunet-service-datastore.c:1647
+#: src/datastore/gnunet-service-datastore.c:1663
 #, c-format
 msgid "Failed to remove bogus bloomfilter file `%s'\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1582
+#: src/datastore/gnunet-service-datastore.c:1693
 msgid "Failed to initialize bloomfilter.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1611
-msgid "Rebuilding bloomfilter.  Please be patient.\n"
+#: src/datastore/plugin_datastore_heap.c:826
+msgid "Heap database running\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1616
-msgid "Plugin does not support get_keys function. Please fix!\n"
+#: src/datastore/plugin_datastore_mysql.c:309
+#: src/datastore/plugin_datastore_sqlite.c:499
+msgid "Data too large"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1619
-msgid "Bloomfilter construction complete.\n"
+#: src/datastore/plugin_datastore_mysql.c:328
+msgid "MySQL statement run failure"
 msgstr ""
 
-#: src/datastore/plugin_datastore_heap.c:820
-msgid "Heap database running\n"
-msgstr ""
-
-#: src/datastore/plugin_datastore_mysql.c:783
+#: src/datastore/plugin_datastore_mysql.c:793
 #, c-format
 msgid "Failed to prepare statement `%s'\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_mysql.c:791
+#: src/datastore/plugin_datastore_mysql.c:802
 #, c-format
 msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_mysql.c:1022
+#: src/datastore/plugin_datastore_mysql.c:1036
 msgid "Mysql database running\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_postgres.c:824
+#: src/datastore/plugin_datastore_postgres.c:331
+msgid "Postgress exec failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_postgres.c:846
 msgid "Failed to drop table from database.\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_postgres.c:860
+#: src/datastore/plugin_datastore_postgres.c:882
 #: src/namecache/plugin_namecache_postgres.c:414
 #: src/namestore/plugin_namestore_postgres.c:569
 msgid "Postgres database running\n"
@@ -1662,35 +1816,38 @@
 #: src/datastore/plugin_datastore_sqlite.c:255
 #: src/namecache/plugin_namecache_sqlite.c:193
 #: src/namestore/plugin_namestore_sqlite.c:204
-#: src/psycstore/plugin_psycstore_sqlite.c:319
+#: src/peerstore/plugin_peerstore_sqlite.c:479
+#: src/psycstore/plugin_psycstore_sqlite.c:329
 #, c-format
 msgid "Unable to initialize SQLite: %s.\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_sqlite.c:663
+#: src/datastore/plugin_datastore_sqlite.c:680
 msgid "Invalid data in database.  Trying to fix (by deletion).\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_sqlite.c:1156
+#: src/datastore/plugin_datastore_sqlite.c:1177
 msgid "sqlite version to old to determine size, assuming zero\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_sqlite.c:1175
+#: src/datastore/plugin_datastore_sqlite.c:1197
 #, c-format
-msgid "Using sqlite page utilization to estimate payload (%llu pages of size 
%llu bytes)\n"
+msgid ""
+"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
+"bytes)\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_sqlite.c:1215
-#: src/namecache/plugin_namecache_sqlite.c:583
-#: src/namestore/plugin_namestore_sqlite.c:719
+#: src/datastore/plugin_datastore_sqlite.c:1237
+#: src/namecache/plugin_namecache_sqlite.c:580
+#: src/namestore/plugin_namestore_sqlite.c:716
 msgid "Sqlite database running\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_template.c:257
+#: src/datastore/plugin_datastore_template.c:260
 msgid "Template database running\n"
 msgstr ""
 
-#: src/dht/dht_api.c:376
+#: src/dht/dht_api.c:403
 msgid "Failed to connect to the DHT service!\n"
 msgstr ""
 
@@ -1735,8 +1892,8 @@
 msgstr ""
 
 #: src/dht/gnunet-dht-get.c:204 src/dht/gnunet-dht-monitor.c:271
-#: src/dht/gnunet-dht-put.c:213 src/fs/gnunet-auto-share.c:753
-#: src/fs/gnunet-download.c:328 src/fs/gnunet-publish.c:877
+#: src/dht/gnunet-dht-put.c:213 src/fs/gnunet-auto-share.c:755
+#: src/fs/gnunet-download.c:328 src/fs/gnunet-publish.c:941
 #: src/fs/gnunet-search.c:301 src/fs/gnunet-unindex.c:168
 #: src/nse/gnunet-nse-profiler.c:873
 msgid "be verbose (print progress information)"
@@ -1754,6 +1911,52 @@
 msgid "Prints all packets that go through the DHT."
 msgstr ""
 
+#: src/dht/gnunet_dht_profiler.c:1393
+#: src/testbed/gnunet-testbed-profiler.c:267
+#, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1418
+#, fuzzy
+msgid "number of peers to start"
+msgstr "nombre de valeurs"
+
+#: src/dht/gnunet_dht_profiler.c:1421
+msgid ""
+"maximum number of times we try to search for successor circle formation (0 "
+"for R5N)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1424 src/nse/gnunet-nse-profiler.c:864
+#: src/testbed/gnunet-testbed-profiler.c:306
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1427
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1430
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1433
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1436
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1439
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1457
+msgid "Measure quality and performance of the DHT service."
+msgstr ""
+
 #: src/dht/gnunet-dht-put.c:118
 msgid "PUT request sent with key"
 msgstr ""
@@ -1800,107 +2003,107 @@
 msgid "Issue a PUT request to the GNUnet DHT insert DATA under KEY."
 msgstr ""
 
-#: src/dht/gnunet-service-dht.c:172 src/dht/gnunet-service-xdht.c:176
+#: src/dht/gnunet-service-dht.c:172 src/dht/gnunet-service-xdht.c:193
 msgid "Failed to connect to transport service!\n"
 msgstr ""
 
 #: src/dht/gnunet-service-dht_clients.c:417
-#: src/dht/gnunet-service-xdht_clients.c:838
+#: src/dht/gnunet-service-xdht_clients.c:849
 msgid "# GET requests from clients injected"
 msgstr ""
 
 #: src/dht/gnunet-service-dht_clients.c:513
-#: src/dht/gnunet-service-xdht_clients.c:927
+#: src/dht/gnunet-service-xdht_clients.c:933
 msgid "# PUT requests received from clients"
 msgstr ""
 
 #: src/dht/gnunet-service-dht_clients.c:597
-#: src/dht/gnunet-service-xdht_clients.c:1013
+#: src/dht/gnunet-service-xdht_clients.c:998
 msgid "# GET requests received from clients"
 msgstr ""
 
 #: src/dht/gnunet-service-dht_clients.c:798
-#: src/dht/gnunet-service-xdht_clients.c:1214
+#: src/dht/gnunet-service-xdht_clients.c:1200
 msgid "# GET STOP requests received from clients"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_clients.c:1039
-#: src/dht/gnunet-service-xdht_clients.c:498
+#: src/dht/gnunet-service-dht_clients.c:1040
+#: src/dht/gnunet-service-xdht_clients.c:503
 msgid "# Key match, type mismatches in REPLY to CLIENT"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_clients.c:1052
-#: src/dht/gnunet-service-xdht_clients.c:511
+#: src/dht/gnunet-service-dht_clients.c:1053
+#: src/dht/gnunet-service-xdht_clients.c:517
 msgid "# Duplicate REPLIES to CLIENT request dropped"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_clients.c:1089
-#: src/dht/gnunet-service-xdht_clients.c:548
+#: src/dht/gnunet-service-dht_clients.c:1098
+#: src/dht/gnunet-service-xdht_clients.c:559
 #, c-format
 msgid "Unsupported block type (%u) in request!\n"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_clients.c:1112
-#: src/dht/gnunet-service-xdht_clients.c:571
+#: src/dht/gnunet-service-dht_clients.c:1121
+#: src/dht/gnunet-service-xdht_clients.c:582
 msgid "# RESULTS queued for clients"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_clients.c:1166
-#: src/dht/gnunet-service-dht_clients.c:1209
-#: src/dht/gnunet-service-xdht_clients.c:625
-#: src/dht/gnunet-service-xdht_clients.c:668
+#: src/dht/gnunet-service-dht_clients.c:1175
+#: src/dht/gnunet-service-dht_clients.c:1218
+#: src/dht/gnunet-service-xdht_clients.c:636
+#: src/dht/gnunet-service-xdht_clients.c:679
 msgid "# REPLIES ignored for CLIENTS (no match)"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_clients.c:1176
-#: src/dht/gnunet-service-xdht_clients.c:635
+#: src/dht/gnunet-service-dht_clients.c:1185
+#: src/dht/gnunet-service-xdht_clients.c:646
 msgid "Could not pass reply to client, message too big!\n"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_datacache.c:68
-#: src/dht/gnunet-service-xdht_datacache.c:68
+#: src/dht/gnunet-service-dht_datacache.c:69
+#: src/dht/gnunet-service-xdht_datacache.c:71
 #, c-format
 msgid "%s request received, but have no datacache!\n"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_datacache.c:78
-#: src/dht/gnunet-service-xdht_datacache.c:78
+#: src/dht/gnunet-service-dht_datacache.c:79
+#: src/dht/gnunet-service-xdht_datacache.c:82
 msgid "# ITEMS stored in datacache"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_datacache.c:165
-#: src/dht/gnunet-service-xdht_datacache.c:165
+#: src/dht/gnunet-service-dht_datacache.c:176
+#: src/dht/gnunet-service-xdht_datacache.c:230
 msgid "# Good RESULTS found in datacache"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_datacache.c:176
-#: src/dht/gnunet-service-xdht_datacache.c:176
+#: src/dht/gnunet-service-dht_datacache.c:193
+#: src/dht/gnunet-service-xdht_datacache.c:253
 msgid "# Duplicate RESULTS found in datacache"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_datacache.c:182
-#: src/dht/gnunet-service-xdht_datacache.c:182
+#: src/dht/gnunet-service-dht_datacache.c:199
+#: src/dht/gnunet-service-xdht_datacache.c:259
 msgid "# Invalid RESULTS found in datacache"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_datacache.c:188
-#: src/dht/gnunet-service-xdht_datacache.c:188
+#: src/dht/gnunet-service-dht_datacache.c:205
+#: src/dht/gnunet-service-xdht_datacache.c:265
 msgid "# Irrelevant RESULTS found in datacache"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_datacache.c:200
-#: src/dht/gnunet-service-xdht_datacache.c:200
+#: src/dht/gnunet-service-dht_datacache.c:217
+#: src/dht/gnunet-service-xdht_datacache.c:277
 msgid "# Unsupported RESULTS found in datacache"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_datacache.c:203
-#: src/dht/gnunet-service-xdht_datacache.c:203
+#: src/dht/gnunet-service-dht_datacache.c:221
+#: src/dht/gnunet-service-xdht_datacache.c:280
 #, c-format
 msgid "Unsupported block type (%u) in local response!\n"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_datacache.c:234
-#: src/dht/gnunet-service-xdht_datacache.c:234
+#: src/dht/gnunet-service-dht_datacache.c:254
+#: src/dht/gnunet-service-xdht_datacache.c:318
 msgid "# GET requests given to datacache"
 msgstr ""
 
@@ -1909,110 +2112,119 @@
 msgid "# HELLOs obtained from peerinfo"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:516
+#: src/dht/gnunet-service-dht_neighbours.c:515
 msgid "# Preference updates given to core"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:610
+#: src/dht/gnunet-service-dht_neighbours.c:609
 msgid "# FIND PEER messages initiated"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:764
+#: src/dht/gnunet-service-dht_neighbours.c:763
+#: src/dht/gnunet-service-xdht_neighbours.c:6060
 msgid "# Queued messages discarded (peer disconnected)"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:819
-#: src/dht/gnunet-service-xdht_neighbours.c:703
+#: src/dht/gnunet-service-dht_neighbours.c:793
+#: src/dht/gnunet-service-xdht_neighbours.c:987
+msgid "# Messages dropped (CORE timeout)"
+msgstr ""
+
+#: src/dht/gnunet-service-dht_neighbours.c:823
+#: src/dht/gnunet-service-xdht_neighbours.c:1019
 msgid "# Bytes transmitted to other peers"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:857
-#: src/dht/gnunet-service-xdht_neighbours.c:742
+#: src/dht/gnunet-service-dht_neighbours.c:861
 msgid "# Bytes of bandwidth requested from core"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:889
+#: src/dht/gnunet-service-dht_neighbours.c:893
 msgid "# requests TTL-dropped"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1093
-#: src/dht/gnunet-service-dht_neighbours.c:1130
+#: src/dht/gnunet-service-dht_neighbours.c:1097
+#: src/dht/gnunet-service-dht_neighbours.c:1134
 msgid "# Peers excluded from routing due to Bloomfilter"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1108
-#: src/dht/gnunet-service-dht_neighbours.c:1145
+#: src/dht/gnunet-service-dht_neighbours.c:1112
+#: src/dht/gnunet-service-dht_neighbours.c:1149
 msgid "# Peer selection failed"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1287
+#: src/dht/gnunet-service-dht_neighbours.c:1293
 msgid "# PUT requests routed"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1316
+#: src/dht/gnunet-service-dht_neighbours.c:1322
 msgid "# PUT messages queued for transmission"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1323
-#: src/dht/gnunet-service-dht_neighbours.c:1440
-#: src/dht/gnunet-service-dht_neighbours.c:1543
-#: src/dht/gnunet-service-xdht_neighbours.c:794
-#: src/dht/gnunet-service-xdht_neighbours.c:860
-#: src/dht/gnunet-service-xdht_neighbours.c:919
-#: src/dht/gnunet-service-xdht_neighbours.c:981
-#: src/dht/gnunet-service-xdht_neighbours.c:1041
+#: src/dht/gnunet-service-dht_neighbours.c:1332
+#: src/dht/gnunet-service-dht_neighbours.c:1456
+#: src/dht/gnunet-service-dht_neighbours.c:1561
+#: src/dht/gnunet-service-xdht_neighbours.c:1129
+#: src/dht/gnunet-service-xdht_neighbours.c:1198
+#: src/dht/gnunet-service-xdht_neighbours.c:1248
+#: src/dht/gnunet-service-xdht_neighbours.c:1312
+#: src/dht/gnunet-service-xdht_neighbours.c:1379
+#: src/dht/gnunet-service-xdht_neighbours.c:1441
+#: src/dht/gnunet-service-xdht_neighbours.c:1503
+#: src/dht/gnunet-service-xdht_neighbours.c:1565
+#: src/dht/gnunet-service-xdht_neighbours.c:1625
 msgid "# P2P messages dropped due to full queue"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1405
+#: src/dht/gnunet-service-dht_neighbours.c:1418
 msgid "# GET requests routed"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1432
+#: src/dht/gnunet-service-dht_neighbours.c:1445
 msgid "# GET messages queued for transmission"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1550
+#: src/dht/gnunet-service-dht_neighbours.c:1568
 msgid "# RESULT messages queued for transmission"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1636
+#: src/dht/gnunet-service-dht_neighbours.c:1655
 msgid "# P2P PUT requests received"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1639
+#: src/dht/gnunet-service-dht_neighbours.c:1658
 msgid "# P2P PUT bytes received"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1803
+#: src/dht/gnunet-service-dht_neighbours.c:1826
 msgid "# FIND PEER requests ignored due to Bloomfilter"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1811
+#: src/dht/gnunet-service-dht_neighbours.c:1834
 msgid "# FIND PEER requests ignored due to lack of HELLO"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1904
+#: src/dht/gnunet-service-dht_neighbours.c:1929
 msgid "# P2P GET requests received"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1907
+#: src/dht/gnunet-service-dht_neighbours.c:1932
 msgid "# P2P GET bytes received"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1961
+#: src/dht/gnunet-service-dht_neighbours.c:1997
 msgid "# P2P FIND PEER requests processed"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:1975
+#: src/dht/gnunet-service-dht_neighbours.c:2011
 msgid "# P2P GET requests ONLY routed"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:2052
+#: src/dht/gnunet-service-dht_neighbours.c:2096
 msgid "# P2P RESULTS received"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_neighbours.c:2055
+#: src/dht/gnunet-service-dht_neighbours.c:2099
 msgid "# P2P RESULT bytes received"
 msgstr ""
 
@@ -2020,76 +2232,161 @@
 msgid "# Network size estimates received"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_routing.c:211
+#: src/dht/gnunet-service-dht_routing.c:218
 msgid "# Good REPLIES matched against routing table"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_routing.c:220
+#: src/dht/gnunet-service-dht_routing.c:227
 msgid "# Duplicate REPLIES matched against routing table"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_routing.c:226
+#: src/dht/gnunet-service-dht_routing.c:233
 msgid "# Invalid REPLIES matched against routing table"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_routing.c:232
+#: src/dht/gnunet-service-dht_routing.c:239
 msgid "# Irrelevant REPLIES matched against routing table"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_routing.c:244
+#: src/dht/gnunet-service-dht_routing.c:251
 msgid "# Unsupported REPLIES matched against routing table"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_routing.c:317
+#: src/dht/gnunet-service-dht_routing.c:324
 msgid "# Entries removed from routing table"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_routing.c:399
+#: src/dht/gnunet-service-dht_routing.c:406
 msgid "# Entries added to routing table"
 msgstr ""
 
-#: src/dht/gnunet-service-dht_routing.c:417
+#: src/dht/gnunet-service-dht_routing.c:424
 msgid "# DHT requests combined"
 msgstr ""
 
-#: src/dht/gnunet-service-xdht_neighbours.c:1398
+#: src/dht/gnunet-service-xdht_neighbours.c:1832
 #, c-format
 msgid ""
 "\n"
-"SUPU %s, %s, %d,my_identity = %s"
+"SUPU %s, %s, %d,trail_length = %d"
 msgstr ""
 
-#: src/dht/gnunet-service-xdht_neighbours.c:1514
-#: src/dht/gnunet-service-xdht_neighbours.c:1524
-#: src/dht/gnunet-service-xdht_neighbours.c:1530
-#: src/dht/gnunet-service-xdht_neighbours.c:1536
-#: src/dht/gnunet-service-xdht_neighbours.c:1545
+#: src/dht/gnunet-service-xdht_neighbours.c:1837
 #, c-format
 msgid ""
 "\n"
-"SUPU %s, %s, %d"
+"SUPU %s, %s, %d,trail[%d]=%s"
 msgstr ""
 
-#: src/dht/plugin_block_dht.c:138
+#: src/dht/gnunet-service-xdht_neighbours.c:1857
 #, c-format
+msgid ""
+"\n"
+"SUPU************  FRIEND_PEERMAP of %s"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:1867
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d, friend = %s, friend->trails_count = %d"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:1888
+#, c-format
+msgid ""
+"\n"
+"SUPU************  FINGER_TABLE of %s"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:1897
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d, finger_table[%d] = %s, trails_count = %d"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:1904
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d, trail_id[%d]=%s"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:1910
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d,trail[%d] = %s "
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:3559
+msgid "# FINGERS_COUNT"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:3700
+#: src/dht/gnunet-service-xdht_neighbours.c:3938
+#: src/dht/gnunet-service-xdht_neighbours.c:4090
+#: src/dht/gnunet-service-xdht_neighbours.c:4240
+#: src/dht/gnunet-service-xdht_neighbours.c:4421
+#: src/dht/gnunet-service-xdht_neighbours.c:4934
+#: src/dht/gnunet-service-xdht_neighbours.c:5327
+#: src/dht/gnunet-service-xdht_neighbours.c:5420
+#: src/dht/gnunet-service-xdht_neighbours.c:5510
+#: src/dht/gnunet-service-xdht_neighbours.c:5614
+#: src/dht/gnunet-service-xdht_neighbours.c:5758
+#: src/dht/gnunet-service-xdht_neighbours.c:5847
+msgid "# Bytes received from other peers"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_routing.c:256
+#, c-format
+msgid ""
+"\n"
+"SUPU ***PRINTING ROUTING TABLE ***** of =%s"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_routing.c:264
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d, trail->trail_id = %s"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_routing.c:267
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d, trail->next_hop = %s"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_routing.c:270
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d, trail->prev_hop = %s"
+msgstr ""
+
+#: src/dht/plugin_block_dht.c:142
+#, c-format
 msgid "Block not of type %u\n"
 msgstr ""
 
-#: src/dht/plugin_block_dht.c:145
+#: src/dht/plugin_block_dht.c:149
 msgid "Size mismatch for block\n"
 msgstr ""
 
-#: src/dht/plugin_block_dht.c:155
+#: src/dht/plugin_block_dht.c:159
 #, c-format
 msgid "Block of type %u is malformed\n"
 msgstr ""
 
-#: src/dns/dnsparser.c:257
+#: src/dns/dnsparser.c:254
 #, c-format
 msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
 msgstr ""
 
-#: src/dns/dnsparser.c:856
+#: src/dns/dnsparser.c:818
 #, c-format
 msgid "Failed to convert UTF-8 name `%s' to DNS IDNA format: %s\n"
 msgstr ""
@@ -2119,15 +2416,15 @@
 msgid "Received DNS response that is too small (%u bytes)"
 msgstr ""
 
-#: src/dns/gnunet-dns-monitor.c:355
+#: src/dns/gnunet-dns-monitor.c:352
 msgid "only monitor DNS queries"
 msgstr ""
 
-#: src/dns/gnunet-dns-monitor.c:358
+#: src/dns/gnunet-dns-monitor.c:355
 msgid "only monitor DNS replies"
 msgstr ""
 
-#: src/dns/gnunet-dns-monitor.c:369
+#: src/dns/gnunet-dns-monitor.c:366
 msgid "Monitor DNS queries."
 msgstr ""
 
@@ -2143,50 +2440,50 @@
 msgid "Change DNS replies to point elsewhere."
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:456
+#: src/dns/gnunet-service-dns.c:459
 msgid "# DNS requests answered via TUN interface"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:603
+#: src/dns/gnunet-service-dns.c:606
 msgid "# DNS exit failed (failed to open socket)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:714
+#: src/dns/gnunet-service-dns.c:717
 msgid "# External DNS response discarded (no matching request)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:792
+#: src/dns/gnunet-service-dns.c:795
 msgid "# Client response discarded (no matching request)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:907
+#: src/dns/gnunet-service-dns.c:910
 msgid "Received malformed IPv4-UDP packet on TUN interface.\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:923
+#: src/dns/gnunet-service-dns.c:926
 msgid "Received malformed IPv6-UDP packet on TUN interface.\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:932
+#: src/dns/gnunet-service-dns.c:935
 #, c-format
 msgid "Got non-IP packet with %u bytes and protocol %u from TUN\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:942
+#: src/dns/gnunet-service-dns.c:945
 msgid "# Non-DNS UDP packet received via TUN interface"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:1009
+#: src/dns/gnunet-service-dns.c:1012
 msgid "# DNS requests received via TUN interface"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:1049 src/exit/gnunet-daemon-exit.c:3514
-#, c-format
-msgid "`%s' must be installed SUID, refusing to run\n"
+#: src/dns/gnunet-service-dns.c:1064 src/exit/gnunet-daemon-exit.c:3594
+msgid "need a valid IPv4 or IPv6 address\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:1069 src/exit/gnunet-daemon-exit.c:3571
-msgid "need a valid IPv4 or IPv6 address\n"
+#: src/dns/gnunet-service-dns.c:1082
+#, c-format
+msgid "`%s' must be installed SUID, will not run DNS interceptor\n"
 msgstr ""
 
 #: src/dv/gnunet-dv.c:169
@@ -2203,7 +2500,7 @@
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:853
-msgid "# Bytes transmitted via mesh channels"
+msgid "# Bytes transmitted via cadet channels"
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:970 src/exit/gnunet-daemon-exit.c:2397
@@ -2266,14 +2563,14 @@
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:1872
-msgid "# TCP service creation requests received via mesh"
+msgid "# TCP service creation requests received via cadet"
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:1875 src/exit/gnunet-daemon-exit.c:1968
 #: src/exit/gnunet-daemon-exit.c:2073 src/exit/gnunet-daemon-exit.c:2321
 #: src/exit/gnunet-daemon-exit.c:2570 src/exit/gnunet-daemon-exit.c:2859
 #: src/exit/gnunet-daemon-exit.c:2966
-msgid "# Bytes received from MESH"
+msgid "# Bytes received from CADET"
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:1909 src/exit/gnunet-daemon-exit.c:2990
@@ -2286,11 +2583,11 @@
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:1971
-msgid "# TCP IP-exit creation requests received via mesh"
+msgid "# TCP IP-exit creation requests received via cadet"
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:2076
-msgid "# TCP data requests received via mesh"
+msgid "# TCP data requests received via cadet"
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:2090
@@ -2302,11 +2599,11 @@
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:2324
-msgid "# ICMP IP-exit requests received via mesh"
+msgid "# ICMP IP-exit requests received via cadet"
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:2573
-msgid "# ICMP service requests received via mesh"
+msgid "# ICMP service requests received via cadet"
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:2639 src/vpn/gnunet-service-vpn.c:1397
@@ -2324,11 +2621,11 @@
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:2862
-msgid "# UDP IP-exit requests received via mesh"
+msgid "# UDP IP-exit requests received via cadet"
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:2969
-msgid "# UDP service requests received via mesh"
+msgid "# UDP service requests received via cadet"
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:2995
@@ -2336,300 +2633,190 @@
 msgstr ""
 
 #: src/exit/gnunet-daemon-exit.c:3031
-msgid "# Inbound MESH channels created"
+msgid "# Inbound CADET channels created"
 msgstr ""
 
-#: src/exit/gnunet-daemon-exit.c:3235 src/exit/gnunet-daemon-exit.c:3245
+#: src/exit/gnunet-daemon-exit.c:3255 src/exit/gnunet-daemon-exit.c:3265
 #, c-format
 msgid "Option `%s' for domain `%s' is not formatted correctly!\n"
 msgstr ""
 
-#: src/exit/gnunet-daemon-exit.c:3259 src/exit/gnunet-daemon-exit.c:3267
+#: src/exit/gnunet-daemon-exit.c:3279 src/exit/gnunet-daemon-exit.c:3287
 #, c-format
 msgid "`%s' is not a valid port number (for domain `%s')!"
 msgstr ""
 
-#: src/exit/gnunet-daemon-exit.c:3300
+#: src/exit/gnunet-daemon-exit.c:3320
 #, c-format
 msgid "No addresses found for hostname `%s' of service `%s'!\n"
 msgstr ""
 
-#: src/exit/gnunet-daemon-exit.c:3314 src/exit/gnunet-daemon-exit.c:3326
+#: src/exit/gnunet-daemon-exit.c:3334 src/exit/gnunet-daemon-exit.c:3346
 #, c-format
 msgid "Service `%s' configured for IPv4, but IPv4 is disabled!\n"
 msgstr ""
 
-#: src/exit/gnunet-daemon-exit.c:3337
+#: src/exit/gnunet-daemon-exit.c:3357
 #, c-format
 msgid "No IP addresses found for hostname `%s' of service `%s'!\n"
 msgstr ""
 
-#: src/exit/gnunet-daemon-exit.c:3527
-msgid "This system does not support IPv4, will disable IPv4 functions despite 
them being enabled in the configuration\n"
+#: src/exit/gnunet-daemon-exit.c:3534
+#, c-format
+msgid "`%s' must be installed SUID, EXIT will not work\n"
 msgstr ""
 
-#: src/exit/gnunet-daemon-exit.c:3535
-msgid "This system does not support IPv6, will disable IPv6 functions despite 
them being enabled in the configuration\n"
+#: src/exit/gnunet-daemon-exit.c:3550
+msgid ""
+"This system does not support IPv4, will disable IPv4 functions despite them "
+"being enabled in the configuration\n"
 msgstr ""
 
-#: src/exit/gnunet-daemon-exit.c:3542
-msgid "Cannot enable IPv4 exit but disable IPv4 on TUN interface, will use 
ENABLE_IPv4=YES\n"
+#: src/exit/gnunet-daemon-exit.c:3558
+msgid ""
+"This system does not support IPv6, will disable IPv6 functions despite them "
+"being enabled in the configuration\n"
 msgstr ""
 
-#: src/exit/gnunet-daemon-exit.c:3548
-msgid "Cannot enable IPv6 exit but disable IPv6 on TUN interface, will use 
ENABLE_IPv6=YES\n"
+#: src/exit/gnunet-daemon-exit.c:3565
+msgid ""
+"Cannot enable IPv4 exit but disable IPv4 on TUN interface, will use "
+"ENABLE_IPv4=YES\n"
 msgstr ""
 
-#: src/exit/gnunet-daemon-exit.c:3554 src/exit/gnunet-daemon-exit.c:3717
+#: src/exit/gnunet-daemon-exit.c:3571
+msgid ""
+"Cannot enable IPv6 exit but disable IPv6 on TUN interface, will use "
+"ENABLE_IPv6=YES\n"
+msgstr ""
+
+#: src/exit/gnunet-daemon-exit.c:3577 src/exit/gnunet-daemon-exit.c:3742
 #: src/pt/gnunet-daemon-pt.c:1247
 msgid "No useful service enabled.  Exiting.\n"
 msgstr ""
 
-#: src/exit/gnunet-daemon-exit.c:3664
+#: src/exit/gnunet-daemon-exit.c:3689
 msgid "Must be a number"
 msgstr ""
 
-#: src/exit/gnunet-daemon-exit.c:3813
+#: src/exit/gnunet-daemon-exit.c:3838
 msgid "Daemon to run to provide an IP exit node for the VPN"
 msgstr ""
 
-#: src/experimentation/gnunet-daemon-experimentation.c:55
-msgid "Experimentation daemon shutting down ...\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation.c:77
-msgid "Experimentation daemon starting ...\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation.c:83
-msgid "Failed to create statistics!\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation.c:120
-msgid "GNUnet experimentation daemon"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:241
-#, c-format
-msgid "Experiment `%s': Experiment signature is invalid\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:250
-#, c-format
-msgid "Adding experiment `%s' running from `%s' to `%s' every %llu sec. for 
%llu sec. \n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:303
-#, c-format
-msgid "Experiment `%s': Issuer missing\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:312
-#, c-format
-msgid "Experiment `%s': Issuer invalid\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:320
-#, c-format
-msgid "Experiment `%s': Issuer not accepted!\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:330
-#, c-format
-msgid "Experiment `%s': Version missing or invalid \n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:339
-#, c-format
-msgid "Experiment `%s': Required capabilities missing \n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:345
-#, c-format
-msgid "Experiment `%s': Required capabilities invalid \n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:390
-#, c-format
-msgid "Failed to parse file `%s'\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:420
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:452
-msgid "No valid experiment issuers configured! Set value to public keys of 
issuers! Exiting.\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:435
-msgid "Invalid value for public key\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:473
-#, c-format
-msgid "Cannot read experiments file `%s'\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_nodes.c:221
-#, c-format
-msgid "Cannot send message to peer `%s' for experiment `%s'\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_nodes.c:309
-#, c-format
-msgid "Sending experimentation request to peer %s\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_nodes.c:453
-#, c-format
-msgid "Added peer `%s' as active node\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_nodes.c:891
-#, c-format
-msgid "Connected to peer %s\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_nodes.c:921
-#, c-format
-msgid "Disconnected from peer %s\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_nodes.c:1104
-msgid "Failed to connect to CORE service!\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_scheduler.c:108
-#, c-format
-msgid "Peer `%s' did not respond to request for experiment `%s'\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_scheduler.c:143
-#, c-format
-msgid "Starting inbound experiment `%s' with peer `%s'\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_scheduler.c:276
-#, c-format
-msgid "Starting outbound experiment `%s' with peer `%s'\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_scheduler.c:294
-#, c-format
-msgid "Received %s message from peer %s for experiment `%s'\n"
-msgstr ""
-
-#: src/fragmentation/defragmentation.c:270
+#: src/fragmentation/defragmentation.c:277
 msgid "# acknowledgements sent for fragment"
 msgstr ""
 
-#: src/fragmentation/defragmentation.c:456
+#: src/fragmentation/defragmentation.c:470
+#: src/transport/plugin_transport_wlan.c:1515
 msgid "# fragments received"
 msgstr ""
 
-#: src/fragmentation/defragmentation.c:521
+#: src/fragmentation/defragmentation.c:540
 msgid "# duplicate fragments received"
 msgstr ""
 
-#: src/fragmentation/defragmentation.c:534
+#: src/fragmentation/defragmentation.c:558
 msgid "# messages defragmented"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:208
+#: src/fragmentation/fragmentation.c:235
 msgid "# fragments transmitted"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:211
+#: src/fragmentation/fragmentation.c:240
 msgid "# fragments retransmitted"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:237
+#: src/fragmentation/fragmentation.c:269
 msgid "# fragments wrap arounds"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:281
+#: src/fragmentation/fragmentation.c:315
 msgid "# messages fragmented"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:284
+#: src/fragmentation/fragmentation.c:321
 msgid "# total size of fragmented messages"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:405
+#: src/fragmentation/fragmentation.c:444
 msgid "# fragment acknowledgements received"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:411
+#: src/fragmentation/fragmentation.c:451
 msgid "# bits removed from fragmentation ACKs"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:435
+#: src/fragmentation/fragmentation.c:475
 msgid "# fragmentation transmissions completed"
 msgstr ""
 
-#: src/fs/fs_api.c:465
+#: src/fs/fs_api.c:491
 #, c-format
 msgid "Could not open file `%s': %s"
 msgstr ""
 
-#: src/fs/fs_api.c:474
+#: src/fs/fs_api.c:502
 #, c-format
 msgid "Could not read file `%s': %s"
 msgstr ""
 
-#: src/fs/fs_api.c:480
+#: src/fs/fs_api.c:510
 #, c-format
 msgid "Short read reading from file `%s'!"
 msgstr ""
 
-#: src/fs/fs_api.c:1066
+#: src/fs/fs_api.c:1118
 #, c-format
 msgid "Failed to resume publishing information `%s': %s\n"
 msgstr ""
 
-#: src/fs/fs_api.c:1571
+#: src/fs/fs_api.c:1638
 #, c-format
 msgid "Failure while resuming publishing operation `%s': %s\n"
 msgstr ""
 
-#: src/fs/fs_api.c:1585
+#: src/fs/fs_api.c:1652
 #, c-format
 msgid "Failed to resume publishing operation `%s': %s\n"
 msgstr ""
 
-#: src/fs/fs_api.c:2242
+#: src/fs/fs_api.c:2310
 #, c-format
 msgid "Failure while resuming unindexing operation `%s': %s\n"
 msgstr ""
 
-#: src/fs/fs_api.c:2252
+#: src/fs/fs_api.c:2320
 #, c-format
 msgid "Failed to resume unindexing operation `%s': %s\n"
 msgstr ""
 
-#: src/fs/fs_api.c:2378 src/fs/fs_api.c:2619
+#: src/fs/fs_api.c:2448 src/fs/fs_api.c:2696
 #, c-format
 msgid "Failed to resume sub-download `%s': %s\n"
 msgstr ""
 
-#: src/fs/fs_api.c:2395
+#: src/fs/fs_api.c:2466
 #, c-format
 msgid "Failed to resume sub-search `%s': %s\n"
 msgstr ""
 
-#: src/fs/fs_api.c:2409 src/fs/fs_api.c:2428 src/fs/fs_api.c:2911
+#: src/fs/fs_api.c:2481 src/fs/fs_api.c:2500 src/fs/fs_api.c:2992
 #, c-format
 msgid "Failure while resuming search operation `%s': %s\n"
 msgstr ""
 
-#: src/fs/fs_api.c:2610
+#: src/fs/fs_api.c:2686
 #, c-format
 msgid "Failed to resume sub-download `%s': could not open file `%s'\n"
 msgstr ""
 
-#: src/fs/fs_api.c:2855
+#: src/fs/fs_api.c:2935
 msgid "Could not resume running search, will resume as paused search\n"
 msgstr ""
 
-#: src/fs/fs_api.c:2949
+#: src/fs/fs_api.c:3030
 #, c-format
 msgid "Failure while resuming download operation `%s': %s\n"
 msgstr ""
@@ -2639,7 +2826,9 @@
 msgstr ""
 
 #: src/fs/fs_download.c:322
-msgid "Recursive downloads of directories larger than 4 GB are not supported 
on 32-bit systems\n"
+msgid ""
+"Recursive downloads of directories larger than 4 GB are not supported on 32-"
+"bit systems\n"
 msgstr ""
 
 #: src/fs/fs_download.c:342
@@ -2658,7 +2847,9 @@
 
 #: src/fs/fs_download.c:987
 #, c-format
-msgid "Internal error or bogus download URI (expected %u bytes at depth %u and 
offset %llu/%llu, got %u bytes)"
+msgid ""
+"Internal error or bogus download URI (expected %u bytes at depth %u and "
+"offset %llu/%llu, got %u bytes)"
 msgstr ""
 
 #: src/fs/fs_download.c:1013
@@ -2690,7 +2881,9 @@
 
 #: src/fs/fs_getopt.c:192
 #, c-format
-msgid "Unknown metadata type in metadata option `%s'.  Using metadata type 
`unknown' instead.\n"
+msgid ""
+"Unknown metadata type in metadata option `%s'.  Using metadata type "
+"`unknown' instead.\n"
 msgstr ""
 
 #: src/fs/fs_list_indexed.c:90
@@ -2732,62 +2925,66 @@
 msgid "Failed to connect to datastore."
 msgstr ""
 
-#: src/fs/fs_publish.c:125 src/fs/fs_publish.c:415
+#: src/fs/fs_publish.c:126 src/fs/fs_publish.c:431
 #, c-format
 msgid "Publishing failed: %s"
 msgstr ""
 
-#: src/fs/fs_publish.c:667 src/fs/fs_publish.c:684 src/fs/fs_publish.c:723
-#: src/fs/fs_publish.c:744 src/fs/fs_publish.c:768 src/fs/fs_publish.c:914
+#: src/fs/fs_publish.c:683 src/fs/fs_publish.c:700 src/fs/fs_publish.c:739
+#: src/fs/fs_publish.c:760 src/fs/fs_publish.c:784 src/fs/fs_publish.c:1034
 #, c-format
 msgid "Can not index file `%s': %s.  Will try to insert instead.\n"
 msgstr ""
 
-#: src/fs/fs_publish.c:669
+#: src/fs/fs_publish.c:685
 msgid "timeout on index-start request to `fs' service"
 msgstr ""
 
-#: src/fs/fs_publish.c:681
+#: src/fs/fs_publish.c:697
 msgid "unknown error"
 msgstr ""
 
-#: src/fs/fs_publish.c:725
+#: src/fs/fs_publish.c:741
 msgid "failed to compute hash"
 msgstr ""
 
-#: src/fs/fs_publish.c:745
+#: src/fs/fs_publish.c:761
 msgid "filename too long"
 msgstr ""
 
-#: src/fs/fs_publish.c:770
+#: src/fs/fs_publish.c:786
 msgid "could not connect to `fs' service"
 msgstr ""
 
-#: src/fs/fs_publish.c:793
+#: src/fs/fs_publish.c:809
 #, c-format
 msgid "Failed to get file identifiers for `%s'\n"
 msgstr ""
 
-#: src/fs/fs_publish.c:862
+#: src/fs/fs_publish.c:873 src/fs/fs_publish.c:914
+msgid "Can not create LOC URI. Will continue with CHK instead.\n"
+msgstr ""
+
+#: src/fs/fs_publish.c:988
 #, c-format
 msgid "Recursive upload failed at `%s': %s"
 msgstr ""
 
-#: src/fs/fs_publish.c:868
+#: src/fs/fs_publish.c:996
 #, c-format
 msgid "Recursive upload failed: %s"
 msgstr ""
 
-#: src/fs/fs_publish.c:915
+#: src/fs/fs_publish.c:1036
 msgid "needs to be an actual file"
 msgstr ""
 
-#: src/fs/fs_publish.c:1151
+#: src/fs/fs_publish.c:1272
 #, c-format
 msgid "Insufficient space for publishing: %s"
 msgstr ""
 
-#: src/fs/fs_publish.c:1243
+#: src/fs/fs_publish.c:1363
 #, c-format
 msgid "Reserving space for %u entries and %llu bytes for publication\n"
 msgstr ""
@@ -2796,196 +2993,212 @@
 msgid "Could not connect to datastore."
 msgstr ""
 
-#: src/fs/fs_publish_ublock.c:219
+#: src/fs/fs_publish_ublock.c:243
 msgid "Internal error."
 msgstr ""
 
-#: src/fs/fs_search.c:813
+#: src/fs/fs_search.c:812 src/fs/fs_search.c:882
 #, c-format
 msgid "Failed to parse URI `%s': %s\n"
 msgstr ""
 
-#: src/fs/fs_search.c:872
+#: src/fs/fs_search.c:941
 #, c-format
 msgid "Got result with unknown block type `%d', ignoring"
 msgstr ""
 
-#: src/fs/fs_unindex.c:59
+#: src/fs/fs_unindex.c:63
 msgid "Failed to find given position in file"
 msgstr ""
 
-#: src/fs/fs_unindex.c:64
+#: src/fs/fs_unindex.c:68
 msgid "Failed to read file"
 msgstr ""
 
-#: src/fs/fs_unindex.c:234
+#: src/fs/fs_unindex.c:245
 msgid "Unexpected time for a response from `fs' service."
 msgstr ""
 
-#: src/fs/fs_unindex.c:242
+#: src/fs/fs_unindex.c:253
 msgid "Timeout waiting for `fs' service."
 msgstr ""
 
-#: src/fs/fs_unindex.c:250
+#: src/fs/fs_unindex.c:261
 msgid "Invalid response from `fs' service."
 msgstr ""
 
-#: src/fs/fs_unindex.c:291
+#: src/fs/fs_unindex.c:304
 msgid "Failed to connect to FS service for unindexing."
 msgstr ""
 
-#: src/fs/fs_unindex.c:347 src/fs/fs_unindex.c:359
+#: src/fs/fs_unindex.c:360 src/fs/fs_unindex.c:372
 msgid "Failed to get KSKs from directory scan."
 msgstr ""
 
-#: src/fs/fs_unindex.c:355
+#: src/fs/fs_unindex.c:368
 #, c-format
 msgid "Internal error scanning `%s'.\n"
 msgstr ""
 
-#: src/fs/fs_unindex.c:414
+#: src/fs/fs_unindex.c:427
 #, c-format
 msgid "Failed to remove UBlock: %s\n"
 msgstr ""
 
-#: src/fs/fs_unindex.c:562 src/fs/fs_unindex.c:626
+#: src/fs/fs_unindex.c:590 src/fs/fs_unindex.c:656
 msgid "Failed to connect to `datastore' service."
 msgstr ""
 
-#: src/fs/fs_unindex.c:639
+#: src/fs/fs_unindex.c:669
 msgid "Failed to open file for unindexing."
 msgstr ""
 
-#: src/fs/fs_unindex.c:673
+#: src/fs/fs_unindex.c:708
 msgid "Failed to compute hash of file."
 msgstr ""
 
-#: src/fs/fs_uri.c:222
+#: src/fs/fs_uri.c:223
 #, no-c-format
-msgid "`%' must be followed by HEX number"
+msgid "Malformed KSK URI (`%' must be followed by HEX number)"
 msgstr ""
 
-#: src/fs/fs_uri.c:281
+#: src/fs/fs_uri.c:282
 msgid "Malformed KSK URI (must not begin or end with `+')"
 msgstr ""
 
-#: src/fs/fs_uri.c:299
-msgid "`++' not allowed in KSK URI"
+#: src/fs/fs_uri.c:300
+msgid "Malformed KSK URI (`++' not allowed)"
 msgstr ""
 
-#: src/fs/fs_uri.c:306
-msgid "Quotes not balanced in KSK URI"
+#: src/fs/fs_uri.c:307
+msgid "Malformed KSK URI (quotes not balanced)"
 msgstr ""
 
 #: src/fs/fs_uri.c:376
-msgid "Malformed SKS URI"
+msgid "Malformed SKS URI (wrong syntax)"
 msgstr ""
 
-#: src/fs/fs_uri.c:419 src/fs/fs_uri.c:434
-msgid "Malformed CHK URI"
+#: src/fs/fs_uri.c:417
+msgid "Malformed CHK URI (wrong syntax)"
 msgstr ""
 
-#: src/fs/fs_uri.c:512 src/fs/fs_uri.c:580
-msgid "SKS URI malformed"
+#: src/fs/fs_uri.c:432
+msgid "Malformed CHK URI (failed to decode CHK)"
 msgstr ""
 
-#: src/fs/fs_uri.c:527 src/fs/fs_uri.c:537
-msgid "LOC URI malformed"
+#: src/fs/fs_uri.c:511
+msgid "LOC URI malformed (wrong syntax)"
 msgstr ""
 
-#: src/fs/fs_uri.c:545 src/fs/fs_uri.c:553
+#: src/fs/fs_uri.c:526
+msgid "LOC URI malformed (no CHK)"
+msgstr ""
+
+#: src/fs/fs_uri.c:536
+msgid "LOC URI malformed (missing LOC)"
+msgstr ""
+
+#: src/fs/fs_uri.c:544
+msgid "LOC URI malformed (wrong syntax for public key)"
+msgstr ""
+
+#: src/fs/fs_uri.c:552
 msgid "LOC URI malformed (could not decode public key)"
 msgstr ""
 
-#: src/fs/fs_uri.c:559
-msgid "SKS URI malformed (could not find signature)"
+#: src/fs/fs_uri.c:558
+msgid "LOC URI malformed (could not find signature)"
 msgstr ""
 
-#: src/fs/fs_uri.c:565 src/fs/fs_uri.c:574
-msgid "SKS URI malformed (could not decode signature)"
+#: src/fs/fs_uri.c:564
+msgid "LOC URI malformed (wrong syntax for signature)"
 msgstr ""
 
-#: src/fs/fs_uri.c:586
-msgid "SKS URI malformed (could not parse expiration time)"
+#: src/fs/fs_uri.c:573
+msgid "LOC URI malformed (could not decode signature)"
 msgstr ""
 
-#: src/fs/fs_uri.c:598
-msgid "SKS URI malformed (signature failed validation)"
+#: src/fs/fs_uri.c:579
+msgid "LOC URI malformed (wrong syntax for expiration time)"
 msgstr ""
 
-#: src/fs/fs_uri.c:636
-msgid "Unrecognized URI type"
+#: src/fs/fs_uri.c:585
+msgid "LOC URI malformed (could not parse expiration time)"
 msgstr ""
 
-#: src/fs/fs_uri.c:860
-msgid "Lacking key configuration settings.\n"
+#: src/fs/fs_uri.c:597
+msgid "LOC URI malformed (signature failed validation)"
 msgstr ""
 
-#: src/fs/fs_uri.c:866
-#, c-format
-msgid "Could not access hostkey file `%s'.\n"
+#: src/fs/fs_uri.c:631
+msgid "invalid argument"
 msgstr ""
 
-#: src/fs/fs_uri.c:1050 src/fs/fs_uri.c:1077
+#: src/fs/fs_uri.c:643
+msgid "Unrecognized URI type"
+msgstr ""
+
+#: src/fs/fs_uri.c:1045 src/fs/fs_uri.c:1072
 msgid "No keywords specified!\n"
 msgstr ""
 
-#: src/fs/fs_uri.c:1083
+#: src/fs/fs_uri.c:1078
 msgid "Number of double-quotes not balanced!\n"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:236
+#: src/fs/gnunet-auto-share.c:237
 #, c-format
 msgid "Failed to load state: %s\n"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:289 src/fs/gnunet-auto-share.c:299
-#: src/fs/gnunet-auto-share.c:309
+#: src/fs/gnunet-auto-share.c:290 src/fs/gnunet-auto-share.c:300
+#: src/fs/gnunet-auto-share.c:310
 #, c-format
 msgid "Failed to save state to file %s\n"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:401
+#: src/fs/gnunet-auto-share.c:402
 #, c-format
 msgid "Publication of `%s' done\n"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:488
+#: src/fs/gnunet-auto-share.c:490
 #, c-format
 msgid "Publishing `%s'\n"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:497
+#: src/fs/gnunet-auto-share.c:499
 #, c-format
 msgid "Failed to run `%s'\n"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:686
+#: src/fs/gnunet-auto-share.c:688
 #, c-format
-msgid "You must specify one and only one directory name for automatic 
publication.\n"
+msgid ""
+"You must specify one and only one directory name for automatic publication.\n"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:737 src/fs/gnunet-publish.c:824
+#: src/fs/gnunet-auto-share.c:739 src/fs/gnunet-publish.c:888
 msgid "set the desired LEVEL of sender-anonymity"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:741 src/fs/gnunet-publish.c:828
+#: src/fs/gnunet-auto-share.c:743 src/fs/gnunet-publish.c:892
 msgid "disable adding the creation time to the metadata of the uploaded file"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:744 src/fs/gnunet-publish.c:831
+#: src/fs/gnunet-auto-share.c:746 src/fs/gnunet-publish.c:895
 msgid "do not use libextractor to add keywords or metadata"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:747 src/fs/gnunet-publish.c:855
+#: src/fs/gnunet-auto-share.c:749 src/fs/gnunet-publish.c:919
 msgid "specify the priority of the content"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:750 src/fs/gnunet-publish.c:862
+#: src/fs/gnunet-auto-share.c:752 src/fs/gnunet-publish.c:926
 msgid "set the desired replication LEVEL"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:770
+#: src/fs/gnunet-auto-share.c:772
 msgid "Automatically publish files from a directory on GNUnet"
 msgstr ""
 
@@ -3037,7 +3250,9 @@
 
 #: src/fs/gnunet-download.c:157
 #, c-format
-msgid "Downloading `%s' at %llu/%llu (%s remaining, %s/s). Block took %s to 
download\n"
+msgid ""
+"Downloading `%s' at %llu/%llu (%s remaining, %s/s). Block took %s to "
+"download\n"
 msgstr ""
 
 #: src/fs/gnunet-download.c:179
@@ -3050,7 +3265,7 @@
 msgid "Downloading `%s' done (%s/s).\n"
 msgstr ""
 
-#: src/fs/gnunet-download.c:209 src/fs/gnunet-publish.c:286
+#: src/fs/gnunet-download.c:209 src/fs/gnunet-publish.c:304
 #: src/fs/gnunet-search.c:200 src/fs/gnunet-unindex.c:108
 #, c-format
 msgid "Unexpected status: %d\n"
@@ -3060,7 +3275,7 @@
 msgid "You need to specify a URI argument.\n"
 msgstr ""
 
-#: src/fs/gnunet-download.c:240 src/fs/gnunet-publish.c:665
+#: src/fs/gnunet-download.c:240 src/fs/gnunet-publish.c:714
 #, c-format
 msgid "Failed to parse URI: %s\n"
 msgstr ""
@@ -3073,7 +3288,7 @@
 msgid "Target filename must be specified.\n"
 msgstr ""
 
-#: src/fs/gnunet-download.c:268 src/fs/gnunet-publish.c:797
+#: src/fs/gnunet-download.c:268 src/fs/gnunet-publish.c:858
 #: src/fs/gnunet-search.c:250 src/fs/gnunet-unindex.c:140
 #, c-format
 msgid "Could not initialize `%s' subsystem.\n"
@@ -3108,7 +3323,9 @@
 msgstr ""
 
 #: src/fs/gnunet-download.c:339
-msgid "Download files from GNUnet using a GNUnet CHK or LOC URI 
(gnunet://fs/chk/...)"
+msgid ""
+"Download files from GNUnet using a GNUnet CHK or LOC URI (gnunet://fs/"
+"chk/...)"
 msgstr ""
 
 #: src/fs/gnunet-fs.c:117
@@ -3135,158 +3352,178 @@
 msgid "run a testbed to measure file-sharing performance"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:231 src/fs/gnunet-publish.c:243
+#: src/fs/gnunet-publish.c:238 src/fs/gnunet-publish.c:250
 #, c-format
 msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:250
+#: src/fs/gnunet-publish.c:257
 #, c-format
 msgid "Error publishing: %s.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:260
+#: src/fs/gnunet-publish.c:268
 #, c-format
 msgid "Publishing `%s' done.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:264
+#: src/fs/gnunet-publish.c:273
 #, c-format
 msgid "URI is `%s'.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:283
+#: src/fs/gnunet-publish.c:281
+#, c-format
+msgid "Namespace URI is `%s'.\n"
+msgstr ""
+
+#: src/fs/gnunet-publish.c:301
 msgid "Cleanup after abort complete.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:401
+#: src/fs/gnunet-publish.c:427
 #, c-format
 msgid "Meta data for file `%s' (%s)\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:403
+#: src/fs/gnunet-publish.c:429
 #, c-format
 msgid "Keywords for file `%s' (%s)\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:542
+#: src/fs/gnunet-publish.c:574
 msgid "Could not publish\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:565
+#: src/fs/gnunet-publish.c:599
 msgid "Could not start publishing.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:598
+#: src/fs/gnunet-publish.c:633
 #, c-format
 msgid "Scanning directory `%s'.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:600
+#: src/fs/gnunet-publish.c:637
 #, c-format
 msgid "Scanning file `%s'.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:605
+#: src/fs/gnunet-publish.c:643
 #, c-format
 msgid "There was trouble processing file `%s', skipping it.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:610
+#: src/fs/gnunet-publish.c:650
 msgid "Preprocessing complete.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:614
+#: src/fs/gnunet-publish.c:655
 #, c-format
 msgid "Extracting meta data from file `%s' complete.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:618
+#: src/fs/gnunet-publish.c:662
 msgid "Meta data extraction has finished.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:625
+#: src/fs/gnunet-publish.c:671
 msgid "Internal error scanning directory.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:656
+#: src/fs/gnunet-publish.c:703
 #, c-format
 msgid "Selected pseudonym `%s' unknown\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:682
+#: src/fs/gnunet-publish.c:735
 #, c-format
 msgid "Failed to access `%s': %s\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:695
-msgid "Failed to start meta directory scanner.  Is gnunet-helper-publish-fs 
installed?\n"
+#: src/fs/gnunet-publish.c:749
+msgid ""
+"Failed to start meta directory scanner.  Is gnunet-helper-publish-fs "
+"installed?\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:747
+#: src/fs/gnunet-publish.c:805
 #, c-format
 msgid "Cannot extract metadata from a URI!\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:754
+#: src/fs/gnunet-publish.c:812
 #, c-format
 msgid "You must specify one and only one filename for insertion.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:760
+#: src/fs/gnunet-publish.c:818
 #, c-format
 msgid "You must NOT specify an URI and a filename.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:768 src/vpn/gnunet-vpn.c:209
+#: src/fs/gnunet-publish.c:826 src/vpn/gnunet-vpn.c:209
 #, c-format
 msgid "Option `%s' is required when using option `%s'.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:778 src/fs/gnunet-publish.c:785
-#: src/transport/gnunet-transport.c:1284 src/transport/gnunet-transport.c:1314
-#: src/transport/gnunet-transport.c:1344
+#: src/fs/gnunet-publish.c:837 src/fs/gnunet-publish.c:845
+#: src/transport/gnunet-transport.c:1928 src/transport/gnunet-transport.c:1958
+#: src/transport/gnunet-transport.c:1989
 #, c-format
 msgid "Option `%s' makes no sense without option `%s'.\n"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:835
-msgid "print list of extracted keywords that would be used, but do not perform 
upload"
+#: src/fs/gnunet-publish.c:899
+msgid ""
+"print list of extracted keywords that would be used, but do not perform "
+"upload"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:839
-msgid "add an additional keyword for the top-level file or directory (this 
option can be specified multiple times)"
+#: src/fs/gnunet-publish.c:903
+msgid ""
+"add an additional keyword for the top-level file or directory (this option "
+"can be specified multiple times)"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:843
+#: src/fs/gnunet-publish.c:907
 msgid "set the meta-data for the given TYPE to the given VALUE"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:846
-msgid "do not index, perform full insertion (stores entire file in encrypted 
form in GNUnet database)"
+#: src/fs/gnunet-publish.c:910
+msgid ""
+"do not index, perform full insertion (stores entire file in encrypted form "
+"in GNUnet database)"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:851
-msgid "specify ID of an updated version to be published in the future (for 
namespace insertions only)"
+#: src/fs/gnunet-publish.c:915
+msgid ""
+"specify ID of an updated version to be published in the future (for "
+"namespace insertions only)"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:859
+#: src/fs/gnunet-publish.c:923
 msgid "publish the files under the pseudonym NAME (place file into namespace)"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:865
-msgid "only simulate the process but do not do any actual publishing (useful 
to compute URIs)"
+#: src/fs/gnunet-publish.c:929
+msgid ""
+"only simulate the process but do not do any actual publishing (useful to "
+"compute URIs)"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:869
-msgid "set the ID of this version of the publication (for namespace insertions 
only)"
+#: src/fs/gnunet-publish.c:933
+msgid ""
+"set the ID of this version of the publication (for namespace insertions only)"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:873
-msgid "URI to be published (can be used instead of passing a file to add 
keywords to the file with the respective URI)"
+#: src/fs/gnunet-publish.c:937
+msgid ""
+"URI to be published (can be used instead of passing a file to add keywords "
+"to the file with the respective URI)"
 msgstr ""
 
-#: src/fs/gnunet-publish.c:889
+#: src/fs/gnunet-publish.c:953
 msgid "Publish a file or directory on GNUnet"
 msgstr ""
 
@@ -3324,99 +3561,138 @@
 msgid "Search GNUnet for files that were published on GNUnet"
 msgstr ""
 
-#: src/fs/gnunet-service-fs.c:271
+#: src/fs/gnunet-service-fs.c:274
 msgid "# running average P2P latency (ms)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs.c:326 src/fs/gnunet-service-fs.c:539
+#: src/fs/gnunet-service-fs.c:332 src/fs/gnunet-service-fs.c:595
 msgid "# Loopback routes suppressed"
 msgstr ""
 
-#: src/fs/gnunet-service-fs.c:639 src/hostlist/gnunet-daemon-hostlist.c:288
-#: src/topology/gnunet-daemon-topology.c:1254
-#: src/topology/gnunet-daemon-topology.c:1261
+#: src/fs/gnunet-service-fs.c:719
+msgid "FS service is lacking HOSTKEY configuration setting.  Exiting.\n"
+msgstr ""
+
+#: src/fs/gnunet-service-fs.c:745 src/hostlist/gnunet-daemon-hostlist.c:311
+#: src/sensordashboard/gnunet-service-sensordashboard.c:864
+#: src/sensordashboard/gnunet-service-sensordashboard.c:872
+#: src/topology/gnunet-daemon-topology.c:1287
+#: src/topology/gnunet-daemon-topology.c:1294
 #, c-format
 msgid "Failed to connect to `%s' service.\n"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:682
+#: src/fs/gnunet-service-fs_cadet_client.c:494
+msgid "# replies received via cadet"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cadet_client.c:508
+msgid "# replies received via cadet dropped"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cadet_server.c:260
+msgid "# Blocks transferred via cadet"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cadet_server.c:361
+msgid "# queries received via CADET not answered"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cadet_server.c:441
+msgid "# queries received via cadet"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cadet_server.c:485
+msgid "# cadet client connections rejected"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cadet_server.c:491
+#: src/fs/gnunet-service-fs_cadet_server.c:531
+msgid "# cadet connections active"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cp.c:735
 msgid "# migration stop messages received"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:686
+#: src/fs/gnunet-service-fs_cp.c:739
 #, c-format
 msgid "Migration of content to peer `%s' blocked for %s\n"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:721
+#: src/fs/gnunet-service-fs_cp.c:776
 msgid "# replies transmitted to other peers"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:727
+#: src/fs/gnunet-service-fs_cp.c:784
 msgid "# replies dropped"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:752 src/fs/gnunet-service-fs_cp.c:1301
+#: src/fs/gnunet-service-fs_cp.c:810 src/fs/gnunet-service-fs_cp.c:1404
 msgid "# P2P searches active"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:845
+#: src/fs/gnunet-service-fs_cp.c:915
 msgid "# artificial delays introduced (ms)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:898
+#: src/fs/gnunet-service-fs_cp.c:971
 msgid "# replies dropped due to type mismatch"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:906
+#: src/fs/gnunet-service-fs_cp.c:979
 msgid "# replies received for other peers"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:920
+#: src/fs/gnunet-service-fs_cp.c:993
 msgid "# replies dropped due to insufficient cover traffic"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:958
+#: src/fs/gnunet-service-fs_cp.c:1041
 msgid "# P2P searches destroyed due to ultimate reply"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1026
+#: src/fs/gnunet-service-fs_cp.c:1109
 msgid "# requests done for free (low load)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1051
+#: src/fs/gnunet-service-fs_cp.c:1134
 msgid "# request dropped, priority insufficient"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1061
+#: src/fs/gnunet-service-fs_cp.c:1144
 msgid "# requests done for a price (normal load)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1139
+#: src/fs/gnunet-service-fs_cp.c:1221
 msgid "# GET requests received (from other peers)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1173
+#: src/fs/gnunet-service-fs_cp.c:1256
 msgid "# requests dropped due to initiator not being connected"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1195
+#: src/fs/gnunet-service-fs_cp.c:1277
 msgid "# requests dropped due to missing reverse route"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1246
+#: src/fs/gnunet-service-fs_cp.c:1288
+msgid "# requests dropped due to full reply queue"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cp.c:1340
 msgid "# requests dropped due TTL underflow"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1270
+#: src/fs/gnunet-service-fs_cp.c:1365
 msgid "# requests dropped due to higher-TTL request"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1299
+#: src/fs/gnunet-service-fs_cp.c:1402
 msgid "# P2P query messages received and processed"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1670
+#: src/fs/gnunet-service-fs_cp.c:1841
 msgid "# migration stop messages sent"
 msgstr ""
 
@@ -3433,7 +3709,9 @@
 
 #: src/fs/gnunet-service-fs_indexing.c:237
 #, c-format
-msgid "Index request received for file `%s' is already indexed as `%s'.  
Permitting anyway.\n"
+msgid ""
+"Index request received for file `%s' is already indexed as `%s'.  Permitting "
+"anyway.\n"
 msgstr ""
 
 #: src/fs/gnunet-service-fs_indexing.c:275
@@ -3464,51 +3742,22 @@
 msgid "Indexed file `%s' changed at offset %llu\n"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_lc.c:202 src/fs/gnunet-service-fs_lc.c:368
+#: src/fs/gnunet-service-fs_lc.c:201 src/fs/gnunet-service-fs_lc.c:376
 msgid "# client searches active"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_lc.c:256
+#: src/fs/gnunet-service-fs_lc.c:259
 msgid "# replies received for local clients"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_lc.c:327
+#: src/fs/gnunet-service-fs_lc.c:330
 msgid "# client searches received"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_lc.c:362
+#: src/fs/gnunet-service-fs_lc.c:370
 msgid "# client searches updated (merged content seen list)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_mesh_client.c:484
-msgid "# replies received via mesh"
-msgstr ""
-
-#: src/fs/gnunet-service-fs_mesh_client.c:498
-msgid "# replies received via mesh dropped"
-msgstr ""
-
-#: src/fs/gnunet-service-fs_mesh_server.c:260
-msgid "# Blocks transferred via mesh"
-msgstr ""
-
-#: src/fs/gnunet-service-fs_mesh_server.c:352
-msgid "# queries received via mesh not answered"
-msgstr ""
-
-#: src/fs/gnunet-service-fs_mesh_server.c:432
-msgid "# queries received via mesh"
-msgstr ""
-
-#: src/fs/gnunet-service-fs_mesh_server.c:476
-msgid "# mesh client connections rejected"
-msgstr ""
-
-#: src/fs/gnunet-service-fs_mesh_server.c:482
-#: src/fs/gnunet-service-fs_mesh_server.c:522
-msgid "# mesh connections active"
-msgstr ""
-
 #: src/fs/gnunet-service-fs_pe.c:269
 msgid "# average retransmission delay (ms)"
 msgstr ""
@@ -3550,103 +3799,103 @@
 msgid "# Pending requests active"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:814
+#: src/fs/gnunet-service-fs_pr.c:820
 msgid "# replies received and matched"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:844
+#: src/fs/gnunet-service-fs_pr.c:857
 msgid "# duplicate replies discarded (bloomfilter)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:853
+#: src/fs/gnunet-service-fs_pr.c:866
 msgid "# irrelevant replies discarded"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:867
+#: src/fs/gnunet-service-fs_pr.c:881
 #, c-format
 msgid "Unsupported block type %u\n"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:880
+#: src/fs/gnunet-service-fs_pr.c:898
 msgid "# results found locally"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1001
+#: src/fs/gnunet-service-fs_pr.c:1028
 msgid "# Datastore `PUT' failures"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1029
+#: src/fs/gnunet-service-fs_pr.c:1056
 msgid "# storage requests dropped due to high load"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1064
+#: src/fs/gnunet-service-fs_pr.c:1094
 msgid "# Replies received from DHT"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1192
-msgid "# Replies received from MESH"
+#: src/fs/gnunet-service-fs_pr.c:1226
+msgid "# Replies received from CADET"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1244
+#: src/fs/gnunet-service-fs_pr.c:1279
 #, c-format
 msgid "Datastore lookup already took %s!\n"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1264
+#: src/fs/gnunet-service-fs_pr.c:1301
 #, c-format
 msgid "On-demand lookup already took %s!\n"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1311
+#: src/fs/gnunet-service-fs_pr.c:1353
 msgid "# Datastore lookups concluded (no results)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1326
+#: src/fs/gnunet-service-fs_pr.c:1368
 msgid "# Datastore lookups concluded (seen all)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1335
+#: src/fs/gnunet-service-fs_pr.c:1377
 msgid "# Datastore lookups aborted (more than MAX_RESULTS)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1350
+#: src/fs/gnunet-service-fs_pr.c:1392
 msgid "# requested DBLOCK or IBLOCK not found"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1364
+#: src/fs/gnunet-service-fs_pr.c:1406
 msgid "# on-demand blocks matched requests"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1377
+#: src/fs/gnunet-service-fs_pr.c:1419
 msgid "# on-demand lookups performed successfully"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1382
+#: src/fs/gnunet-service-fs_pr.c:1424
 msgid "# on-demand lookups failed"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1409 src/fs/gnunet-service-fs_pr.c:1449
-#: src/fs/gnunet-service-fs_pr.c:1590
+#: src/fs/gnunet-service-fs_pr.c:1451 src/fs/gnunet-service-fs_pr.c:1491
+#: src/fs/gnunet-service-fs_pr.c:1660
 msgid "# Datastore lookups concluded (error queueing)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1467
+#: src/fs/gnunet-service-fs_pr.c:1510
 msgid "# Datastore lookups concluded (found last result)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1478
+#: src/fs/gnunet-service-fs_pr.c:1522
 msgid "# Datastore lookups concluded (load too high)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1566
+#: src/fs/gnunet-service-fs_pr.c:1636
 msgid "# Datastore lookups initiated"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_pr.c:1651
+#: src/fs/gnunet-service-fs_pr.c:1725
 msgid "# GAP PUT messages received"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_push.c:631
+#: src/fs/gnunet-service-fs_push.c:672
 msgid "time required, content pushing disabled"
 msgstr ""
 
@@ -3686,7 +3935,7 @@
 msgid "Refusing `%s' request to HTTP server\n"
 msgstr ""
 
-#: src/gns/gnunet-bcd.c:355 src/hostlist/hostlist-server.c:567
+#: src/gns/gnunet-bcd.c:355 src/hostlist/gnunet-daemon-hostlist_server.c:759
 #, c-format
 msgid "Invalid port number %llu.  Exiting.\n"
 msgstr ""
@@ -3709,117 +3958,128 @@
 msgid "GNUnet HTTP server to create business cards"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:228
+#: src/gns/gnunet-dns2gns.c:234
 msgid "Failed to pack DNS response into UDP packet!\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:400
+#: src/gns/gnunet-dns2gns.c:406
 #, c-format
 msgid "Cannot parse DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:416
+#: src/gns/gnunet-dns2gns.c:422
 #, c-format
 msgid "Received malformed DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:424
+#: src/gns/gnunet-dns2gns.c:430
 #, c-format
 msgid "Received unsupported DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:701
+#: src/gns/gnunet-dns2gns.c:708
 msgid "No ego configured for `dns2gns` subsystem\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:727
+#: src/gns/gnunet-dns2gns.c:734
 msgid "No DNS server specified!\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:749
+#: src/gns/gnunet-dns2gns.c:756
 msgid "No valid GNS zone specified!\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:770
+#: src/gns/gnunet-dns2gns.c:777
 msgid "IP of recursive DNS resolver to use (required)"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:773
+#: src/gns/gnunet-dns2gns.c:780
 msgid "Authoritative FCFS suffix to use (optional); default: fcfs.zkey.eu"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:776
+#: src/gns/gnunet-dns2gns.c:783
 msgid "Authoritative DNS suffix to use (optional); default: zkey.eu"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:779
+#: src/gns/gnunet-dns2gns.c:786
 msgid "UDP port to listen on for inbound DNS requests; default: 53"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:782
+#: src/gns/gnunet-dns2gns.c:789
 msgid "Public key of the GNS zone to use (overrides default)"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:795
+#: src/gns/gnunet-dns2gns.c:802
 msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:227
+#: src/gns/gnunet-gns.c:215 src/gns/plugin_rest_gns.c:334
 #, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:233
+#, c-format
 msgid "Please specify name to lookup!\n"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:308
+#: src/gns/gnunet-gns.c:314
 #, c-format
 msgid "Ego for `%s' not found, cannot perform lookup.\n"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:347 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/gnunet-gns.c:353 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/plugin_rest_gns.c:459
 #, c-format
-msgid "Ego for `gns-master' not found, cannot perform lookup.  Did you run 
gnunet-gns-import.sh?\n"
+msgid ""
+"Ego for `gns-master' not found, cannot perform lookup.  Did you run gnunet-"
+"gns-import.sh?\n"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:386 src/gns/gnunet-gns-helper-service-w32.c:828
+#: src/gns/gnunet-gns.c:392 src/gns/gnunet-gns-helper-service-w32.c:828
 #, c-format
 msgid "Failed to connect to GNS\n"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:399
+#: src/gns/gnunet-gns.c:405
 #, c-format
 msgid "Public key `%s' is not well-formed\n"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:449
+#: src/gns/gnunet-gns.c:455
 msgid "Lookup a record for the given name"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:452
+#: src/gns/gnunet-gns.c:458
 msgid "Specify the type of the record to lookup"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:455
+#: src/gns/gnunet-gns.c:461
 msgid "Specify timeout for the lookup"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:458
+#: src/gns/gnunet-gns.c:464
 msgid "No unneeded output"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:461
+#: src/gns/gnunet-gns.c:467
 msgid "Specify the public key of the zone to lookup the record in"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:464
+#: src/gns/gnunet-gns.c:470
 msgid "Specify the name of the ego of the zone to lookup the record in"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:478
+#: src/gns/gnunet-gns.c:484
 msgid "GNUnet GNS resolver tool"
 msgstr ""
 
 #: src/gns/gnunet-gns-helper-service-w32.c:768
 #, c-format
-msgid "Ego for `gns-short' not found. This is not really fatal, but i'll 
pretend that it is and refuse to perform a lookup.  Did you run 
gnunet-gns-import.sh?\n"
+msgid ""
+"Ego for `gns-short' not found. This is not really fatal, but i'll pretend "
+"that it is and refuse to perform a lookup.  Did you run gnunet-gns-import."
+"sh?\n"
 msgstr ""
 
 #: src/gns/gnunet-gns-helper-service-w32.c:838
@@ -3831,139 +4091,143 @@
 msgid "This program will import some GNS authorities into your GNS namestore."
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:105 src/hostlist/hostlist-client.c:469
-#: src/hostlist/hostlist-client.c:683 src/hostlist/hostlist-client.c:689
-#: src/hostlist/hostlist-client.c:741 src/hostlist/hostlist-client.c:750
-#: src/hostlist/hostlist-client.c:871 src/hostlist/hostlist-client.c:963
-#: src/hostlist/hostlist-client.c:968
-#: src/transport/plugin_transport_http_client.c:1062
-#: src/transport/plugin_transport_http_client.c:1077
+#: src/gns/gnunet-gns-proxy.c:105
+#: src/hostlist/gnunet-daemon-hostlist_client.c:524
+#: src/hostlist/gnunet-daemon-hostlist_client.c:741
+#: src/hostlist/gnunet-daemon-hostlist_client.c:747
+#: src/hostlist/gnunet-daemon-hostlist_client.c:800
+#: src/hostlist/gnunet-daemon-hostlist_client.c:809
+#: src/hostlist/gnunet-daemon-hostlist_client.c:931
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1026
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1031
+#: src/transport/plugin_transport_http_client.c:595
+#: src/transport/plugin_transport_http_client.c:613
 #, c-format
 msgid "%s failed at %s:%d: `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:833
+#: src/gns/gnunet-gns-proxy.c:842
 #, c-format
 msgid "Unsupported CURL SSL backend %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:856
+#: src/gns/gnunet-gns-proxy.c:865
 #, c-format
 msgid "Failed to fetch CN from cert: %s\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:879
+#: src/gns/gnunet-gns-proxy.c:888
 #, c-format
 msgid "Failed to initialize DANE: %s\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:892
+#: src/gns/gnunet-gns-proxy.c:901
 #, c-format
 msgid "Failed to parse DANE record: %s\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:907
+#: src/gns/gnunet-gns-proxy.c:916
 #, c-format
 msgid "Failed to verify TLS connection using DANE: %s\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:917
+#: src/gns/gnunet-gns-proxy.c:926
 #, c-format
 msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:941
+#: src/gns/gnunet-gns-proxy.c:950
 #, c-format
 msgid "SSL certificate subject name (%s) does not match `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1086
+#: src/gns/gnunet-gns-proxy.c:1095
 #, c-format
 msgid "Cookie domain `%s' supplied by server is invalid\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1602
+#: src/gns/gnunet-gns-proxy.c:1630
 #, c-format
 msgid "Unsupported HTTP method `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1973
+#: src/gns/gnunet-gns-proxy.c:2002
 #, c-format
 msgid "Unable to import private key from file `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2003
+#: src/gns/gnunet-gns-proxy.c:2032
 #, c-format
 msgid "Unable to import certificate %s\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2177
+#: src/gns/gnunet-gns-proxy.c:2206
 #, c-format
 msgid "Failed to start HTTPS server for `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2196
+#: src/gns/gnunet-gns-proxy.c:2225 src/rest/gnunet-rest-server.c:529
 msgid "Failed to pass client to MHD\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2504
+#: src/gns/gnunet-gns-proxy.c:2547
 #, c-format
 msgid "Unsupported socks version %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2533
+#: src/gns/gnunet-gns-proxy.c:2576
 #, c-format
 msgid "Unsupported socks command %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2551 src/gns/gnunet-gns-proxy.c:2580
+#: src/gns/gnunet-gns-proxy.c:2594 src/gns/gnunet-gns-proxy.c:2623
 msgid "SSL connection to plain IPv4 address requested\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2631
+#: src/gns/gnunet-gns-proxy.c:2674
 #, c-format
 msgid "Unsupported socks address type %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2970
+#: src/gns/gnunet-gns-proxy.c:3013
 msgid "No ego configured for `shorten-zone`\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3010
+#: src/gns/gnunet-gns-proxy.c:3053
 #, c-format
 msgid "No ego configured for `%s`\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3072
+#: src/gns/gnunet-gns-proxy.c:3115
 #, c-format
 msgid "Failed to load SSL/TLS key and certificate from `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3113
+#: src/gns/gnunet-gns-proxy.c:3156
 msgid "listen on specified port (default: 7777)"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3116
+#: src/gns/gnunet-gns-proxy.c:3159
 msgid "pem file to use as CA"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3135
+#: src/gns/gnunet-gns-proxy.c:3178
 msgid "GNUnet GNS proxy"
 msgstr ""
 
-#: src/gns/gnunet-service-gns.c:862
+#: src/gns/gnunet-service-gns.c:864
 msgid "Failed to connect to the namestore!\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns.c:870
+#: src/gns/gnunet-service-gns.c:872
 msgid "Failed to connect to the namecache!\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns.c:903
+#: src/gns/gnunet-service-gns.c:905
 msgid "Could not connect to DHT!\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns.c:919
+#: src/gns/gnunet-service-gns.c:921
 msgid "valid public key required"
 msgstr ""
 
@@ -3975,436 +4239,503 @@
 msgid "Failed to connect to the DNS service!\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:816
+#: src/gns/gnunet-service-gns_resolver.c:650
+#, c-format
+msgid "Protocol `%s' unknown, skipping labels.\n"
+msgstr ""
+
+#: src/gns/gnunet-service-gns_resolver.c:661
+#, c-format
+msgid "Service `%s' unknown for protocol `%s', skipping labels.\n"
+msgstr ""
+
+#: src/gns/gnunet-service-gns_resolver.c:854
 msgid "Failed to parse DNS response\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:958
+#: src/gns/gnunet-service-gns_resolver.c:996
 #, c-format
 msgid "Skipping record of unsupported type %d\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:1317
+#: src/gns/gnunet-service-gns_resolver.c:1356
 #, c-format
 msgid "GNS lookup resulted in DNS name that is too long (`%s')\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:1817
+#: src/gns/gnunet-service-gns_resolver.c:1891
 msgid "GNS lookup recursion failed (no delegation record found)\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:1841
+#: src/gns/gnunet-service-gns_resolver.c:1915
 #, c-format
 msgid "Failed to cache GNS resolution: %s\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:2123
+#: src/gns/gnunet-service-gns_resolver.c:2197
 #, c-format
 msgid "Zone %s was revoked, resolution fails\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:2272
+#: src/gns/gnunet-service-gns_resolver.c:2346
 #, c-format
 msgid "Hostname `%s' is not well-formed, resolution fails\n"
 msgstr ""
 
-#: src/gns/plugin_gnsrecord_gns.c:151
+#: src/gns/plugin_gnsrecord_gns.c:172
 #, c-format
 msgid "Unable to parse PKEY record `%s'\n"
 msgstr ""
 
-#: src/gns/plugin_gnsrecord_gns.c:180
+#: src/gns/plugin_gnsrecord_gns.c:201
 #, c-format
 msgid "Unable to parse GNS2DNS record `%s'\n"
 msgstr ""
 
-#: src/gns/plugin_gnsrecord_gns.c:201
+#: src/gns/plugin_gnsrecord_gns.c:222
 #, c-format
 msgid "Failed to serialize GNS2DNS record with value `%s'\n"
 msgstr ""
 
-#: src/gns/plugin_gnsrecord_gns.c:217
+#: src/gns/plugin_gnsrecord_gns.c:245
 #, c-format
 msgid "Unable to parse VPN record string `%s'\n"
 msgstr ""
 
-#: src/gnsrecord/plugin_gnsrecord_dns.c:293
+#: src/gns/plugin_gnsrecord_gns.c:280
 #, c-format
+msgid "Unable to parse BOX record string `%s'\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:422
+msgid "Ego for not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:652
+msgid "GNS REST API initialized\n"
+msgstr ""
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:291
+#, c-format
 msgid "Unable to parse IPv4 address `%s'\n"
 msgstr ""
 
-#: src/gnsrecord/plugin_gnsrecord_dns.c:314
+#: src/gnsrecord/plugin_gnsrecord_dns.c:312
 #, c-format
 msgid "Failed to serialize NS record with value `%s'\n"
 msgstr ""
 
-#: src/gnsrecord/plugin_gnsrecord_dns.c:336
+#: src/gnsrecord/plugin_gnsrecord_dns.c:334
 #, c-format
 msgid "Failed to serialize CNAME record with value `%s'\n"
 msgstr ""
 
-#: src/gnsrecord/plugin_gnsrecord_dns.c:420
+#: src/gnsrecord/plugin_gnsrecord_dns.c:418
 #, c-format
 msgid "Failed to serialize CERT record with %u bytes\n"
 msgstr ""
 
-#: src/gnsrecord/plugin_gnsrecord_dns.c:452
+#: src/gnsrecord/plugin_gnsrecord_dns.c:455
 #, c-format
 msgid "Unable to parse SOA record `%s'\n"
 msgstr ""
 
-#: src/gnsrecord/plugin_gnsrecord_dns.c:471
+#: src/gnsrecord/plugin_gnsrecord_dns.c:474
 #, c-format
 msgid "Failed to serialize SOA record with mname `%s' and rname `%s'\n"
 msgstr ""
 
-#: src/gnsrecord/plugin_gnsrecord_dns.c:494
+#: src/gnsrecord/plugin_gnsrecord_dns.c:497
 #, c-format
 msgid "Failed to serialize PTR record with value `%s'\n"
 msgstr ""
 
-#: src/gnsrecord/plugin_gnsrecord_dns.c:514
+#: src/gnsrecord/plugin_gnsrecord_dns.c:520
 #, c-format
 msgid "Unable to parse MX record `%s'\n"
 msgstr ""
 
-#: src/gnsrecord/plugin_gnsrecord_dns.c:529
+#: src/gnsrecord/plugin_gnsrecord_dns.c:535
 #, c-format
 msgid "Failed to serialize MX record with hostname `%s'\n"
 msgstr ""
 
-#: src/gnsrecord/plugin_gnsrecord_dns.c:549
+#: src/gnsrecord/plugin_gnsrecord_dns.c:562
 #, c-format
+msgid "Unable to parse SRV record `%s'\n"
+msgstr ""
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:578
+#, c-format
+msgid "Failed to serialize SRV record with target `%s'\n"
+msgstr ""
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:595
+#, c-format
 msgid "Unable to parse IPv6 address `%s'\n"
 msgstr ""
 
-#: src/gnsrecord/plugin_gnsrecord_dns.c:567
+#: src/gnsrecord/plugin_gnsrecord_dns.c:619
+#: src/gnsrecord/plugin_gnsrecord_dns.c:635
 #, c-format
 msgid "Unable to parse TLSA record string `%s'\n"
 msgstr ""
 
-#: src/hello/gnunet-hello.c:123
+#: src/hello/gnunet-hello.c:126
 msgid "Call with name of HELLO file to modify.\n"
 msgstr ""
 
-#: src/hello/gnunet-hello.c:129
+#: src/hello/gnunet-hello.c:132
 #, c-format
 msgid "Error accessing file `%s': %s\n"
 msgstr ""
 
-#: src/hello/gnunet-hello.c:137
+#: src/hello/gnunet-hello.c:140
 #, c-format
 msgid "File `%s' is too big to be a HELLO\n"
 msgstr ""
 
-#: src/hello/gnunet-hello.c:144
+#: src/hello/gnunet-hello.c:147
 #, c-format
 msgid "File `%s' is too small to be a HELLO\n"
 msgstr ""
 
-#: src/hello/gnunet-hello.c:154 src/hello/gnunet-hello.c:183
+#: src/hello/gnunet-hello.c:157 src/hello/gnunet-hello.c:196
 #, c-format
 msgid "Error opening file `%s': %s\n"
 msgstr ""
 
-#: src/hello/gnunet-hello.c:170
+#: src/hello/gnunet-hello.c:173
 #, c-format
 msgid "Did not find well-formed HELLO in file `%s'\n"
 msgstr ""
 
-#: src/hello/gnunet-hello.c:195
+#: src/hello/gnunet-hello.c:208
 #, c-format
 msgid "Error writing HELLO to file `%s': %s\n"
 msgstr ""
 
-#: src/hello/gnunet-hello.c:203
+#: src/hello/gnunet-hello.c:216
 #, c-format
 msgid "Modified %u addresses \n"
 msgstr ""
 
-#: src/hello/hello.c:944
+#: src/hello/hello.c:955
 msgid "Failed to parse HELLO message: missing expiration time\n"
 msgstr ""
 
-#: src/hello/hello.c:953
+#: src/hello/hello.c:964
 msgid "Failed to parse HELLO message: invalid expiration time\n"
 msgstr ""
 
-#: src/hello/hello.c:963
+#: src/hello/hello.c:974
 msgid "Failed to parse HELLO message: malformed\n"
 msgstr ""
 
-#: src/hello/hello.c:973
+#: src/hello/hello.c:984
 msgid "Failed to parse HELLO message: missing transport plugin\n"
 msgstr ""
 
-#: src/hello/hello.c:990
+#: src/hello/hello.c:1002
 #, c-format
-msgid "Plugin `%s' not found\n"
+msgid "Plugin `%s' not found, skipping address\n"
 msgstr ""
 
-#: src/hello/hello.c:999
+#: src/hello/hello.c:1010
 #, c-format
 msgid "Plugin `%s' does not support URIs yet\n"
 msgstr ""
 
-#: src/hello/hello.c:1018
+#: src/hello/hello.c:1025
 #, c-format
 msgid "Failed to parse `%s' as an address for plugin `%s'\n"
 msgstr ""
 
-#: src/hostlist/gnunet-daemon-hostlist.c:259
-msgid "None of the functions for the hostlist daemon were enabled.  I have no 
reason to run!\n"
+#: src/hello/hello.c:1098
+#, c-format
+msgid "HELLO URI contained %u addresses, added %u addresses\n"
 msgstr ""
 
-#: src/hostlist/gnunet-daemon-hostlist.c:308
+#: src/hostlist/gnunet-daemon-hostlist.c:274
+msgid ""
+"None of the functions for the hostlist daemon were enabled.  I have no "
+"reason to run!\n"
+msgstr ""
+
+#: src/hostlist/gnunet-daemon-hostlist.c:331
 msgid "advertise our hostlist to other peers"
 msgstr ""
 
-#: src/hostlist/gnunet-daemon-hostlist.c:313
-msgid "bootstrap using hostlists (it is highly recommended that you always use 
this option)"
+#: src/hostlist/gnunet-daemon-hostlist.c:336
+msgid ""
+"bootstrap using hostlists (it is highly recommended that you always use this "
+"option)"
 msgstr ""
 
-#: src/hostlist/gnunet-daemon-hostlist.c:316
+#: src/hostlist/gnunet-daemon-hostlist.c:339
 msgid "enable learning about hostlist servers from other peers"
 msgstr ""
 
-#: src/hostlist/gnunet-daemon-hostlist.c:320
+#: src/hostlist/gnunet-daemon-hostlist.c:343
 msgid "provide a hostlist server"
 msgstr ""
 
-#: src/hostlist/gnunet-daemon-hostlist.c:335
+#: src/hostlist/gnunet-daemon-hostlist.c:359
 msgid "GNUnet hostlist server and client"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:288
+#: src/hostlist/gnunet-daemon-hostlist_client.c:343
 msgid "# bytes downloaded from hostlist servers"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:309 src/hostlist/hostlist-client.c:339
+#: src/hostlist/gnunet-daemon-hostlist_client.c:364
+#: src/hostlist/gnunet-daemon-hostlist_client.c:394
 msgid "# invalid HELLOs downloaded from hostlist servers"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:312 src/hostlist/hostlist-client.c:342
+#: src/hostlist/gnunet-daemon-hostlist_client.c:367
+#: src/hostlist/gnunet-daemon-hostlist_client.c:397
 #, c-format
 msgid "Invalid `%s' message received from hostlist at `%s'\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:330
+#: src/hostlist/gnunet-daemon-hostlist_client.c:385
 msgid "# valid HELLOs downloaded from hostlist servers"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:592 src/hostlist/hostlist-client.c:1333
+#: src/hostlist/gnunet-daemon-hostlist_client.c:650
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1402
 msgid "# advertised hostlist URIs"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:622
+#: src/hostlist/gnunet-daemon-hostlist_client.c:680
 #, c-format
 msgid "# advertised URI `%s' downloaded"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:664
+#: src/hostlist/gnunet-daemon-hostlist_client.c:722
 #, c-format
-msgid "Advertised hostlist with URI `%s' could not be downloaded. Advertised 
URI gets dismissed.\n"
+msgid ""
+"Advertised hostlist with URI `%s' could not be downloaded. Advertised URI "
+"gets dismissed.\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:802
+#: src/hostlist/gnunet-daemon-hostlist_client.c:862
 #, c-format
 msgid "Timeout trying to download hostlist from `%s'\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:816
+#: src/hostlist/gnunet-daemon-hostlist_client.c:876
 #, c-format
 msgid "Download limit of %u bytes exceeded, stopping download\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:836
+#: src/hostlist/gnunet-daemon-hostlist_client.c:896
 #, c-format
 msgid "Download of hostlist from `%s' failed: `%s'\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:842
+#: src/hostlist/gnunet-daemon-hostlist_client.c:902
 #, c-format
 msgid "Download of hostlist `%s' completed.\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:850
+#: src/hostlist/gnunet-daemon-hostlist_client.c:910
 #, c-format
 msgid "Adding successfully tested hostlist `%s' datastore.\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:903
+#: src/hostlist/gnunet-daemon-hostlist_client.c:963
 #, c-format
 msgid "Bootstrapping using hostlist at `%s'.\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:911
+#: src/hostlist/gnunet-daemon-hostlist_client.c:971
 msgid "# hostlist downloads initiated"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1040 src/hostlist/hostlist-client.c:1506
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1103
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1655
 msgid "# milliseconds between hostlist downloads"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1049
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1112
 #, c-format
 msgid "Have %u/%u connections.  Will consider downloading hostlist in %s\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1109 src/hostlist/hostlist-client.c:1125
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1172
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1188
 msgid "# active connections"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1280
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1348
 #, c-format
 msgid "Loading saved hostlist entries from file `%s' \n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1285
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1353
 #, c-format
 msgid "Hostlist file `%s' does not exist\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1296
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1362
 #, c-format
 msgid "Could not open file `%s' for reading to load hostlists: %s\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1329
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1396
 #, c-format
 msgid "%u hostlist URIs loaded from file\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1331
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1399
 msgid "# hostlist URIs read from file"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1376
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1445
 #, c-format
 msgid "Could not open file `%s' for writing to save hostlists: %s\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1381
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1452
 #, c-format
 msgid "Writing %u hostlist URIs to `%s'\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1405 src/hostlist/hostlist-client.c:1422
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1476
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1493
 #, c-format
 msgid "Error writing hostlist URIs to file `%s'\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1417
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1488
 msgid "# hostlist URIs written to file"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1471
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1588
+#: src/transport/plugin_transport_http_client.c:2265
+#, c-format
+msgid "Invalid proxy type: `%s', disabling proxy! Check configuration!\n"
+msgstr ""
+
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1617
 msgid "Learning is enabled on this peer\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1483
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1630
 msgid "Learning is not enabled on this peer\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1495
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1641
 #, c-format
-msgid "Since learning is not enabled on this peer, hostlist file `%s' was 
removed\n"
+msgid ""
+"Since learning is not enabled on this peer, hostlist file `%s' was removed\n"
 msgstr ""
 
-#: src/hostlist/hostlist-client.c:1499
-#, c-format
-msgid "Hostlist file `%s' could not be removed\n"
-msgstr ""
-
-#: src/hostlist/hostlist-server.c:137
+#: src/hostlist/gnunet-daemon-hostlist_server.c:181
 msgid "bytes in hostlist"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:161
+#: src/hostlist/gnunet-daemon-hostlist_server.c:206
 msgid "expired addresses encountered"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:189 src/hostlist/hostlist-server.c:425
-#: src/peerinfo-tool/gnunet-peerinfo.c:350
-#: src/peerinfo-tool/gnunet-peerinfo.c:419
-#: src/peerinfo-tool/gnunet-peerinfo.c:490
-#: src/topology/gnunet-daemon-topology.c:925
+#: src/hostlist/gnunet-daemon-hostlist_server.c:241
+#: src/hostlist/gnunet-daemon-hostlist_server.c:590
+#: src/peerinfo-tool/gnunet-peerinfo.c:382
+#: src/peerinfo-tool/gnunet-peerinfo.c:531
+#: src/topology/gnunet-daemon-topology.c:952
 #, c-format
 msgid "Error in communication with PEERINFO service: %s\n"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:210
+#: src/hostlist/gnunet-daemon-hostlist_server.c:265
 msgid "HELLOs without addresses encountered (ignored)"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:224
+#: src/hostlist/gnunet-daemon-hostlist_server.c:282
 msgid "bytes not included in hostlist (size limit)"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:268
+#: src/hostlist/gnunet-daemon-hostlist_server.c:386
 #, c-format
 msgid "Refusing `%s' request to hostlist server\n"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:271
+#: src/hostlist/gnunet-daemon-hostlist_server.c:389
 msgid "hostlist requests refused (not HTTP GET)"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:284
+#: src/hostlist/gnunet-daemon-hostlist_server.c:403
 #, c-format
 msgid "Refusing `%s' request with %llu bytes of upload data\n"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:288
+#: src/hostlist/gnunet-daemon-hostlist_server.c:407
 msgid "hostlist requests refused (upload data)"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:296
+#: src/hostlist/gnunet-daemon-hostlist_server.c:414
 msgid "Could not handle hostlist request since I do not have a response yet\n"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:299
+#: src/hostlist/gnunet-daemon-hostlist_server.c:417
 msgid "hostlist requests refused (not ready)"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:303
+#: src/hostlist/gnunet-daemon-hostlist_server.c:422
 msgid "Received request for our hostlist\n"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:304
+#: src/hostlist/gnunet-daemon-hostlist_server.c:424
 msgid "hostlist requests processed"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:346
+#: src/hostlist/gnunet-daemon-hostlist_server.c:485
 msgid "# hostlist advertisements send"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:390
+#: src/hostlist/gnunet-daemon-hostlist_server.c:535
 msgid "Advertisement message could not be queued by core\n"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:557 src/peerinfo-tool/gnunet-peerinfo.c:639
-#: src/transport/gnunet-service-transport.c:1114
+#: src/hostlist/gnunet-daemon-hostlist_server.c:747
+#: src/peerinfo-tool/gnunet-peerinfo.c:736
+#: src/transport/gnunet-service-transport.c:852
 msgid "Could not access PEERINFO service.  Exiting.\n"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:576
+#: src/hostlist/gnunet-daemon-hostlist_server.c:771
 #, c-format
 msgid "Hostlist service starts on %s:%llu\n"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:590
+#: src/hostlist/gnunet-daemon-hostlist_server.c:786
 #, c-format
 msgid "Address to obtain hostlist: `%s'\n"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:630
+#: src/hostlist/gnunet-daemon-hostlist_server.c:799
+msgid "BINDTOIP does not a valid IPv4 address! Ignoring BINDTOIPV4.\n"
+msgstr ""
+
+#: src/hostlist/gnunet-daemon-hostlist_server.c:812
+msgid "BINDTOIP does not a valid IPv4 address! Ignoring BINDTOIPV6.\n"
+msgstr ""
+
+#: src/hostlist/gnunet-daemon-hostlist_server.c:833
 #, c-format
-msgid "`%s' is not a valid IP address! Ignoring BINDTOIP.\n"
+msgid "`%s' is not a valid IPv4 address! Ignoring BINDTOIPV4.\n"
 msgstr ""
 
-#: src/hostlist/hostlist-server.c:673
+#: src/hostlist/gnunet-daemon-hostlist_server.c:853
 #, c-format
+msgid "`%s' is not a valid IPv6 address! Ignoring BINDTOIPV6.\n"
+msgstr ""
+
+#: src/hostlist/gnunet-daemon-hostlist_server.c:893
+#, c-format
 msgid "Could not start hostlist HTTP server on port %u\n"
 msgstr ""
 
@@ -4431,7 +4762,8 @@
 msgstr ""
 
 #: src/identity/gnunet-identity.c:336
-msgid "set default identity to EGO for a subsystem SUBSYSTEM (use together 
with -s)"
+msgid ""
+"set default identity to EGO for a subsystem SUBSYSTEM (use together with -s)"
 msgstr ""
 
 #: src/identity/gnunet-identity.c:339
@@ -4439,7 +4771,8 @@
 msgstr ""
 
 #: src/identity/gnunet-identity.c:342
-msgid "set default identity to EGO for a subsystem SUBSYSTEM (use together 
with -e)"
+msgid ""
+"set default identity to EGO for a subsystem SUBSYSTEM (use together with -e)"
 msgstr ""
 
 #: src/identity/gnunet-identity.c:351
@@ -4493,53 +4826,10 @@
 msgid "Failed to create directory `%s' for storing egos\n"
 msgstr ""
 
-#: src/mesh/gnunet-mesh.c:357
-#, c-format
-msgid "Invalid target `%s'\n"
+#: src/identity/plugin_rest_identity.c:803
+msgid "Identity REST API initialized\n"
 msgstr ""
 
-#: src/mesh/gnunet-mesh.c:607
-#, c-format
-msgid "Invalid peer ID `%s'\n"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:650
-#, c-format
-msgid "Invalid tunnel owner `%s'\n"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:716
-msgid "You must NOT give a TARGETwhen using 'request all' options\n"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:807
-msgid "provide information about a particular connection"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:810
-msgid "activate echo mode"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:816
-msgid "port to listen to (default; 0)"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:819 src/mesh/gnunet-mesh.c:822
-msgid "provide information about all peers"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:825
-msgid "provide information about a particular tunnel"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:828
-msgid "provide information about all tunnels"
-msgstr ""
-
-#: src/mesh/gnunet-service-mesh_peer.c:390
-msgid "Wrong CORE service\n"
-msgstr ""
-
 #: src/mysql/mysql.c:174
 #, c-format
 msgid "Trying to use file `%s' for MySQL configuration.\n"
@@ -4565,9 +4855,9 @@
 msgid "You must specify which zone should be accessed\n"
 msgstr ""
 
-#: src/namecache/gnunet-namecache.c:195 src/namestore/gnunet-namestore.c:695
+#: src/namecache/gnunet-namecache.c:195
 #, c-format
-msgid "Invalid public key for reverse lookup `%s'\n"
+msgid "Invalid public key for zone `%s'\n"
 msgstr ""
 
 #: src/namecache/gnunet-namecache.c:203
@@ -4575,7 +4865,7 @@
 msgid "You must specify a name\n"
 msgstr ""
 
-#: src/namecache/gnunet-namecache.c:234 src/namestore/gnunet-namestore.c:931
+#: src/namecache/gnunet-namecache.c:234 src/namestore/gnunet-namestore.c:1084
 msgid "name of the record to add/delete/display"
 msgstr ""
 
@@ -4583,7 +4873,7 @@
 msgid "spezifies the public key of the zone to look in"
 msgstr ""
 
-#: src/namecache/gnunet-namecache.c:248 src/namestore/gnunet-namestore.c:963
+#: src/namecache/gnunet-namecache.c:248 src/namestore/gnunet-namestore.c:1116
 msgid "GNUnet zone manipulation tool"
 msgstr ""
 
@@ -4602,194 +4892,236 @@
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:332
+#: src/namestore/plugin_rest_namestore.c:505
 #, c-format
 msgid "Deleting record failed, record does not exist%s%s\n"
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:339
+#: src/namestore/plugin_rest_namestore.c:514
 #, c-format
 msgid "Deleting record failed%s%s\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:558
+#: src/namestore/gnunet-namestore.c:477 src/namestore/gnunet-namestore.c:485
+#: src/namestore/gnunet-namestore.c:493
 #, c-format
+msgid "A %s record exists already under `%s', no other records can be added.\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore.c:507 src/namestore/gnunet-namestore.c:519
+#: src/namestore/gnunet-namestore.c:531
+#, c-format
+msgid "Records already exist under `%s', cannot add `%s' record.\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore.c:628
+#: src/namestore/plugin_rest_namestore.c:538
+#, c-format
+msgid "There are no records under label `%s' that could be deleted.\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore.c:667
+#, c-format
+msgid ""
+"There are no records under label `%s' that match the request for deletion.\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore.c:708
+#, c-format
 msgid "No options given\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:569
-#: src/namestore/gnunet-namestore-fcfsd.c:970
+#: src/namestore/gnunet-namestore.c:719
+#: src/namestore/gnunet-namestore-fcfsd.c:984
+#: src/namestore/plugin_rest_namestore.c:821
 msgid "Failed to connect to namestore\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:577 src/namestore/gnunet-namestore.c:586
-#: src/namestore/gnunet-namestore.c:603 src/namestore/gnunet-namestore.c:625
-#: src/namestore/gnunet-namestore.c:665
+#: src/namestore/gnunet-namestore.c:727 src/namestore/gnunet-namestore.c:736
+#: src/namestore/gnunet-namestore.c:753 src/namestore/gnunet-namestore.c:775
+#: src/namestore/gnunet-namestore.c:815
 #, c-format
 msgid "Missing option `%s' for operation `%s'\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:578 src/namestore/gnunet-namestore.c:587
-#: src/namestore/gnunet-namestore.c:604 src/namestore/gnunet-namestore.c:626
+#: src/namestore/gnunet-namestore.c:728 src/namestore/gnunet-namestore.c:737
+#: src/namestore/gnunet-namestore.c:754 src/namestore/gnunet-namestore.c:776
 msgid "add"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:595
+#: src/namestore/gnunet-namestore.c:745
+#: src/namestore/plugin_rest_namestore.c:608
 #, c-format
 msgid "Unsupported type `%s'\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:615
+#: src/namestore/gnunet-namestore.c:765
+#: src/namestore/plugin_rest_namestore.c:626
+#: src/namestore/plugin_rest_namestore.c:666
 #, c-format
 msgid "Value `%s' invalid for record type `%s'\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:651
+#: src/namestore/gnunet-namestore.c:801
 #, c-format
 msgid "Invalid time format `%s'\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:666
+#: src/namestore/gnunet-namestore.c:816
 msgid "del"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:715
-#: src/peerinfo-tool/gnunet-peerinfo.c:723
+#: src/namestore/gnunet-namestore.c:844
 #, c-format
+msgid "Invalid public key for reverse lookup `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore.c:868
+#: src/peerinfo-tool/gnunet-peerinfo.c:817
+#, c-format
 msgid "Invalid URI `%s'\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:750
+#: src/namestore/gnunet-namestore.c:903
 #, c-format
 msgid "Invalid nick `%s'\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:790
+#: src/namestore/gnunet-namestore.c:943
+#: src/namestore/plugin_rest_namestore.c:851
 #, c-format
 msgid "Ego `%s' not known to identity service\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:817
+#: src/namestore/gnunet-namestore.c:970
+#: src/namestore/plugin_rest_namestore.c:878
 #, c-format
 msgid "No default ego configured in identity service\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:853
+#: src/namestore/gnunet-namestore.c:1006
+#: src/namestore/plugin_rest_namestore.c:917
 #, c-format
 msgid "Identity service is not running\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:865
+#: src/namestore/gnunet-namestore.c:1018
+#: src/namestore/plugin_rest_namestore.c:946
 #, c-format
 msgid "Cannot connect to identity service\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:913
+#: src/namestore/gnunet-namestore.c:1066
 msgid "add record"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:916
+#: src/namestore/gnunet-namestore.c:1069
 msgid "delete record"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:919
+#: src/namestore/gnunet-namestore.c:1072
 msgid "display records"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:922
-msgid "expiration time for record to use (for adding only), \"never\" is 
possible"
+#: src/namestore/gnunet-namestore.c:1075
+msgid ""
+"expiration time for record to use (for adding only), \"never\" is possible"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:925
+#: src/namestore/gnunet-namestore.c:1078
 msgid "set the desired nick name for the zone"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:928
+#: src/namestore/gnunet-namestore.c:1081
 msgid "monitor changes in the namestore"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:934
+#: src/namestore/gnunet-namestore.c:1087
 msgid "determine our name for the given PKEY"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:937
+#: src/namestore/gnunet-namestore.c:1090
 msgid "type of the record to add/delete/display"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:940
+#: src/namestore/gnunet-namestore.c:1093
 msgid "URI to import into our zone"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:943
+#: src/namestore/gnunet-namestore.c:1096
 msgid "value of the record to add/delete"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:946
+#: src/namestore/gnunet-namestore.c:1099
 msgid "create or list public record"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:949
-msgid "create shadow record (only valid if all other records of the same type 
have expired"
+#: src/namestore/gnunet-namestore.c:1102
+msgid ""
+"create shadow record (only valid if all other records of the same type have "
+"expired"
 msgstr ""
 
-#: src/namestore/gnunet-namestore.c:952
+#: src/namestore/gnunet-namestore.c:1105
 msgid "name of the ego controlling the zone"
 msgstr ""
 
-#: src/namestore/gnunet-namestore-fcfsd.c:464
+#: src/namestore/gnunet-namestore-fcfsd.c:478
 #, c-format
 msgid "Unsupported form value `%s'\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore-fcfsd.c:491
+#: src/namestore/gnunet-namestore-fcfsd.c:505
 #, c-format
 msgid "Failed to create record for domain `%s': %s\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore-fcfsd.c:525
+#: src/namestore/gnunet-namestore-fcfsd.c:539
 #, c-format
 msgid "Found existing name `%s' for the given key\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore-fcfsd.c:534
+#: src/namestore/gnunet-namestore-fcfsd.c:548
 msgid "Error when mapping zone to name\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore-fcfsd.c:596
+#: src/namestore/gnunet-namestore-fcfsd.c:610
 #, c-format
 msgid "Found %u existing records for domain `%s'\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore-fcfsd.c:652
+#: src/namestore/gnunet-namestore-fcfsd.c:666
 #, c-format
 msgid "Failed to create page for `%s'\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore-fcfsd.c:668
+#: src/namestore/gnunet-namestore-fcfsd.c:682
 #, c-format
 msgid "Failed to setup post processor for `%s'\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore-fcfsd.c:704
+#: src/namestore/gnunet-namestore-fcfsd.c:718
 msgid "Domain name must not contain `.'\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore-fcfsd.c:712
+#: src/namestore/gnunet-namestore-fcfsd.c:726
 msgid "Domain name must not contain `+'\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore-fcfsd.c:910
+#: src/namestore/gnunet-namestore-fcfsd.c:924
 msgid "No ego configured for `fcfsd` subsystem\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore-fcfsd.c:936
+#: src/namestore/gnunet-namestore-fcfsd.c:950
 msgid "Failed to start HTTP server\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore-fcfsd.c:978
+#: src/namestore/gnunet-namestore-fcfsd.c:992
 msgid "Failed to connect to identity\n"
 msgstr ""
 
-#: src/namestore/gnunet-namestore-fcfsd.c:1011
+#: src/namestore/gnunet-namestore-fcfsd.c:1025
 msgid "GNU Name System First Come First Serve name registration service"
 msgstr ""
 
@@ -4802,6 +5134,10 @@
 msgid "Namestore failed to store record\n"
 msgstr ""
 
+#: src/namestore/plugin_rest_namestore.c:1023
+msgid "Namestore REST API initialized\n"
+msgstr ""
+
 #: src/nat/gnunet-nat-server.c:279
 #, c-format
 msgid "Please pass valid port number as the first argument! (got `%s')\n"
@@ -4811,129 +5147,198 @@
 msgid "GNUnet NAT traversal test helper daemon"
 msgstr ""
 
-#: src/nat/nat_auto.c:170
-msgid "NAT traversal with ICMP Server timed out.\n"
-msgstr ""
-
-#: src/nat/nat_auto.c:203
+#: src/nat/nat_auto.c:179
 msgid "NAT traversal with ICMP Server succeeded.\n"
 msgstr ""
 
-#: src/nat/nat_auto.c:204
+#: src/nat/nat_auto.c:180
 msgid "NAT traversal with ICMP Server failed.\n"
 msgstr ""
 
-#: src/nat/nat_auto.c:225
+#: src/nat/nat_auto.c:201
 msgid "Testing connection reversal with ICMP server.\n"
 msgstr ""
 
-#: src/nat/nat_auto.c:274
+#: src/nat/nat_auto.c:249
 #, c-format
 msgid "Detected external IP `%s'\n"
 msgstr ""
 
-#: src/nat/nat_auto.c:344
+#: src/nat/nat_auto.c:327
 msgid "This system has a global IPv6 address, setting IPv6 to supported.\n"
 msgstr ""
 
-#: src/nat/nat_auto.c:360
+#: src/nat/nat_auto.c:343
 #, c-format
 msgid "Detected internal network address `%s'.\n"
 msgstr ""
 
-#: src/nat/nat_auto.c:413
+#: src/nat/nat_auto.c:406
 msgid "upnpc found, enabling its use\n"
 msgstr ""
 
-#: src/nat/nat_auto.c:414
+#: src/nat/nat_auto.c:407
 msgid "upnpc not found\n"
 msgstr ""
 
-#: src/nat/nat_auto.c:447
-msgid "gnunet-helper-nat-server found, testing it\n"
+#: src/nat/nat_auto.c:437
+msgid "test_icmp_server not possible, as we have no public IPv4 address\n"
 msgstr ""
 
-#: src/nat/nat_auto.c:448
-msgid "No working gnunet-helper-nat-server found\n"
+#: src/nat/nat_auto.c:445 src/nat/nat_auto.c:490
+msgid "test_icmp_server not possible, as we are not behind NAT\n"
 msgstr ""
 
-#: src/nat/nat_auto.c:482
-msgid "gnunet-helper-nat-client found, enabling it\n"
+#: src/nat/nat_auto.c:453 src/nat/nat_auto.c:498
+msgid "No working gnunet-helper-nat-server found\n"
 msgstr ""
 
 #: src/nat/nat_auto.c:483
-msgid "gnunet-helper-nat-client not found or behind NAT, disabling it\n"
+msgid "test_icmp_client not possible, as we have no internal IPv4 address\n"
 msgstr ""
 
-#: src/nat/nat.c:867
+#: src/nat/nat.c:862
 #, c-format
 msgid "gnunet-helper-nat-server generated malformed address `%s'\n"
 msgstr ""
 
-#: src/nat/nat.c:917
+#: src/nat/nat.c:912
 #, c-format
 msgid "Failed to start %s\n"
 msgstr ""
 
-#: src/nat/nat.c:1205
+#: src/nat/nat.c:1027
+msgid "Error while running upnp client:\n"
+msgstr ""
+
+#: src/nat/nat.c:1097
+#, c-format
+msgid "Failed to run upnp client for port %u\n"
+msgstr ""
+
+#: src/nat/nat.c:1237
 msgid "malformed"
 msgstr ""
 
-#: src/nat/nat.c:1276 src/nat/nat.c:1288
+#: src/nat/nat.c:1291
+msgid ""
+"UPnP enabled in configuration, but UPnP client `upnpc` command not found, "
+"disabling UPnP \n"
+msgstr ""
+
+#: src/nat/nat.c:1318 src/nat/nat.c:1330
 #, c-format
-msgid "Configuration requires `%s', but binary is not installed properly (SUID 
bit not set).  Option disabled.\n"
+msgid ""
+"Configuration requires `%s', but binary is not installed properly (SUID bit "
+"not set).  Option disabled.\n"
 msgstr ""
 
-#: src/nat/nat.c:1426
+#: src/nat/nat.c:1468
 msgid "Internal IP address not known, cannot use ICMP NAT traversal method\n"
 msgstr ""
 
-#: src/nat/nat.c:1442
+#: src/nat/nat.c:1484
 #, c-format
 msgid "Running gnunet-helper-nat-client %s %s %u\n"
 msgstr ""
 
-#: src/nat/nat_mini.c:155
-msgid "no valid address was returned by `external-ip'"
+#: src/nat/nat.c:1569
+msgid "Operation Successful"
 msgstr ""
 
-#: src/nat/nat_mini.c:175
-msgid "`external-ip' command not found"
+#: src/nat/nat.c:1571
+msgid "Internal Failure (IPC, ...)"
 msgstr ""
 
-#: src/nat/nat_mini.c:201
-msgid "`external-ip' command not found\n"
+#: src/nat/nat.c:1573
+msgid "Failure in network subsystem, check permissions."
 msgstr ""
 
-#: src/nat/nat_mini.c:366
+#: src/nat/nat.c:1575
+msgid "Encountered timeout while performing operation"
+msgstr ""
+
+#: src/nat/nat.c:1577
+msgid "detected that we are offline"
+msgstr ""
+
+#: src/nat/nat.c:1579
+msgid "`upnpc` command not found"
+msgstr ""
+
+#: src/nat/nat.c:1581
 msgid "Failed to run `upnpc` command"
 msgstr ""
 
-#: src/nat/nat_mini.c:512
+#: src/nat/nat.c:1583
 msgid "`upnpc' command took too long, process killed"
 msgstr ""
 
-#: src/nat/nat_mini.c:540
+#: src/nat/nat.c:1585
 msgid "`upnpc' command failed to establish port mapping"
 msgstr ""
 
-#: src/nat/nat_mini.c:604
-msgid "`upnpc' command not found\n"
+#: src/nat/nat.c:1587
+msgid "`external-ip' command not found"
 msgstr ""
 
-#: src/nat/nat_mini.c:608
-msgid "`upnpc` command not found"
+#: src/nat/nat.c:1589
+msgid "Failed to run `external-ip` command"
 msgstr ""
 
-#: src/nat/nat_test.c:351
+#: src/nat/nat.c:1591
+msgid "`external-ip' command output invalid"
+msgstr ""
+
+#: src/nat/nat.c:1593
+msgid "no valid address was returned by `external-ip'"
+msgstr ""
+
+#: src/nat/nat.c:1595
+msgid "Could not determine interface with internal/local network address"
+msgstr ""
+
+#: src/nat/nat.c:1597
+msgid "No functioning gnunet-helper-nat-server installation found"
+msgstr ""
+
+#: src/nat/nat.c:1599
+msgid "NAT test could not be initialized"
+msgstr ""
+
+#: src/nat/nat.c:1601
+msgid "NAT test timeout reached"
+msgstr ""
+
+#: src/nat/nat.c:1603
+msgid "could not register NAT"
+msgstr ""
+
+#: src/nat/nat.c:1605
+msgid "No working gnunet-helper-nat-client installation found"
+msgstr ""
+
+#: src/nat/nat_mini.c:203
+msgid "`external-ip' command not found\n"
+msgstr ""
+
+#: src/nat/nat_mini.c:609
+msgid "`upnpc' command not found\n"
+msgstr ""
+
+#: src/nat/nat_test.c:360
 msgid "Failed to connect to `gnunet-nat-server'\n"
 msgstr ""
 
-#: src/nat/nat_test.c:423
+#: src/nat/nat_test.c:462
 #, c-format
 msgid "Failed to create listen socket bound to `%s' for NAT test: %s\n"
 msgstr ""
 
+#: src/nat/nat_test.c:497
+msgid "NAT test failed to start NAT library\n"
+msgstr ""
+
 #: src/nse/gnunet-nse.c:117
 msgid "NSE service is not running\n"
 msgstr ""
@@ -4954,10 +5359,6 @@
 msgid "name of the file for writing connection information and statistics"
 msgstr ""
 
-#: src/nse/gnunet-nse-profiler.c:864 src/testbed/gnunet-testbed-profiler.c:306
-msgid "name of the file with the login information for the testbed"
-msgstr ""
-
 #: src/nse/gnunet-nse-profiler.c:867
 msgid "name of the file for writing the main results"
 msgstr ""
@@ -4974,8 +5375,8 @@
 msgid "Measure quality and performance of the NSE service."
 msgstr ""
 
-#: src/nse/gnunet-service-nse.c:1517
-#: src/revocation/gnunet-service-revocation.c:789 src/util/gnunet-scrypt.c:248
+#: src/nse/gnunet-service-nse.c:1537
+#: src/revocation/gnunet-service-revocation.c:827 src/util/gnunet-scrypt.c:260
 msgid "Value is too large.\n"
 msgstr ""
 
@@ -4995,58 +5396,59 @@
 msgid "Failed to parse HELLO in file `%s'\n"
 msgstr ""
 
-#: src/peerinfo/gnunet-service-peerinfo.c:466
+#: src/peerinfo/gnunet-service-peerinfo.c:468
 msgid "# peers known"
 msgstr ""
 
-#: src/peerinfo/gnunet-service-peerinfo.c:503
+#: src/peerinfo/gnunet-service-peerinfo.c:506
 #, c-format
-msgid "File `%s' in directory `%s' does not match naming convention. 
Removed.\n"
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
 msgstr ""
 
-#: src/peerinfo/gnunet-service-peerinfo.c:653
+#: src/peerinfo/gnunet-service-peerinfo.c:662
 #, c-format
 msgid "Scanning directory `%s'\n"
 msgstr ""
 
-#: src/peerinfo/gnunet-service-peerinfo.c:658
+#: src/peerinfo/gnunet-service-peerinfo.c:668
 #, c-format
 msgid "Still no peers found in `%s'!\n"
 msgstr ""
 
-#: src/peerinfo/gnunet-service-peerinfo.c:994
+#: src/peerinfo/gnunet-service-peerinfo.c:1037
 #, c-format
 msgid "Cleaning up directory `%s'\n"
 msgstr ""
 
-#: src/peerinfo/gnunet-service-peerinfo.c:1287
+#: src/peerinfo/gnunet-service-peerinfo.c:1358
 #, c-format
 msgid "Importing HELLOs from `%s'\n"
 msgstr ""
 
-#: src/peerinfo/gnunet-service-peerinfo.c:1298
+#: src/peerinfo/gnunet-service-peerinfo.c:1371
 msgid "Skipping import of included HELLOs\n"
 msgstr ""
 
-#: src/peerinfo/peerinfo_api.c:236
+#: src/peerinfo/peerinfo_api.c:237
 msgid "aborted due to explicit disconnect request"
 msgstr ""
 
-#: src/peerinfo/peerinfo_api.c:356
+#: src/peerinfo/peerinfo_api.c:363
 msgid "failed to transmit request (service down?)"
 msgstr ""
 
-#: src/peerinfo/peerinfo_api.c:506
+#: src/peerinfo/peerinfo_api.c:518
 msgid "Failed to receive response from `PEERINFO' service."
 msgstr ""
 
-#: src/peerinfo/peerinfo_api.c:547 src/peerinfo/peerinfo_api.c:566
-#: src/peerinfo/peerinfo_api.c:581 src/peerinfo/peerinfo_api.c:592
-#: src/peerinfo/peerinfo_api.c:603
+#: src/peerinfo/peerinfo_api.c:562 src/peerinfo/peerinfo_api.c:585
+#: src/peerinfo/peerinfo_api.c:602 src/peerinfo/peerinfo_api.c:615
+#: src/peerinfo/peerinfo_api.c:630
 msgid "Received invalid message from `PEERINFO' service."
 msgstr ""
 
-#: src/peerinfo/peerinfo_api.c:678
+#: src/peerinfo/peerinfo_api.c:719
 msgid "Timeout transmitting iteration request to `PEERINFO' service."
 msgstr ""
 
@@ -5055,110 +5457,198 @@
 msgid "Could not connect to `%s' service.\n"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:232
+#: src/peerinfo-tool/gnunet-peerinfo.c:245
 #, c-format
 msgid "%sPeer `%s'\n"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:239
+#: src/peerinfo-tool/gnunet-peerinfo.c:252
 #, c-format
 msgid "\tExpires: %s \t %s\n"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:428
+#: src/peerinfo-tool/gnunet-peerinfo.c:301
 #, c-format
-msgid "Failure: Did not receive %s\n"
+msgid "Failure: Cannot convert address to string for peer `%s'\n"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:436
+#: src/peerinfo-tool/gnunet-peerinfo.c:463
 #, c-format
 msgid "Failure: Received invalid %s\n"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:445
+#: src/peerinfo-tool/gnunet-peerinfo.c:477
 #, c-format
 msgid "Failed to write HELLO with %u bytes to file `%s'\n"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:458
+#: src/peerinfo-tool/gnunet-peerinfo.c:496
 #, c-format
 msgid "Wrote %s HELLO containing %u addresses with %u bytes to file `%s'\n"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:522
+#: src/peerinfo-tool/gnunet-peerinfo.c:566
 #, c-format
 msgid "Failure adding HELLO: %s\n"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:633
+#: src/peerinfo-tool/gnunet-peerinfo.c:695
 #, c-format
-msgid "Service `%s' is not running, please start GNUnet\n"
+msgid "Failed to get my own HELLO from this peer!\n"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:654 src/util/gnunet-scrypt.c:224
+#: src/peerinfo-tool/gnunet-peerinfo.c:727
 #, c-format
-msgid "Loading hostkey from `%s' failed.\n"
+msgid "Service `%s' is not running, please start GNUnet\n"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:745
+#: src/peerinfo-tool/gnunet-peerinfo.c:841
 #, c-format
 msgid "I am peer `%s'.\n"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:789
+#: src/peerinfo-tool/gnunet-peerinfo.c:882
 msgid "don't resolve host names"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:792
+#: src/peerinfo-tool/gnunet-peerinfo.c:885
 msgid "output only the identity strings"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:795
+#: src/peerinfo-tool/gnunet-peerinfo.c:888
 msgid "include friend-only information"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:798
+#: src/peerinfo-tool/gnunet-peerinfo.c:891
 msgid "output our own identity only"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:801
+#: src/peerinfo-tool/gnunet-peerinfo.c:894
 msgid "list all known peers"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:804
+#: src/peerinfo-tool/gnunet-peerinfo.c:897
 msgid "dump hello to file"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:807
+#: src/peerinfo-tool/gnunet-peerinfo.c:900
 msgid "also output HELLO uri(s)"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:810
+#: src/peerinfo-tool/gnunet-peerinfo.c:903
 msgid "add given HELLO uri to the database"
 msgstr ""
 
-#: src/peerinfo-tool/gnunet-peerinfo.c:821
+#: src/peerinfo-tool/gnunet-peerinfo.c:917
 msgid "Print information about peers."
 msgstr ""
 
 #: src/peerinfo-tool/gnunet-peerinfo_plugins.c:105
-#: src/transport/gnunet-service-transport_plugins.c:128
+#: src/transport/gnunet-service-transport_plugins.c:168
 #, c-format
 msgid "Starting transport plugins `%s'\n"
 msgstr ""
 
 #: src/peerinfo-tool/gnunet-peerinfo_plugins.c:109
-#: src/transport/gnunet-service-transport_plugins.c:133
+#: src/transport/gnunet-service-transport_plugins.c:173
 #, c-format
 msgid "Loading `%s' transport plugin\n"
 msgstr ""
 
 #: src/peerinfo-tool/gnunet-peerinfo_plugins.c:129
-#: src/transport/gnunet-service-transport_plugins.c:165
+#: src/transport/gnunet-service-transport_plugins.c:208
 #, c-format
 msgid "Failed to load transport plugin for `%s'\n"
 msgstr ""
 
+#: src/peerstore/gnunet-peerstore.c:92
+msgid "peerstore"
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:384
+msgid "Malformed iterate request.\n"
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:391
+msgid "Sub system not supplied in client iterate request.\n"
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:451
+msgid "Malformed store request from client\n"
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:459
+msgid "Full key not supplied in client store request\n"
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:478
+msgid "Failed to store requested value, database error."
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:557
+msgid "No database backend configured\n"
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:568
+#, c-format
+msgid "Could not load database backend `%s'\n"
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:329 src/sensor/sensor_api.c:179
+#, c-format
+msgid "Received an error notification from MQ of type: %d\n"
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:375
+msgid "timeout"
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:402
+msgid "Iteration canceled due to reconnection."
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:681
+msgid "Unexpected iteration response, this should not happen.\n"
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:692
+msgid "Error communicating with `PEERSTORE' service."
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:711
+msgid "Received a malformed response from service."
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:821
+msgid ""
+"Problem receiving a watch response, no way to determine which request.\n"
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:833
+msgid "Received a watch result for a non existing watch.\n"
+msgstr ""
+
+#: src/peerstore/plugin_peerstore_sqlite.c:398
+#: src/psycstore/plugin_psycstore_sqlite.c:286
+#, c-format
+msgid ""
+"Error executing SQL query: %s\n"
+"  %s\n"
+msgstr ""
+
+#: src/peerstore/plugin_peerstore_sqlite.c:422
+#: src/psycstore/plugin_psycstore_sqlite.c:263
+#, c-format
+msgid ""
+"Error preparing SQL query: %s\n"
+"  %s\n"
+msgstr ""
+
+#: src/peerstore/plugin_peerstore_sqlite.c:504
+#, c-format
+msgid "Unable to create indices: %s.\n"
+msgstr ""
+
 #: src/postgres/postgres.c:59
 #, c-format
 msgid "`%s:%s' failed at %s:%d with error: %s"
@@ -5169,72 +5659,72 @@
 msgid "Unable to initialize Postgres: %s"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:200
+#: src/psycstore/gnunet-service-psycstore.c:260
 msgid "Failed to store membership information!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:224
+#: src/psycstore/gnunet-service-psycstore.c:284
 msgid "Failed to test membership!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:246
+#: src/psycstore/gnunet-service-psycstore.c:306
 msgid "Failed to store fragment!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:272
+#: src/psycstore/gnunet-service-psycstore.c:362
 msgid "Failed to get fragment!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:299
+#: src/psycstore/gnunet-service-psycstore.c:402
 msgid "Failed to get message!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:328
+#: src/psycstore/gnunet-service-psycstore.c:433
 msgid "Failed to get message fragment!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:356
+#: src/psycstore/gnunet-service-psycstore.c:461
 msgid "Failed to get master counters!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:392
-#: src/psycstore/gnunet-service-psycstore.c:465
+#: src/psycstore/gnunet-service-psycstore.c:497
+#: src/psycstore/gnunet-service-psycstore.c:570
 msgid "Tried to set invalid state variable name!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:408
+#: src/psycstore/gnunet-service-psycstore.c:513
 msgid "Failed to begin modifying state!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:431
+#: src/psycstore/gnunet-service-psycstore.c:536
 #, c-format
 msgid "Unknown operator: %c\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:441
+#: src/psycstore/gnunet-service-psycstore.c:546
 msgid "Failed to end modifying state!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:479
+#: src/psycstore/gnunet-service-psycstore.c:584
 msgid "Failed to begin synchronizing state!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:495
+#: src/psycstore/gnunet-service-psycstore.c:600
 msgid "Failed to end synchronizing state!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:515
-#: src/psycstore/gnunet-service-psycstore.c:534
+#: src/psycstore/gnunet-service-psycstore.c:620
+#: src/psycstore/gnunet-service-psycstore.c:639
 msgid "Failed to reset state!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:557
-#: src/psycstore/gnunet-service-psycstore.c:608
+#: src/psycstore/gnunet-service-psycstore.c:662
+#: src/psycstore/gnunet-service-psycstore.c:713
 msgid "Tried to get invalid state variable name!\n"
 msgstr ""
 
-#: src/psycstore/gnunet-service-psycstore.c:584
-#: src/psycstore/gnunet-service-psycstore.c:623
+#: src/psycstore/gnunet-service-psycstore.c:689
+#: src/psycstore/gnunet-service-psycstore.c:728
 msgid "Failed to get state variable!\n"
 msgstr ""
 
@@ -5243,21 +5733,7 @@
 msgid "`%s' failed at %s:%d with error: %s (%d)\n"
 msgstr ""
 
-#: src/psycstore/plugin_psycstore_sqlite.c:253
-#, c-format
-msgid ""
-"Error preparing SQL query: %s\n"
-"  %s\n"
-msgstr ""
-
-#: src/psycstore/plugin_psycstore_sqlite.c:276
-#, c-format
-msgid ""
-"Error executing SQL query: %s\n"
-"  %s\n"
-msgstr ""
-
-#: src/psycstore/plugin_psycstore_sqlite.c:1796
+#: src/psycstore/plugin_psycstore_sqlite.c:1932
 msgid "SQLite database running\n"
 msgstr ""
 
@@ -5290,7 +5766,7 @@
 msgstr ""
 
 #: src/pt/gnunet-daemon-pt.c:888
-msgid "# DNS requests dropped (DNS mesh channel down)"
+msgid "# DNS requests dropped (DNS cadet channel down)"
 msgstr ""
 
 #: src/pt/gnunet-daemon-pt.c:896
@@ -5323,7 +5799,7 @@
 msgstr ""
 
 #: src/regex/gnunet-daemon-regexprofiler.c:380
-msgid "Daemon to announce regular expressions for the peer using mesh."
+msgid "Daemon to announce regular expressions for the peer using cadet."
 msgstr ""
 
 #: src/regex/gnunet-regex-profiler.c:1288
@@ -5400,6 +5876,14 @@
 msgid "Regex `%s' is too long!\n"
 msgstr ""
 
+#: src/rest/gnunet-rest-server.c:766
+msgid "listen on specified port (default: 7776)"
+msgstr ""
+
+#: src/rest/gnunet-rest-server.c:783
+msgid "GNUnet REST server"
+msgstr ""
+
 #: src/revocation/gnunet-revocation.c:126
 #, c-format
 msgid "Key `%s' is valid\n"
@@ -5465,7 +5949,8 @@
 msgstr ""
 
 #: src/revocation/gnunet-revocation.c:421
-msgid "Testing and revoking at the same time is not allowed, only executing 
test.\n"
+msgid ""
+"Testing and revoking at the same time is not allowed, only executing test.\n"
 msgstr ""
 
 #: src/revocation/gnunet-revocation.c:441
@@ -5486,7 +5971,9 @@
 msgstr ""
 
 #: src/revocation/gnunet-revocation.c:507
-msgid "revoke the private key associated for the the private key associated 
with the ego NAME "
+msgid ""
+"revoke the private key associated for the the private key associated with "
+"the ego NAME "
 msgstr ""
 
 #: src/revocation/gnunet-revocation.c:510
@@ -5497,349 +5984,453 @@
 msgid "test if the public key KEY has been revoked"
 msgstr ""
 
-#: src/revocation/gnunet-service-revocation.c:272
-msgid "Duplicate revocation received from peer. Ignored.\n"
+#: src/revocation/gnunet-service-revocation.c:427
+msgid "# unsupported revocations received via set union"
 msgstr ""
 
-#: src/revocation/gnunet-service-revocation.c:434
+#: src/revocation/gnunet-service-revocation.c:436
+msgid "# revocation messages received via set union"
+msgstr ""
+
+#: src/revocation/gnunet-service-revocation.c:441
 #, c-format
 msgid "Error computing revocation set union with %s\n"
 msgstr ""
 
-#: src/revocation/gnunet-service-revocation.c:486
+#: src/revocation/gnunet-service-revocation.c:445
+msgid "# revocation set unions failed"
+msgstr ""
+
+#: src/revocation/gnunet-service-revocation.c:454
+msgid "# revocation set unions completed"
+msgstr ""
+
+#: src/revocation/gnunet-service-revocation.c:493
+#: src/revocation/gnunet-service-revocation.c:759
 msgid "SET service crashed, terminating revocation service\n"
 msgstr ""
 
-#: src/revocation/gnunet-service-revocation.c:812
+#: src/revocation/gnunet-service-revocation.c:851
 msgid "Could not open revocation database file!"
 msgstr ""
 
-#: src/scalarproduct/gnunet-scalarproduct.c:225
+#: src/rps/gnunet-rps.c:67
+msgid "rps"
+msgstr ""
+
+#: src/scalarproduct/gnunet-scalarproduct.c:221
 msgid "You must specify at least one message ID to check!\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-scalarproduct.c:232
+#: src/scalarproduct/gnunet-scalarproduct.c:228
 msgid "This program needs a session identifier for comparing vectors.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-scalarproduct.c:239
-msgid "Please give a session key for --input_key!\n"
+#: src/scalarproduct/gnunet-scalarproduct.c:241
+#, c-format
+msgid ""
+"Tried to set initiator mode, as peer ID was given. However, `%s' is not a "
+"valid peer identifier.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-scalarproduct.c:251
-#, c-format
-msgid "Tried to set initiator mode, as peer ID was given. However, `%s' is not 
a valid peer identifier.\n"
+#: src/scalarproduct/gnunet-scalarproduct.c:259
+msgid "Need elements to compute the scalarproduct, got none.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-scalarproduct.c:278
-#: src/scalarproduct/gnunet-scalarproduct.c:314
+#: src/scalarproduct/gnunet-scalarproduct.c:281
 #, c-format
-msgid "Could not convert `%s' to int32_t.\n"
+msgid "Malformed input, could not parse `%s'\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-scalarproduct.c:286
-msgid "Need elements to compute the vectorproduct, got none.\n"
+#: src/scalarproduct/gnunet-scalarproduct.c:299
+#, c-format
+msgid "Could not convert `%s' to int64_t.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-scalarproduct.c:346
+#: src/scalarproduct/gnunet-scalarproduct.c:326
 #, c-format
-msgid "Could not convert `%s' to integer.\n"
+msgid "Failed to initiate computation, were all keys unique?\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-scalarproduct.c:407
-msgid "A comma separated list of elements to compare as vector with our remote 
peer."
+#: src/scalarproduct/gnunet-scalarproduct.c:350
+msgid ""
+"A comma separated list of elements to compare as vector with our remote peer."
 msgstr ""
 
-#: src/scalarproduct/gnunet-scalarproduct.c:410
-msgid "A comma separated mask to select which elements should actually be 
compared."
+#: src/scalarproduct/gnunet-scalarproduct.c:353
+msgid ""
+"[Optional] peer to calculate our scalarproduct with. If this parameter is "
+"not given, the service will wait for a remote peer to compute the request."
 msgstr ""
 
-#: src/scalarproduct/gnunet-scalarproduct.c:413
-msgid "[Optional] peer to calculate our scalarproduct with. If this parameter 
is not given, the service will wait for a remote peer to compute the request."
-msgstr ""
-
-#: src/scalarproduct/gnunet-scalarproduct.c:416
+#: src/scalarproduct/gnunet-scalarproduct.c:356
 msgid "Transaction ID shared with peer."
 msgstr ""
 
-#: src/scalarproduct/gnunet-scalarproduct.c:425
+#: src/scalarproduct/gnunet-scalarproduct.c:365
 msgid "Calculate the Vectorproduct with a GNUnet peer."
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:541
-#, c-format
-msgid "Client (%p) disconnected from us.\n"
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1419
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1564
+msgid "Connect to CADET failed\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:613
-#: src/scalarproduct/gnunet-service-scalarproduct.c:702
-#, c-format
-msgid "Could not send message to client (%p)!\n"
+#: src/scalarproduct/scalarproduct_api.c:296
+msgid "Keys given to SCALARPRODUCT not unique!\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:619
-#, c-format
-msgid "Sending session-end notification to client (%p) for session %s\n"
+#: src/secretsharing/gnunet-secretsharing-profiler.c:613
+msgid "dkg start delay"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:712
-#, c-format
-msgid "Sent result to client (%p), this session (%s) has ended!\n"
+#: src/secretsharing/gnunet-secretsharing-profiler.c:616
+msgid "dkg timeout"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:766
-#: src/scalarproduct/gnunet-service-scalarproduct.c:855
-msgid "Could not send service-response message via mesh!)\n"
+#: src/secretsharing/gnunet-secretsharing-profiler.c:619
+msgid "threshold"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1028
+#: src/secretsharing/gnunet-secretsharing-profiler.c:622
+msgid "also profile decryption"
+msgstr ""
+
+#: src/sensordashboard/gnunet-service-sensordashboard.c:353
 #, c-format
-msgid "Failed to communicate with `%s', scalar product calculation aborted.\n"
+msgid "Error trying to send a message to peer `%s'.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1099
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1208
-msgid "Transmitting service request.\n"
+#: src/sensor/gnunet-sensor.c:162
+msgid "Retrieve information about all defined sensors"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1108
-msgid "Could not send service-request multipart message to channel!\n"
+#: src/sensor/gnunet-sensor.c:165
+msgid "Retrieve information about a single sensor"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1147
-#, c-format
-msgid "Successfully created new channel to peer (%s)!\n"
+#: src/sensor/gnunet-sensor.c:168
+msgid "Force an anomaly on a sensor, use only for testing"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1217
-msgid "Could not send message to channel!\n"
+#: src/sensor/gnunet-sensor.c:175
+msgid "sensor"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1274
-msgid "Too short message received from client!\n"
+#: src/sensor/gnunet-sensor-profiler.c:729
+msgid "Invalid or missing number of peers. Set at least 2 peers.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1287
-msgid "Invalid message received from client, session information incorrect!\n"
+#: src/sensor/gnunet-sensor-profiler.c:736
+msgid "Missing or invalid topology file.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1298
-#, c-format
-msgid "Duplicate session information received, cannot create new session with 
key `%s'\n"
+#: src/sensor/gnunet-sensor-profiler.c:782
+msgid "Number of peers to run"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1318
-#, c-format
-msgid "Got client-request-session with key %s, preparing channel to remote 
service.\n"
+#: src/sensor/gnunet-sensor-profiler.c:784
+msgid "Path to topology file"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1354
+#: src/sensor/gnunet-sensor-profiler.c:787
+msgid "Change the interval of running sensors to given value"
+msgstr ""
+
+#: src/sensor/gnunet-sensor-profiler.c:790
+msgid "Number of peers to simulate anomalies on"
+msgstr ""
+
+#: src/sensor/gnunet-sensor-profiler.c:797
+msgid "Profiler for sensor service"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_analysis.c:204
+msgid "Received an invalid sensor value."
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_analysis.c:295
+msgid "Analysis model not defined in configuration.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_analysis.c:304
 #, c-format
-msgid "Creating new channel for session with key %s.\n"
+msgid "Could not load analysis model `%s'.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1399
+#: src/sensor/gnunet-service-sensor_analysis.c:312
+msgid "Could not connect to peerstore service.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_monitoring.c:233
+msgid "Unknown value type expected by sensor, this should not happen.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_monitoring.c:268
 #, c-format
-msgid "Got client-responder-session with key %s and a matching 
service-request-session set, processing.\n"
+msgid "Received an invalid value for sensor `%s': %s\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1409
+#: src/sensor/gnunet-service-sensor_monitoring.c:347
 #, c-format
-msgid "Got client-responder-session with key %s but NO matching 
service-request-session set, queuing element for later use.\n"
+msgid "Sensor `%s': External process should not be a path, disabling sensor.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1439
+#: src/sensor/gnunet-service-sensor_monitoring.c:370
 #, c-format
-msgid "New incoming channel from peer %s.\n"
+msgid ""
+"Sensor `%s' process `%s' problem: binary doesn't exist or not executable\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1471
+#: src/sensor/gnunet-service-sensor_monitoring.c:418
 #, c-format
-msgid "Peer disconnected, terminating session %s with peer (%s)\n"
+msgid "Sensor `%s' execution task already set, this should not happen\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1672
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1814
+#: src/sensor/gnunet-service-sensor_reporting.c:828
+msgid "Double creation of proof-of-work, this should not happen.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_reporting.c:834
+msgid "Failed to create pow and signature block.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_reporting.c:1046
 #, c-format
-msgid "Got session with key %s and a matching element set, processing.\n"
+msgid "PEERSTORE error: %s.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1681
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1821
+#: src/sensor/gnunet-service-sensor_reporting.c:1151
+#: src/sensor/gnunet-service-sensor_reporting.c:1409
+msgid "Failed to connect to CORE service.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_reporting.c:1158
+msgid "Peer identity received from CORE init doesn't match ours.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_reporting.c:1398
+msgid "Failed to connect to peerstore service.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_reporting.c:1419
+#: src/sensor/gnunet-service-sensor_update.c:781
+msgid "Failed to connect to CADET service.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_reporting.c:1426
+msgid "Failed to load my private key.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_update.c:327
 #, c-format
-msgid "Got session with key %s without a matching element set, queueing.\n"
+msgid "Error trying to send a message to update point `%s'.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1771
+#: src/sensor/gnunet-service-sensor_update.c:418
 #, c-format
-msgid "Got message with duplicate session key (`%s'), ignoring service 
request.\n"
+msgid "Failed to connect to update point `%s'.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:2014
-msgid "Shutting down, initiating cleanup.\n"
+#: src/sensor/plugin_sensor_model_gaussian.c:203
+msgid "Missing `TRAINING_WINDOW' value in configuration.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:2100
-msgid "Connect to MESH failed\n"
+#: src/sensor/plugin_sensor_model_gaussian.c:221
+msgid "Missing `CONFIDENCE_INTERVAL' value in configuration.\n"
 msgstr ""
 
-#: src/scalarproduct/gnunet-service-scalarproduct.c:2104
-msgid "Mesh initialized\n"
+#: src/sensor/plugin_sensor_model_gaussian.c:229
+msgid "Missing `WEIGHT_INC' value in configuration.\n"
 msgstr ""
 
-#: src/scalarproduct/scalarproduct_api.c:246
-msgid "# SUC responder result messages received"
+#: src/sensor/sensor_api.c:296
+msgid "Iterate request canceled due to disconnection.\n"
 msgstr ""
 
-#: src/scalarproduct/scalarproduct_api.c:300
-msgid "# bytes sent to scalarproduct"
+#: src/sensor/sensor_api.c:307
+msgid "Force anomaly request canceled due to disconnection.\n"
 msgstr ""
 
-#: src/scalarproduct/scalarproduct_api.c:345
-#: src/scalarproduct/scalarproduct_api.c:440
-msgid "Failed to connect to the scalarproduct service\n"
+#: src/sensor/sensor_api.c:374
+msgid "Timeout transmitting iteration request to `SENSOR' service."
 msgstr ""
 
-#: src/scalarproduct/scalarproduct_api.c:353
-#: src/scalarproduct/scalarproduct_api.c:448
-msgid "Failed to send a message to the statistics service\n"
+#: src/sensor/sensor_util_lib.c:107
+msgid "Error reading sensor version\n"
 msgstr ""
 
-#: src/scalarproduct/scalarproduct_api.c:387
-#: src/scalarproduct/scalarproduct_api.c:485
-msgid "Failed to send a message to the scalarproduct service\n"
+#: src/sensor/sensor_util_lib.c:116
+msgid "Invalid sensor version number, format should be major.minor\n"
 msgstr ""
 
-#: src/secretsharing/gnunet-secretsharing-profiler.c:538
-msgid "dkg start delay"
+#: src/sensor/sensor_util_lib.c:131
+msgid "Error reading sensor category\n"
 msgstr ""
 
-#: src/secretsharing/gnunet-secretsharing-profiler.c:541
-msgid "dkg timeout"
+#: src/sensor/sensor_util_lib.c:164
+msgid "Error reading sensor run interval\n"
 msgstr ""
 
-#: src/secretsharing/gnunet-secretsharing-profiler.c:544
-msgid "threshold"
+#: src/sensor/sensor_util_lib.c:191
+msgid "Error reading sensor source\n"
 msgstr ""
 
-#: src/secretsharing/gnunet-secretsharing-profiler.c:547
-msgid "also profile decryption"
+#: src/sensor/sensor_util_lib.c:206
+msgid "Error reading sensor gnunet-statistics source information\n"
 msgstr ""
 
-#: src/set/gnunet-service-set.c:1431
-msgid "Could not connect to mesh service\n"
+#: src/sensor/sensor_util_lib.c:218
+msgid "Error reading sensor process name\n"
 msgstr ""
 
-#: src/set/gnunet-set-ibf-profiler.c:221
+#: src/sensor/sensor_util_lib.c:233
+msgid "Error reading sensor expected datatype\n"
+msgstr ""
+
+#: src/sensor/sensor_util_lib.c:241
+msgid "Invalid expected datatype, gnunet-statistics returns uint64 values\n"
+msgstr ""
+
+#: src/sensor/sensor_util_lib.c:299
+#, c-format
+msgid "Failed to access sensor file: %s\n"
+msgstr ""
+
+#: src/sensor/sensor_util_lib.c:308
+#, c-format
+msgid "Failed to load sensor definition: %s\n"
+msgstr ""
+
+#: src/sensor/sensor_util_lib.c:370
+#, c-format
+msgid "Sensor `%s' already exists with same or newer version\n"
+msgstr ""
+
+#: src/sensor/sensor_util_lib.c:387
+#, c-format
+msgid "Error adding new sensor `%s' to global hashmap.\n"
+msgstr ""
+
+#: src/sensor/sensor_util_lib.c:412
+#, c-format
+msgid "Error loading sensor from file: %s\n"
+msgstr ""
+
+#: src/set/gnunet-service-set.c:1531
+msgid "Could not connect to cadet service\n"
+msgstr ""
+
+#: src/set/gnunet-set-ibf-profiler.c:237
 msgid "number of element in set A-B"
 msgstr ""
 
-#: src/set/gnunet-set-ibf-profiler.c:224
+#: src/set/gnunet-set-ibf-profiler.c:240
 msgid "number of element in set B-A"
 msgstr ""
 
-#: src/set/gnunet-set-ibf-profiler.c:227
+#: src/set/gnunet-set-ibf-profiler.c:243
 msgid "number of common elements in A and B"
 msgstr ""
 
-#: src/set/gnunet-set-ibf-profiler.c:230
+#: src/set/gnunet-set-ibf-profiler.c:246
 msgid "hash num"
 msgstr ""
 
-#: src/set/gnunet-set-ibf-profiler.c:233
+#: src/set/gnunet-set-ibf-profiler.c:249
 msgid "ibf size"
 msgstr ""
 
-#: src/set/gnunet-set-profiler.c:295
+#: src/set/gnunet-set-profiler.c:298
 msgid "oeration to execute"
 msgstr ""
 
-#: src/statistics/gnunet-service-statistics.c:280
+#: src/statistics/gnunet-service-statistics.c:323
 #, c-format
 msgid "Loading %llu bytes of statistics from `%s'\n"
 msgstr ""
 
-#: src/statistics/gnunet-service-statistics.c:346
+#: src/statistics/gnunet-service-statistics.c:434
 #, c-format
 msgid "Wrote %llu bytes of statistics to `%s'\n"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:140
+#: src/statistics/gnunet-statistics.c:145
 msgid "Failed to obtain statistics.\n"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:142
+#: src/statistics/gnunet-statistics.c:148
 #, c-format
 msgid "Failed to obtain statistics from host `%s:%llu'\n"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:189
+#: src/statistics/gnunet-statistics.c:198
 msgid "Missing argument: subsystem \n"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:195
+#: src/statistics/gnunet-statistics.c:204
 msgid "Missing argument: name\n"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:226
+#: src/statistics/gnunet-statistics.c:235
 #, c-format
 msgid "No subsystem or name given\n"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:234
+#: src/statistics/gnunet-statistics.c:243
 #, c-format
 msgid "Failed to initialize watch routine\n"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:261
+#: src/statistics/gnunet-statistics.c:269
 #, c-format
 msgid "Trying to connect to remote host, but service `%s' is not running\n"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:269
+#: src/statistics/gnunet-statistics.c:282
 #, c-format
 msgid "A port is required to connect to host `%s'\n"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:276
+#: src/statistics/gnunet-statistics.c:290
 #, c-format
 msgid "A port has to be between 1 and 65535 to connect to host `%s'\n"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:308
+#: src/statistics/gnunet-statistics.c:323
 #, c-format
 msgid "Invalid argument `%s'\n"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:334
+#: src/statistics/gnunet-statistics.c:349
 msgid "limit output to statistics for the given NAME"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:337
+#: src/statistics/gnunet-statistics.c:352
 msgid "make the value being set persistent"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:340
+#: src/statistics/gnunet-statistics.c:355
 msgid "limit output to the given SUBSYSTEM"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:343
+#: src/statistics/gnunet-statistics.c:358
 msgid "just print the statistics value"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:346
+#: src/statistics/gnunet-statistics.c:361
 msgid "watch value continuously"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:349
+#: src/statistics/gnunet-statistics.c:364
 msgid "connect to remote host"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:352
+#: src/statistics/gnunet-statistics.c:367
 msgid "port for remote host"
 msgstr ""
 
-#: src/statistics/gnunet-statistics.c:364
+#: src/statistics/gnunet-statistics.c:379
 msgid "Print statistics about GNUnet operations."
 msgstr ""
 
@@ -5848,61 +6439,64 @@
 msgstr ""
 
 #: src/statistics/statistics_api.c:1090
-msgid "Failed to receive acknowledgement from statistics service, some 
statistics might have been lost!\n"
+msgid ""
+"Failed to receive acknowledgement from statistics service, some statistics "
+"might have been lost!\n"
 msgstr ""
 
-#: src/testbed/generate-underlay-topology.c:223
-msgid "Need atleast 2 arguments\n"
+#: src/testbed/generate-underlay-topology.c:225
+msgid "Need at least 2 arguments\n"
 msgstr ""
 
-#: src/testbed/generate-underlay-topology.c:228
+#: src/testbed/generate-underlay-topology.c:230
 msgid "Database filename missing\n"
 msgstr ""
 
-#: src/testbed/generate-underlay-topology.c:235
+#: src/testbed/generate-underlay-topology.c:237
 msgid "Topology string missing\n"
 msgstr ""
 
-#: src/testbed/generate-underlay-topology.c:240
+#: src/testbed/generate-underlay-topology.c:242
 #, c-format
 msgid "Invalid topology: %s\n"
 msgstr ""
 
-#: src/testbed/generate-underlay-topology.c:252
+#: src/testbed/generate-underlay-topology.c:255
 #, c-format
 msgid "An argument is missing for given topology `%s'\n"
 msgstr ""
 
-#: src/testbed/generate-underlay-topology.c:258
+#: src/testbed/generate-underlay-topology.c:261
 #, c-format
 msgid "Invalid argument `%s' given as topology argument\n"
 msgstr ""
 
-#: src/testbed/generate-underlay-topology.c:266
+#: src/testbed/generate-underlay-topology.c:269
 #, c-format
 msgid "Filename argument missing for topology `%s'\n"
 msgstr ""
 
-#: src/testbed/generate-underlay-topology.c:280
+#: src/testbed/generate-underlay-topology.c:283
 #, c-format
 msgid "Second argument for topology `%s' is missing\n"
 msgstr ""
 
-#: src/testbed/generate-underlay-topology.c:286
+#: src/testbed/generate-underlay-topology.c:289
 #, c-format
 msgid "Invalid argument `%s'; expecting unsigned int\n"
 msgstr ""
 
-#: src/testbed/generate-underlay-topology.c:335
+#: src/testbed/generate-underlay-topology.c:338
 #: src/testbed/gnunet-testbed-profiler.c:293
 msgid "create COUNT number of peers"
 msgstr ""
 
-#: src/testbed/generate-underlay-topology.c:344
+#: src/testbed/generate-underlay-topology.c:347
 msgid ""
 "Generates SQLite3 database representing a given underlay topology.\n"
 "Usage: gnunet-underlay-topology [OPTIONS] db-filename TOPO [TOPOOPTS]\n"
-"The following options are available for TOPO followed by TOPOOPTS if 
applicable:\n"
+"The following options are available for TOPO followed by TOPOOPTS if "
+"applicable:\n"
 "\t LINE\n"
 "\t RING\n"
 "\t RANDOM <num_rnd_links>\n"
@@ -5917,30 +6511,34 @@
 "\t cap: the maximum number of links a node can have\n"
 "\t m: the number of links a node should have while joining the network\n"
 "\t filename: the path of the file which contains topology information\n"
-"NOTE: the format of the above file is descibed here: 
https://www.gnunet.org/content/topology-file-format\n";
+"NOTE: the format of the above file is descibed here: https://www.gnunet.org/";
+"content/topology-file-format\n"
 msgstr ""
 
-#: src/testbed/gnunet-daemon-latency-logger.c:325
+#: src/testbed/gnunet-daemon-latency-logger.c:323
 msgid "Daemon to log latency values of connections to neighbours"
 msgstr ""
 
 #: src/testbed/gnunet-daemon-testbed-blacklist.c:264
-msgid "Daemon to restrict incoming transport layer connections during testbed 
deployments"
+msgid ""
+"Daemon to restrict incoming transport layer connections during testbed "
+"deployments"
 msgstr ""
 
 #: src/testbed/gnunet-daemon-testbed-underlay.c:235 src/testing/list-keys.c:50
-#: src/testing/testing.c:293 src/util/gnunet-ecc.c:217
+#: src/testing/testing.c:293 src/util/gnunet-ecc.c:295
 #, c-format
 msgid "Incorrect hostkey file format: %s\n"
 msgstr ""
 
-#: src/testbed/gnunet-daemon-testbed-underlay.c:474
+#: src/testbed/gnunet-daemon-testbed-underlay.c:476
 msgid "Daemon to restrict underlay network in testbed deployments"
 msgstr ""
 
 #: src/testbed/gnunet-service-testbed_cpustatus.c:730
 #, c-format
-msgid "Cannot open %s for writing load statistics.  Not logging load 
statistics\n"
+msgid ""
+"Cannot open %s for writing load statistics.  Not logging load statistics\n"
 msgstr ""
 
 #: src/testbed/gnunet-service-testbed_peers.c:1015
@@ -5965,17 +6563,15 @@
 msgid "Spawning process `%s'\n"
 msgstr ""
 
-#: src/testbed/gnunet-testbed-profiler.c:267
-#, c-format
-msgid "Exiting as the number of peers is %u\n"
-msgstr ""
-
 #: src/testbed/gnunet-testbed-profiler.c:296
 msgid "tolerate COUNT number of continious timeout failures"
 msgstr ""
 
 #: src/testbed/gnunet-testbed-profiler.c:299
-msgid "run profiler in non-interactive mode where upon testbed setup the 
profiler does not wait for a keystroke but continues to run until a termination 
signal is received"
+msgid ""
+"run profiler in non-interactive mode where upon testbed setup the profiler "
+"does not wait for a keystroke but continues to run until a termination "
+"signal is received"
 msgstr ""
 
 #: src/testbed/testbed_api_hosts.c:415
@@ -6047,12 +6643,16 @@
 
 #: src/testbed/testbed_api_testbed.c:1349
 #, c-format
-msgid "Maximum number of edges a peer can have in a scale free topology cannot 
be more than %u.  Given `%s = %llu'"
+msgid ""
+"Maximum number of edges a peer can have in a scale free topology cannot be "
+"more than %u.  Given `%s = %llu'"
 msgstr ""
 
 #: src/testbed/testbed_api_testbed.c:1365
 #, c-format
-msgid "The number of edges that can established when adding a new node to 
scale free topology cannot be more than %u.  Given `%s = %llu'"
+msgid ""
+"The number of edges that can established when adding a new node to scale "
+"free topology cannot be more than %u.  Given `%s = %llu'"
 msgstr ""
 
 #: src/testbed/testbed_api_topology.c:960
@@ -6116,7 +6716,9 @@
 msgstr ""
 
 #: src/testing/gnunet-testing.c:359
-msgid "number of unique configuration files to create, or number of the 
hostkey to extract"
+msgid ""
+"number of unique configuration files to create, or number of the hostkey to "
+"extract"
 msgstr ""
 
 #: src/testing/gnunet-testing.c:361
@@ -6151,7 +6753,9 @@
 
 #: src/testing/testing.c:1157
 #, c-format
-msgid "You attempted to create a testbed with more than %u hosts.  Please 
precompute more hostkeys first.\n"
+msgid ""
+"You attempted to create a testbed with more than %u hosts.  Please "
+"precompute more hostkeys first.\n"
 msgstr ""
 
 #: src/testing/testing.c:1166
@@ -6202,458 +6806,482 @@
 msgid "Directory for file `%s' does not seem to be writable.\n"
 msgstr ""
 
-#: src/topology/gnunet-daemon-topology.c:255
+#: src/topology/gnunet-daemon-topology.c:265
 msgid "# peers blacklisted"
 msgstr ""
 
-#: src/topology/gnunet-daemon-topology.c:388
+#: src/topology/gnunet-daemon-topology.c:406
 msgid "# connect requests issued to transport"
 msgstr ""
 
-#: src/topology/gnunet-daemon-topology.c:728
-#: src/topology/gnunet-daemon-topology.c:813
+#: src/topology/gnunet-daemon-topology.c:756
+#: src/topology/gnunet-daemon-topology.c:840
 msgid "# friends connected"
 msgstr ""
 
-#: src/topology/gnunet-daemon-topology.c:993
+#: src/topology/gnunet-daemon-topology.c:1020
 msgid "Failed to connect to core service, can not manage topology!\n"
 msgstr ""
 
-#: src/topology/gnunet-daemon-topology.c:1022
+#: src/topology/gnunet-daemon-topology.c:1049
 #, c-format
 msgid "Found myself `%s' in friend list (useless, ignored)\n"
 msgstr ""
 
-#: src/topology/gnunet-daemon-topology.c:1029
+#: src/topology/gnunet-daemon-topology.c:1056
 #, c-format
 msgid "Found friend `%s' in configuration\n"
 msgstr ""
 
-#: src/topology/gnunet-daemon-topology.c:1050
+#: src/topology/gnunet-daemon-topology.c:1077
 msgid "Encountered errors parsing friends list!\n"
 msgstr ""
 
-#: src/topology/gnunet-daemon-topology.c:1052
+#: src/topology/gnunet-daemon-topology.c:1079
 msgid "# friends in configuration"
 msgstr ""
 
-#: src/topology/gnunet-daemon-topology.c:1057
-msgid "Fewer friends specified than required by minimum friend count. Will 
only connect to friends.\n"
+#: src/topology/gnunet-daemon-topology.c:1084
+msgid ""
+"Fewer friends specified than required by minimum friend count. Will only "
+"connect to friends.\n"
 msgstr ""
 
-#: src/topology/gnunet-daemon-topology.c:1063
-msgid "More friendly connections required than target total number of 
connections.\n"
+#: src/topology/gnunet-daemon-topology.c:1090
+msgid ""
+"More friendly connections required than target total number of connections.\n"
 msgstr ""
 
-#: src/topology/gnunet-daemon-topology.c:1094
+#: src/topology/gnunet-daemon-topology.c:1121
+#: src/transport/plugin_transport_wlan.c:1478
 msgid "# HELLO messages received"
 msgstr ""
 
-#: src/topology/gnunet-daemon-topology.c:1151
+#: src/topology/gnunet-daemon-topology.c:1178
 msgid "# HELLO messages gossipped"
 msgstr ""
 
-#: src/topology/gnunet-daemon-topology.c:1290
-msgid "GNUnet topology control (maintaining P2P mesh and F2F constraints)"
+#: src/topology/gnunet-daemon-topology.c:1323
+msgid "GNUnet topology control (maintaining P2P cadet and F2F constraints)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_blacklist.c:271
+#: src/transport/gnunet-service-transport_ats.c:136
+msgid "# Addresses given to ATS"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_blacklist.c:286
 #, c-format
 msgid "Adding blacklisting entry for peer `%s'\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_blacklist.c:279
+#: src/transport/gnunet-service-transport_blacklist.c:295
 #, c-format
 msgid "Adding blacklisting entry for peer `%s':`%s'\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_blacklist.c:464
-#: src/transport/gnunet-service-transport_blacklist.c:745
+#: src/transport/gnunet-service-transport_blacklist.c:504
+#: src/transport/gnunet-service-transport_blacklist.c:855
 msgid "# disconnects due to blacklist"
 msgstr ""
 
-#: src/transport/gnunet-service-transport.c:220
+#: src/transport/gnunet-service-transport_blacklist.c:859
+#, c-format
+msgid "Disallowing connection to peer `%s' on transport %s\n"
+msgstr ""
+
+#: src/transport/gnunet-service-transport.c:231
 msgid "# bytes payload discarded due to not connected peer"
 msgstr ""
 
-#: src/transport/gnunet-service-transport.c:424
+#: src/transport/gnunet-service-transport.c:385
 msgid "# bytes total received"
 msgstr ""
 
-#: src/transport/gnunet-service-transport.c:515
+#: src/transport/gnunet-service-transport.c:480
 msgid "# bytes payload received"
 msgstr ""
 
-#: src/transport/gnunet-service-transport.c:686
-#, c-format
-msgid "Could not obtain a valid network for `%s' %s (%s)\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport.c:733
-#, c-format
-msgid "Address or session unknown: failed to update properties for peer `%s' 
plugin `%s' address `%s' session %p\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport.c:1084
+#: src/transport/gnunet-service-transport.c:818
 msgid "Transport service is lacking key configuration settings. Exiting.\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_clients.c:432
-#, c-format
-msgid "Dropping message of type %u and size %u, have %u/%u messages pending\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_clients.c:439
+#: src/transport/gnunet-service-transport_clients.c:481
 msgid "# messages dropped due to slow client"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_clients.c:596
-#, c-format
-msgid "Rejecting control connection from peer `%s', which is not me!\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_clients.c:737
+#: src/transport/gnunet-service-transport_clients.c:783
 msgid "# bytes payload dropped (other peer was not connected)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_clients.c:770
-#, c-format
-msgid "Blacklist refuses connection attempt to peer `%s'\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_clients.c:776
-#, c-format
-msgid "Blacklist allows connection attempt to peer `%s'\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_clients.c:801
+#: src/transport/gnunet-service-transport_clients.c:827
 msgid "# REQUEST CONNECT messages received"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_clients.c:815
-#, c-format
-msgid "Received a request connect message for peer `%s'\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_clients.c:826
+#: src/transport/gnunet-service-transport_clients.c:864
 msgid "# REQUEST DISCONNECT messages received"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_clients.c:840
-#, c-format
-msgid "Received a request disconnect message for peer `%s'\n"
+#: src/transport/gnunet-service-transport_hello.c:188
+msgid "# refreshed my HELLO"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_hello.c:181
-msgid "# refreshed my HELLO"
+#: src/transport/gnunet-service-transport_neighbours.c:840
+msgid "# session creation failed"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1095
+#: src/transport/gnunet-service-transport_neighbours.c:1168
 msgid "# DISCONNECT messages sent"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1220
-#: src/transport/gnunet-service-transport_neighbours.c:1629
+#: src/transport/gnunet-service-transport_neighbours.c:1304
+#: src/transport/gnunet-service-transport_neighbours.c:1761
 msgid "# bytes in message queue for other peers"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1225
+#: src/transport/gnunet-service-transport_neighbours.c:1309
 msgid "# messages transmitted to other peers"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1230
+#: src/transport/gnunet-service-transport_neighbours.c:1315
 msgid "# transmission failures for messages to other peers"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1287
+#: src/transport/gnunet-service-transport_neighbours.c:1375
 msgid "# messages timed out while in transport queue"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1343
-msgid "# keepalives sent"
+#: src/transport/gnunet-service-transport_neighbours.c:1451
+msgid "# KEEPALIVES sent"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1376
+#: src/transport/gnunet-service-transport_neighbours.c:1487
 msgid "# KEEPALIVE messages discarded (peer unknown)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1384
+#: src/transport/gnunet-service-transport_neighbours.c:1495
 msgid "# KEEPALIVE messages discarded (no session)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1431
-msgid "# KEEPALIVE_RESPONSE messages discarded (not connected)"
+#: src/transport/gnunet-service-transport_neighbours.c:1505
+msgid "# KEEPALIVES received in good order"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1440
-msgid "# KEEPALIVE_RESPONSE messages discarded (not expected)"
+#: src/transport/gnunet-service-transport_neighbours.c:1550
+msgid "# KEEPALIVE_RESPONSEs discarded (not connected)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1448
-msgid "# KEEPALIVE_RESPONSE messages discarded (address changed)"
+#: src/transport/gnunet-service-transport_neighbours.c:1559
+msgid "# KEEPALIVE_RESPONSEs discarded (not expected)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1456
-msgid "# KEEPALIVE_RESPONSE messages discarded (wrong nonce)"
+#: src/transport/gnunet-service-transport_neighbours.c:1567
+msgid "# KEEPALIVE_RESPONSEs discarded (address changed)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1534
+#: src/transport/gnunet-service-transport_neighbours.c:1576
+msgid "# KEEPALIVE_RESPONSEs discarded (no nonce)"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_neighbours.c:1581
+msgid "# KEEPALIVE_RESPONSEs discarded (bad nonce)"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_neighbours.c:1587
+msgid "# KEEPALIVE_RESPONSEs received (OK)"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_neighbours.c:1658
 msgid "# messages discarded due to lack of neighbour record"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1568
+#: src/transport/gnunet-service-transport_neighbours.c:1692
 msgid "# bandwidth quota violations by other peers"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1584
+#: src/transport/gnunet-service-transport_neighbours.c:1707
 msgid "# ms throttling suggested"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1678
+#: src/transport/gnunet-service-transport_neighbours.c:1827
 #, c-format
-msgid "Failed to send CONNECT message to peer `%s' using address `%s' session 
%p\n"
+msgid "Failed to send SYN message to peer `%s'\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1705
-msgid "# Failed attempts to switch addresses (failed to send CONNECT CONT)"
+#: src/transport/gnunet-service-transport_neighbours.c:1847
+msgid "# Failed attempts to switch addresses (failed to send SYN CONT)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1751
-msgid "# SESSION_CONNECT messages sent"
+#: src/transport/gnunet-service-transport_neighbours.c:1886
+msgid "# SYN messages sent"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1767
+#: src/transport/gnunet-service-transport_neighbours.c:1903
 #, c-format
-msgid "Failed to transmit CONNECT message via plugin to %s\n"
+msgid "Failed to transmit SYN message to %s\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1794
-msgid "# Failed attempts to switch addresses (failed to send CONNECT)"
+#: src/transport/gnunet-service-transport_neighbours.c:1933
+msgid "# Failed attempts to switch addresses (failed to send SYN)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1844
+#: src/transport/gnunet-service-transport_neighbours.c:1998
 #, c-format
-msgid "Failed to send CONNECT_ACK message to peer `%s' using address `%s' 
session %p\n"
+msgid "Failed to send SYN_ACK message to peer `%s' using address `%s'\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1899
-msgid "# CONNECT_ACK messages sent"
+#: src/transport/gnunet-service-transport_neighbours.c:2052
+msgid "# SYN_ACK messages sent"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:1914
+#: src/transport/gnunet-service-transport_neighbours.c:2069
 #, c-format
-msgid "Failed to transmit CONNECT_ACK message via plugin to %s\n"
+msgid "Failed to transmit SYN_ACK message to %s\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:2192
+#: src/transport/gnunet-service-transport_neighbours.c:2225
 #, c-format
 msgid "Blacklisting disapproved to connect to peer `%s'\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:2312
-msgid "# CONNECT messages received"
+#: src/transport/gnunet-service-transport_neighbours.c:2352
+msgid "# SYN messages received"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:2317
+#: src/transport/gnunet-service-transport_neighbours.c:2357
 #, c-format
-msgid "CONNECT request from peer `%s' ignored due impending shutdown\n"
+msgid "SYN request from peer `%s' ignored due impending shutdown\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:2590
+#: src/transport/gnunet-service-transport_neighbours.c:2726
 msgid "# Attempts to switch addresses"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3012
-msgid "# Failed attempts to switch addresses (no response)"
+#: src/transport/gnunet-service-transport_neighbours.c:3212
+msgid "# SYN_ACK messages received"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3107
-msgid "# CONNECT_ACK messages received"
+#: src/transport/gnunet-service-transport_neighbours.c:3220
+msgid "# unexpected SYN_ACK messages (no peer)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3115
-msgid "# unexpected CONNECT_ACK messages (no peer)"
+#: src/transport/gnunet-service-transport_neighbours.c:3238
+#: src/transport/gnunet-service-transport_neighbours.c:3262
+msgid "# unexpected SYN_ACK messages (not ready)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3129
-#: src/transport/gnunet-service-transport_neighbours.c:3164
-msgid "# unexpected CONNECT_ACK messages (not ready)"
+#: src/transport/gnunet-service-transport_neighbours.c:3274
+msgid "# unexpected SYN_ACK messages (waiting on ATS)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3176
-msgid "# unexpected CONNECT_ACK messages (waiting on ATS)"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_neighbours.c:3200
+#: src/transport/gnunet-service-transport_neighbours.c:3299
 msgid "# Successful attempts to switch addresses"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3208
-msgid "# unexpected CONNECT_ACK messages (disconnecting)"
+#: src/transport/gnunet-service-transport_neighbours.c:3312
+msgid "# unexpected SYN_ACK messages (disconnecting)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3396
-msgid "# SESSION_ACK messages received"
+#: src/transport/gnunet-service-transport_neighbours.c:3506
+msgid "# ACK messages received"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3424
-msgid "# unexpected SESSION_ACK messages"
+#: src/transport/gnunet-service-transport_neighbours.c:3541
+msgid "# unexpected ACK messages"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3490
+#: src/transport/gnunet-service-transport_neighbours.c:3595
 msgid "# SET QUOTA messages ignored (no such peer)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3505
+#: src/transport/gnunet-service-transport_neighbours.c:3624
 msgid "# disconnects due to quota of 0"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3545
+#: src/transport/gnunet-service-transport_neighbours.c:3672
+msgid "# quota messages ignored (malformed)"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_neighbours.c:3679
+msgid "# QUOTA messages received"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_neighbours.c:3720
 msgid "# disconnect messages ignored (malformed)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3551
+#: src/transport/gnunet-service-transport_neighbours.c:3727
 msgid "# DISCONNECT messages received"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3560
+#: src/transport/gnunet-service-transport_neighbours.c:3738
 msgid "# disconnect messages ignored (timestamp)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_neighbours.c:3687
+#: src/transport/gnunet-service-transport_neighbours.c:3867
 msgid "# disconnected from peer upon explicit request"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_plugins.c:120
+#: src/transport/gnunet-service-transport_plugins.c:158
 msgid "Transport service is lacking NEIGHBOUR_LIMIT option.\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_plugins.c:178
-#: src/transport/gnunet-service-transport_plugins.c:186
-#: src/transport/gnunet-service-transport_plugins.c:194
-#: src/transport/gnunet-service-transport_plugins.c:202
-#: src/transport/gnunet-service-transport_plugins.c:210
-#: src/transport/gnunet-service-transport_plugins.c:218
-#: src/transport/gnunet-service-transport_plugins.c:226
-#: src/transport/gnunet-service-transport_plugins.c:234
-#: src/transport/gnunet-service-transport_plugins.c:242
-#: src/transport/gnunet-service-transport_plugins.c:250
-#: src/transport/gnunet-service-transport_plugins.c:258
+#: src/transport/gnunet-service-transport_plugins.c:223
+#: src/transport/gnunet-service-transport_plugins.c:231
+#: src/transport/gnunet-service-transport_plugins.c:239
+#: src/transport/gnunet-service-transport_plugins.c:247
+#: src/transport/gnunet-service-transport_plugins.c:255
+#: src/transport/gnunet-service-transport_plugins.c:263
+#: src/transport/gnunet-service-transport_plugins.c:271
+#: src/transport/gnunet-service-transport_plugins.c:279
+#: src/transport/gnunet-service-transport_plugins.c:287
+#: src/transport/gnunet-service-transport_plugins.c:295
+#: src/transport/gnunet-service-transport_plugins.c:303
 #, c-format
 msgid "Missing function `%s' in transport plugin for `%s'\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_plugins.c:265
+#: src/transport/gnunet-service-transport_plugins.c:310
 #, c-format
 msgid "Did not load plugin `%s' due to missing functions\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:488
-msgid "# address records discarded"
+#: src/transport/gnunet-service-transport_validation.c:343
+msgid "# Addresses in validation map"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:558
-#, c-format
-msgid "Not transmitting `%s' with `%s', message too big (%u bytes!). This 
should not happen.\n"
+#: src/transport/gnunet-service-transport_validation.c:450
+#: src/transport/gnunet-service-transport_validation.c:638
+#: src/transport/gnunet-service-transport_validation.c:927
+#: src/transport/gnunet-service-transport_validation.c:1508
+msgid "# validations running"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:616
-msgid "# PING without HELLO messages sent"
+#: src/transport/gnunet-service-transport_validation.c:493
+msgid "# address records discarded (timeout)"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:722
+#: src/transport/gnunet-service-transport_validation.c:541
+msgid "# address records discarded (blacklist)"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_validation.c:629
+msgid "# PINGs for address validation sent"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_validation.c:711
+msgid "# validations delayed by global throttle"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_validation.c:748
 msgid "# address revalidations started"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:1011
+#: src/transport/gnunet-service-transport_validation.c:1048
 msgid "# PING message for different peer received"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:1062
+#: src/transport/gnunet-service-transport_validation.c:1099
 #, c-format
 msgid "Plugin `%s' not available, cannot confirm having this address\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:1072
+#: src/transport/gnunet-service-transport_validation.c:1112
 msgid "# failed address checks during validation"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:1075
+#: src/transport/gnunet-service-transport_validation.c:1115
 #, c-format
 msgid "Address `%s' is not one of my addresses, not confirming PING\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:1083
+#: src/transport/gnunet-service-transport_validation.c:1123
 msgid "# successful address checks during validation"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:1095
+#: src/transport/gnunet-service-transport_validation.c:1136
 #, c-format
-msgid "Not confirming PING from peer `%s' with address `%s' since I cannot 
confirm having this address.\n"
+msgid ""
+"Not confirming PING from peer `%s' with address `%s' since I cannot confirm "
+"having this address.\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:1103
+#: src/transport/gnunet-service-transport_validation.c:1191
 #, c-format
-msgid "Received a PING message with validation bug from `%s'\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_validation.c:1157
-#, c-format
 msgid "Failed to create PONG signature for peer `%s'\n"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:1206
+#: src/transport/gnunet-service-transport_validation.c:1242
 msgid "# PONGs unicast via reliable transport"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:1215
+#: src/transport/gnunet-service-transport_validation.c:1251
 msgid "# PONGs multicast to all available addresses"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:1356
+#: src/transport/gnunet-service-transport_validation.c:1408
 msgid "# PONGs dropped, no matching pending validation"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:1371
+#: src/transport/gnunet-service-transport_validation.c:1426
 msgid "# PONGs dropped, signature expired"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:1493
-#, c-format
-msgid "Validation received new %s message for peer `%s' with size %u\n"
+#: src/transport/gnunet-service-transport_validation.c:1478
+msgid "# validations succeeded"
 msgstr ""
 
-#: src/transport/gnunet-service-transport_validation.c:1500
+#: src/transport/gnunet-transport.c:580
 #, c-format
-msgid "Adding `%s' without addresses for peer `%s'\n"
-msgstr ""
-
-#: src/transport/gnunet-transport.c:367
-#, c-format
 msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:375
+#: src/transport/gnunet-transport.c:589
+#: src/transport/gnunet-transport-profiler.c:274
 #, c-format
 msgid "Received %llu bytes/s (%llu bytes in %s)\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:415
+#: src/transport/gnunet-transport.c:621
 #, c-format
 msgid "Failed to connect to `%s'\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:428
+#: src/transport/gnunet-transport.c:636
 #, c-format
 msgid "Failed to resolve address for peer `%s'\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:438
+#: src/transport/gnunet-transport.c:648
 msgid "Failed to list connections, timeout occured\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:559
+#: src/transport/gnunet-transport.c:675 src/transport/gnunet-transport.c:700
 #, c-format
+msgid "Configuration for plugin `%s' did not work!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:680
+#, c-format
+msgid "Configuration for plugin `%s' did work!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:685
+#, c-format
+msgid "Internal NAT error while running test for plugin `%s'\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:690
+#, c-format
+msgid "Failed to start NAT test for plugin `%s'\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:695
+#, c-format
+msgid "Timeout while waiting for result of NAT test for plugin `%s'\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:820
+#, c-format
 msgid ""
 "Peer `%s' %s %s\n"
 "\t%s%s\n"
@@ -6661,329 +7289,420 @@
 "\t%s%s\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:586
+#: src/transport/gnunet-transport.c:855
 #, c-format
 msgid "Peer `%s' %s `%s' \n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:712
+#: src/transport/gnunet-transport.c:949 src/transport/gnunet-transport.c:1744
+msgid "Monitor disconnected from transport service. Reconnecting.\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:1006
 msgid "No transport plugins configured, peer will never communicate\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:726
+#: src/transport/gnunet-transport.c:1020
 #, c-format
 msgid "No port configured for plugin `%s', cannot test it\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:789
+#: src/transport/gnunet-transport.c:1045
+msgid "Failed to start resolver!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:1091
 #, c-format
 msgid "Transmitting %u bytes to %s\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:810
+#: src/transport/gnunet-transport.c:1114
+#: src/transport/gnunet-transport-profiler.c:406
 #, c-format
 msgid "Successfully connected to `%s'\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:834
+#: src/transport/gnunet-transport.c:1138
 #, c-format
-msgid "Successfully connected to `%s', starting to send benchmark data in %u 
Kb blocks\n"
+msgid ""
+"Successfully connected to `%s', starting to send benchmark data in %u Kb "
+"blocks\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:865
+#: src/transport/gnunet-transport.c:1171
 #, c-format
 msgid "Successfully disconnected from `%s'\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:888
+#: src/transport/gnunet-transport.c:1194
+#: src/transport/gnunet-transport-profiler.c:434
 #, c-format
 msgid "Disconnected from peer `%s' while benchmarking\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:950
+#: src/transport/gnunet-transport.c:1219 src/transport/gnunet-transport.c:1245
 #, c-format
+msgid "%24s: %-17s %4s   (%u connections in total)\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:1221
+msgid "Connected to"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:1247
+msgid "Disconnected from"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:1271
+#: src/transport/gnunet-transport-profiler.c:458
+#, c-format
 msgid "Received %u bytes from %s\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:975
+#: src/transport/gnunet-transport.c:1311
 #, c-format
 msgid "Peer `%s': %s %s in state `%s' until %s\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:986
+#: src/transport/gnunet-transport.c:1323
 #, c-format
 msgid "Peer `%s': %s %s\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1197 src/transport/gnunet-transport.c:1222
+#: src/transport/gnunet-transport.c:1831
+#: src/transport/gnunet-transport-profiler.c:492
 msgid "Failed to send connect request to transport service\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1266
+#: src/transport/gnunet-transport.c:1866
+msgid "Failed to send disconnect request to transport service\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:1910
 #, c-format
-msgid "Multiple operations given. Please choose only one operation: %s, %s, 
%s, %s, %s, %s\n"
+msgid ""
+"Multiple operations given. Please choose only one operation: %s, %s, %s, %s, "
+"%s, %s %s\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1274
+#: src/transport/gnunet-transport.c:1918
 #, c-format
-msgid "No operation given. Please choose one operation: %s, %s, %s, %s, %s, 
%s\n"
+msgid ""
+"No operation given. Please choose one operation: %s, %s, %s, %s, %s, %s, %s\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1293 src/transport/gnunet-transport.c:1323
-#: src/transport/gnunet-transport.c:1353 src/transport/gnunet-transport.c:1376
-#: src/transport/gnunet-transport.c:1419
+#: src/transport/gnunet-transport.c:1937 src/transport/gnunet-transport.c:1967
+#: src/transport/gnunet-transport.c:2000 src/transport/gnunet-transport.c:2026
+#: src/transport/gnunet-transport.c:2085
+#: src/transport/gnunet-transport-profiler.c:578
 msgid "Failed to connect to transport service\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1302 src/transport/gnunet-transport.c:1332
-#: src/transport/gnunet-transport.c:1362
+#: src/transport/gnunet-transport.c:1946 src/transport/gnunet-transport.c:1977
+#: src/transport/gnunet-transport.c:2011
 msgid "Failed to send request to transport service\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1381
+#: src/transport/gnunet-transport.c:2031
 msgid "Starting to receive benchmark data\n"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1465
-msgid "print information for all peers (instead of only connected peers )"
+#: src/transport/gnunet-transport.c:2133
+msgid "print information for all peers (instead of only connected peers)"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1468
+#: src/transport/gnunet-transport.c:2136
 msgid "measure how fast we are receiving data from all peers (until CTRL-C)"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1471
+#: src/transport/gnunet-transport.c:2139
 msgid "connect to a peer"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1474
+#: src/transport/gnunet-transport.c:2142
 msgid "disconnect to a peer"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1477
+#: src/transport/gnunet-transport.c:2145
 msgid "print information for all pending validations "
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1480
-msgid "print information for all pending validations continously"
+#: src/transport/gnunet-transport.c:2148
+msgid "print information for all pending validations continuously"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1483
+#: src/transport/gnunet-transport.c:2151
 msgid "provide information about all current connections (once)"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1489
-msgid "provide information about all connects and disconnect events 
(continuously)"
+#: src/transport/gnunet-transport.c:2157
+msgid ""
+"provide information about all connects and disconnect events (continuously)"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1491
+#: src/transport/gnunet-transport.c:2160
 msgid "do not resolve hostnames"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1493
+#: src/transport/gnunet-transport.c:2163
+#: src/transport/gnunet-transport-profiler.c:638
 msgid "peer identity"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1495
+#: src/transport/gnunet-transport.c:2166
+msgid "monitor plugin sessions"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:2169
 msgid "send data for benchmarking to the other peer (until CTRL-C)"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1498
+#: src/transport/gnunet-transport.c:2172
 msgid "test transport configuration (involves external server)"
 msgstr ""
 
-#: src/transport/gnunet-transport.c:1507
+#: src/transport/gnunet-transport.c:2183
+#: src/transport/gnunet-transport-profiler.c:649
 msgid "Direct access to transport service."
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:621
-msgid "# Bluetooth ACKs sent"
+#: src/transport/gnunet-transport-profiler.c:218
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:640
-msgid "# Bluetooth messages defragmented"
+#: src/transport/gnunet-transport-profiler.c:254
+#, c-format
+msgid "%u;%u;%llu;%llu;%.2f;%.2f"
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:686
-#: src/transport/plugin_transport_bluetooth.c:737
-#: src/transport/plugin_transport_bluetooth.c:1942
-msgid "# Bluetooth sessions allocated"
+#: src/transport/gnunet-transport-profiler.c:263
+#, c-format
+msgid ";%llu;%.2f"
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:837
-msgid "# Bluetooth message fragments sent"
+#: src/transport/gnunet-transport-profiler.c:280
+msgid "\n"
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:861
-msgid "# Bluetooth messages pending (with fragmentation)"
+#: src/transport/gnunet-transport-profiler.c:332
+msgid "."
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:969
-#: src/transport/plugin_transport_bluetooth.c:1054
-#: src/transport/plugin_transport_bluetooth.c:1944
-msgid "# Bluetooth MAC endpoints allocated"
+#: src/transport/gnunet-transport-profiler.c:352
+#, c-format
+msgid ""
+"\n"
+"Starting benchmark to `%s', starting to send %u messages in %u byte blocks\n"
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:1307
-msgid "# HELLO messages received via Bluetooth"
+#: src/transport/gnunet-transport-profiler.c:400
+#, c-format
+msgid "Connected to different peer `%s'\n"
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:1331
-msgid "# fragments received via Bluetooth"
+#: src/transport/gnunet-transport-profiler.c:483
+#, c-format
+msgid "Retrying to connect to `%s'\n"
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:1341
-msgid "# ACKs received via Bluetooth"
+#: src/transport/gnunet-transport-profiler.c:508
+#, c-format
+msgid "Denying connection to `%s'\n"
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:1401
-msgid "# Bluetooth DATA messages discarded due to CRC32 error"
+#: src/transport/gnunet-transport-profiler.c:537
+msgid "Message size too big!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:1512
-msgid "# DATA messages received via Bluetooth"
+#: src/transport/gnunet-transport-profiler.c:543
+msgid "No peer identity given\n"
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:1547
-msgid "# Bluetooth DATA messages processed"
+#: src/transport/gnunet-transport-profiler.c:558
+#, c-format
+msgid "Trying to send %u messages with size %u to peer `%s'\n"
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:1610
-msgid "# HELLO beacons sent via Bluetooth"
+#: src/transport/gnunet-transport-profiler.c:564
+#, c-format
+msgid "Trying to receive messages from peer `%s'\n"
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:1723
-msgid "Bluetooth address with invalid size encountered\n"
+#: src/transport/gnunet-transport-profiler.c:569
+msgid "No operation given\n"
 msgstr ""
 
-#: src/transport/plugin_transport_bluetooth.c:1923
-#, c-format
-msgid "Helper binary `%s' not SUID, cannot run bluetooth transport\n"
+#: src/transport/gnunet-transport-profiler.c:623
+msgid "send data to peer"
 msgstr ""
 
-#: src/transport/plugin_transport_http_client.c:1622
+#: src/transport/gnunet-transport-profiler.c:626
+msgid "receive data from peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:629
+msgid "iterations"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:632
+#, fuzzy
+msgid "number of messages to send"
+msgstr "nombre de valeurs"
+
+#: src/transport/gnunet-transport-profiler.c:635
+msgid "message size to use"
+msgstr ""
+
+#: src/transport/plugin_transport_http_client.c:1481
+#: src/transport/plugin_transport_http_server.c:2247
+#: src/transport/plugin_transport_http_server.c:3414
+#: src/transport/plugin_transport_tcp.c:2923
+#: src/transport/plugin_transport_tcp.c:2930
+msgid "TCP_STEALTH not supported on this platform.\n"
+msgstr ""
+
+#: src/transport/plugin_transport_http_client.c:2106
 #, c-format
 msgid "Could not initialize curl multi handle, failed to start %s plugin!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_client.c:1697
-#: src/transport/plugin_transport_http_server.c:3007
+#: src/transport/plugin_transport_http_client.c:2155
+#: src/transport/plugin_transport_http_server.c:3148
 #, c-format
 msgid "Shutting down plugin `%s'\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_client.c:1722
-#: src/transport/plugin_transport_http_server.c:3063
+#: src/transport/plugin_transport_http_client.c:2172
+#: src/transport/plugin_transport_http_server.c:3218
 #, c-format
 msgid "Shutdown for plugin `%s' complete\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_client.c:1750
-#: src/transport/plugin_transport_http_server.c:2907
+#: src/transport/plugin_transport_http_client.c:2206
 #, c-format
-msgid "Maximum number of connections is %u\n"
+msgid "Maximum number of requests is %u\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:1402
+#: src/transport/plugin_transport_http_server.c:1734
 #, c-format
-msgid "Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload 
data size %u\n"
+msgid ""
+"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
+"size %u\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:1663
+#: src/transport/plugin_transport_http_server.c:1965
 #, c-format
 msgid "Accepting connection (%u of %u) from `%s'\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:1671
+#: src/transport/plugin_transport_http_server.c:1973
 #, c-format
-msgid "Server reached maximum number connections (%u), rejecting new 
connection\n"
+msgid ""
+"Server reached maximum number connections (%u), rejecting new connection\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:1958
-msgid "Could not create a new TLS certificate, program 
`gnunet-transport-certificate-creation' could not be started!\n"
+#: src/transport/plugin_transport_http_server.c:2123
+msgid ""
+"Could not create a new TLS certificate, program `gnunet-transport-"
+"certificate-creation' could not be started!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:1982
+#: src/transport/plugin_transport_http_server.c:2146
 #, c-format
 msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2405
+#: src/transport/plugin_transport_http_server.c:2273
+msgid "Could not load or create server certificate! Loading plugin failed!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_http_server.c:2582
 msgid "Require valid port number for service in configuration!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2437 src/util/service.c:698
+#: src/transport/plugin_transport_http_server.c:2616 src/util/service.c:704
 #, c-format
 msgid "Failed to resolve `%s': %s\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2454 src/util/service.c:715
+#: src/transport/plugin_transport_http_server.c:2634 src/util/service.c:723
 #, c-format
 msgid "Failed to find %saddress for `%s'.\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2565
+#: src/transport/plugin_transport_http_server.c:2747
 #, c-format
 msgid "Found %u addresses to report to NAT service\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2637
+#: src/transport/plugin_transport_http_server.c:2825
+#: src/transport/plugin_transport_udp.c:3335
 msgid "Disabling IPv6 since it is not supported on this system!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2730
+#: src/transport/plugin_transport_http_server.c:2924
 #, c-format
 msgid "IPv4 support is %s\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2744
+#: src/transport/plugin_transport_http_server.c:2939
 #, c-format
 msgid "IPv6 support is %s\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2751
+#: src/transport/plugin_transport_http_server.c:2945
 msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2762
+#: src/transport/plugin_transport_http_server.c:2956
 msgid "Port is required! Fix in configuration\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2769
+#: src/transport/plugin_transport_http_server.c:2962
 #, c-format
 msgid "Using port %u\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2784
+#: src/transport/plugin_transport_http_server.c:2976
 #, c-format
 msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2794
+#: src/transport/plugin_transport_http_server.c:2986
 #, c-format
 msgid "Binding to IPv4 address %s\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2815
+#: src/transport/plugin_transport_http_server.c:3008
 #, c-format
 msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2825
+#: src/transport/plugin_transport_http_server.c:3018
 #, c-format
 msgid "Binding to IPv6 address %s\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2877
+#: src/transport/plugin_transport_http_server.c:3081
 #, c-format
 msgid "Using external hostname `%s'\n"
 msgstr ""
 
-#: src/transport/plugin_transport_http_server.c:2893
+#: src/transport/plugin_transport_http_server.c:3102
 #, c-format
 msgid "Notifying transport only about hostname `%s'\n"
 msgstr ""
 
+#: src/transport/plugin_transport_http_server.c:3119
+#, c-format
+msgid "Maximum number of connections is %u\n"
+msgstr ""
+
+#: src/transport/plugin_transport_http_server.c:3426
+msgid "Unable to compile URL regex\n"
+msgstr ""
+
 #: src/transport/plugin_transport_smtp.c:223
 #, c-format
 msgid "Received malformed message via %s. Ignored.\n"
@@ -7026,221 +7745,238 @@
 msgid "# bytes dropped by SMTP (outgoing)"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:555
+#: src/transport/plugin_transport_tcp.c:672
 #, c-format
 msgid "Unexpected address length: %u bytes\n"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:762
-#: src/transport/plugin_transport_tcp.c:928
-#: src/transport/plugin_transport_tcp.c:2005
-#: src/transport/plugin_transport_tcp.c:2558
+#: src/transport/plugin_transport_tcp.c:855
+#: src/transport/plugin_transport_tcp.c:1081
+#: src/transport/plugin_transport_tcp.c:2251
+#: src/transport/plugin_transport_tcp.c:3042
 msgid "# TCP sessions active"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:795
-#: src/transport/plugin_transport_tcp.c:921
-#: src/transport/plugin_transport_tcp.c:1009
-#: src/transport/plugin_transport_tcp.c:1056
-#: src/transport/plugin_transport_tcp.c:1219
-#: src/transport/plugin_transport_tcp.c:1237
+#: src/transport/plugin_transport_tcp.c:897
+#: src/transport/plugin_transport_tcp.c:1063
+#: src/transport/plugin_transport_tcp.c:1187
+#: src/transport/plugin_transport_tcp.c:1260
+#: src/transport/plugin_transport_tcp.c:1360
+#: src/transport/plugin_transport_tcp.c:1385
 msgid "# bytes currently in TCP buffers"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:798
+#: src/transport/plugin_transport_tcp.c:900
 msgid "# bytes discarded by TCP (disconnect)"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:1012
+#: src/transport/plugin_transport_tcp.c:1190
 msgid "# bytes discarded by TCP (timeout)"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:1059
+#: src/transport/plugin_transport_tcp.c:1264
 msgid "# bytes transmitted via TCP"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:1193
-#, c-format
-msgid "Trying to send with invalid session %p\n"
-msgstr ""
-
-#: src/transport/plugin_transport_tcp.c:1462
+#: src/transport/plugin_transport_tcp.c:1659
 msgid "# requests to create session with invalid address"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:1567
+#: src/transport/plugin_transport_tcp.c:1827
 msgid "# transport-service disconnect requests for TCP"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:2055
+#: src/transport/plugin_transport_tcp.c:2310
 msgid "# TCP WELCOME messages received"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:2215
+#: src/transport/plugin_transport_tcp.c:2501
 msgid "# bytes received via TCP"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:2279
+#: src/transport/plugin_transport_tcp.c:2552
+#: src/transport/plugin_transport_tcp.c:2610
+msgid "# TCP server connections active"
+msgstr ""
+
+#: src/transport/plugin_transport_tcp.c:2556
+msgid "# TCP server connect events"
+msgstr ""
+
+#: src/transport/plugin_transport_tcp.c:2562
+msgid "TCP connection limit reached, suspending server\n"
+msgstr ""
+
+#: src/transport/plugin_transport_tcp.c:2564
+msgid "# TCP service suspended"
+msgstr ""
+
+#: src/transport/plugin_transport_tcp.c:2604
+msgid "# TCP service resumed"
+msgstr ""
+
+#: src/transport/plugin_transport_tcp.c:2614
 msgid "# network-level TCP disconnect events"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:2437 src/util/service.c:582
-#: src/util/service.c:588
+#: src/transport/plugin_transport_tcp.c:2857 src/util/service.c:584
+#: src/util/service.c:590
 #, c-format
 msgid "Require valid port number for service `%s' in configuration!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:2451
+#: src/transport/plugin_transport_tcp.c:2873
 msgid "Failed to start service.\n"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:2547
+#: src/transport/plugin_transport_tcp.c:3030
 #, c-format
 msgid "TCP transport listening on port %llu\n"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:2551
+#: src/transport/plugin_transport_tcp.c:3034
 msgid "TCP transport not listening on any port (client only)\n"
 msgstr ""
 
-#: src/transport/plugin_transport_tcp.c:2554
+#: src/transport/plugin_transport_tcp.c:3038
 #, c-format
 msgid "TCP transport advertises itself as being on port %llu\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp_broadcasting.c:167
-msgid "# IPv6 multicast HELLO beacons received via udp"
+#: src/transport/plugin_transport_udp_broadcasting.c:170
+msgid "# Multicast HELLO beacons received via UDP"
 msgstr ""
 
-#: src/transport/plugin_transport_udp_broadcasting.c:210
-msgid "# IPv4 broadcast HELLO beacons received via udp"
+#: src/transport/plugin_transport_udp_broadcasting.c:548
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp_broadcasting.c:603
-msgid "Disabling HELLO broadcasting due to friend-to-friend only 
configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:626
+#: src/transport/plugin_transport_udp_broadcasting.c:569
 #, c-format
 msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:1513
+#: src/transport/plugin_transport_udp.c:3081
 #, c-format
-msgid "Trying to create session for address of unexpected length %u (should be 
%u or %u)\n"
+msgid ""
+"UDP could not transmit message to `%s': Network seems down, please check "
+"your network configuration\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:2602
+#: src/transport/plugin_transport_udp.c:3095
+msgid ""
+"UDP could not transmit IPv6 message! Please check your network configuration "
+"and disable IPv6 if your connection does not have a global IPv6 address\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp.c:3411
+#: src/transport/plugin_transport_udp.c:3510
 #, c-format
-msgid "UDP could not transmit message to `%s': Network seems down, please 
check your network configuration\n"
+msgid "Failed to bind UDP socket to %s: %s\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:2616
-msgid "UDP could not transmit IPv6 message! Please check your network 
configuration and disable IPv6 if your connection does not have a global IPv6 
address\n"
+#: src/transport/plugin_transport_udp.c:3429
+msgid "Disabling IPv4 since it is not supported on this system!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:2961
+#: src/transport/plugin_transport_udp.c:3520
 msgid "Failed to open UDP sockets\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3056
-#, c-format
-msgid "Given `%s' option is out of range: %llu > %u\n"
+#: src/transport/plugin_transport_udp.c:3591
+#: src/transport/plugin_transport_udp.c:3605
+msgid "must be in [0,65535]"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3097
-#, c-format
-msgid "Invalid IPv6 address: `%s'\n"
+#: src/transport/plugin_transport_udp.c:3637
+msgid "must be valid IPv4 address"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3168
-msgid "Failed to create network sockets, plugin failed\n"
+#: src/transport/plugin_transport_udp.c:3664
+msgid "must be valid IPv6 address"
 msgstr ""
 
-#: src/transport/plugin_transport_unix.c:1321
+#: src/transport/plugin_transport_udp.c:3730
+msgid "Failed to create UDP network sockets\n"
+msgstr ""
+
+#: src/transport/plugin_transport_unix.c:1393
 #, c-format
 msgid "Cannot create path to `%s'\n"
 msgstr ""
 
-#: src/transport/plugin_transport_unix.c:1652
-msgid "No UNIXPATH given in configuration!\n"
+#: src/transport/plugin_transport_unix.c:1406
+#, c-format
+msgid "Cannot bind to `%s'\n"
 msgstr ""
 
-#: src/transport/plugin_transport_unix.c:1688
+#: src/transport/plugin_transport_unix.c:1807
 msgid "Failed to open UNIX listen socket\n"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:620
-msgid "# WLAN ACKs sent"
+#: src/transport/plugin_transport_wlan.c:742
+msgid "# ACKs sent"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:639
-msgid "# WLAN messages defragmented"
+#: src/transport/plugin_transport_wlan.c:762
+msgid "# Messages defragmented"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:688
-#: src/transport/plugin_transport_wlan.c:772
-#: src/transport/plugin_transport_wlan.c:1948
-msgid "# WLAN sessions allocated"
+#: src/transport/plugin_transport_wlan.c:803
+#: src/transport/plugin_transport_wlan.c:890
+msgid "# Sessions allocated"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:876
-msgid "# WLAN message fragments sent"
+#: src/transport/plugin_transport_wlan.c:1011
+msgid "# message fragments sent"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:900
-msgid "# WLAN messages pending (with fragmentation)"
+#: src/transport/plugin_transport_wlan.c:1040
+msgid "# messages pending (with fragmentation)"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:1008
-#: src/transport/plugin_transport_wlan.c:1098
-#: src/transport/plugin_transport_wlan.c:1950
-msgid "# WLAN MAC endpoints allocated"
+#: src/transport/plugin_transport_wlan.c:1171
+#: src/transport/plugin_transport_wlan.c:1264
+#: src/transport/plugin_transport_wlan.c:2268
+msgid "# MAC endpoints allocated"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:1302
-msgid "# HELLO messages received via WLAN"
+#: src/transport/plugin_transport_wlan.c:1528
+msgid "# ACKs received"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:1326
-msgid "# fragments received via WLAN"
+#: src/transport/plugin_transport_wlan.c:1597
+msgid "# DATA messages discarded due to CRC32 error"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:1336
-msgid "# ACKs received via WLAN"
+#: src/transport/plugin_transport_wlan.c:1703
+msgid "# HELLO beacons sent"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:1396
-msgid "# WLAN DATA messages discarded due to CRC32 error"
+#: src/transport/plugin_transport_wlan.c:1820
+msgid "# DATA messages received"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:1518
-msgid "# DATA messages received via WLAN"
+#: src/transport/plugin_transport_wlan.c:1854
+msgid "# DATA messages processed"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:1553
-msgid "# WLAN DATA messages processed"
+#: src/transport/plugin_transport_wlan.c:2243
+#, c-format
+msgid "Helper binary `%s' not SUID, cannot run WLAN transport\n"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:1616
-msgid "# HELLO beacons sent via WLAN"
+#: src/transport/plugin_transport_wlan.c:2265
+msgid "# sessions allocated"
 msgstr ""
 
-#: src/transport/plugin_transport_wlan.c:1729
-msgid "WLAN address with invalid size encountered\n"
-msgstr ""
-
-#: src/transport/plugin_transport_wlan.c:1929
+#: src/transport/transport_api.c:812
 #, c-format
-msgid "Helper binary `%s' not SUID, cannot run WLAN transport\n"
-msgstr ""
-
-#: src/transport/transport_api.c:739
-#, c-format
 msgid "Received unexpected message of type %u in %s:%u\n"
 msgstr ""
 
-#: src/transport/transport-testing.c:584
+#: src/transport/transport-testing.c:603
 msgid "Failed to initialize testing library!\n"
 msgstr ""
 
@@ -7278,40 +8014,38 @@
 msgid "Metadata `%s' failed to deserialize"
 msgstr ""
 
-#: src/util/client.c:261 src/util/client.c:858 src/util/service.c:619
+#: src/util/client.c:263 src/util/client.c:889 src/util/service.c:621
 #, c-format
 msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
 msgstr ""
 
-#: src/util/client.c:265 src/util/client.c:863 src/util/service.c:623
+#: src/util/client.c:267 src/util/client.c:894 src/util/service.c:625
 #, c-format
 msgid "Using `%s' instead\n"
 msgstr ""
 
-#: src/util/client.c:360
+#: src/util/client.c:362
 #, c-format
-msgid "Could not determine valid hostname and port for service `%s' from 
configuration.\n"
+msgid ""
+"Could not determine valid hostname and port for service `%s' from "
+"configuration.\n"
 msgstr ""
 
-#: src/util/client.c:368
+#: src/util/client.c:370
 #, c-format
 msgid "Need a non-empty hostname for service `%s'.\n"
 msgstr ""
 
-#: src/util/client.c:1008
+#: src/util/client.c:1039
 #, c-format
 msgid "Could not connect to service `%s', configuration broken.\n"
 msgstr ""
 
-#: src/util/client.c:1020
+#: src/util/client.c:1051
 #, c-format
 msgid "Failure to transmit request to service `%s'\n"
 msgstr ""
 
-#: src/util/client.c:1303
-msgid "Could not submit request, not expecting to receive a response.\n"
-msgstr ""
-
 #: src/util/common_logging.c:254 src/util/common_logging.c:1039
 msgid "DEBUG"
 msgstr ""
@@ -7346,22 +8080,23 @@
 msgid "INVALID"
 msgstr ""
 
-#: src/util/common_logging.c:1157
+#: src/util/common_logging.c:1158
 msgid "unknown address"
 msgstr ""
 
-#: src/util/common_logging.c:1196
+#: src/util/common_logging.c:1200
 msgid "invalid address"
 msgstr ""
 
-#: src/util/common_logging.c:1214
+#: src/util/common_logging.c:1218
 #, c-format
 msgid "Configuration fails to specify option `%s' in section `%s'!\n"
 msgstr ""
 
-#: src/util/common_logging.c:1235
+#: src/util/common_logging.c:1239
 #, c-format
-msgid "Configuration specifies invalid value for option `%s' in section `%s': 
%s\n"
+msgid ""
+"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
 msgstr ""
 
 #: src/util/configuration.c:288
@@ -7369,99 +8104,91 @@
 msgid "Syntax error while deserializing in line %u\n"
 msgstr ""
 
-#: src/util/configuration.c:996
+#: src/util/configuration.c:1025
 #, c-format
-msgid "Configuration value '%s' for '%s' in section '%s' is not in set of 
legal choices\n"
+msgid ""
+"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
+"choices\n"
 msgstr ""
 
-#: src/util/configuration.c:1066
+#: src/util/configuration.c:1144
 #, c-format
 msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
 msgstr ""
 
-#: src/util/configuration.c:1098
+#: src/util/configuration.c:1176
 #, c-format
 msgid "Missing closing `%s' in option `%s'\n"
 msgstr ""
 
-#: src/util/configuration.c:1172
+#: src/util/configuration.c:1250
 #, c-format
-msgid "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor 
defined as an environmental variable\n"
+msgid ""
+"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
+"as an environmental variable\n"
 msgstr ""
 
-#: src/util/connection.c:423
+#: src/util/connection.c:424
 #, c-format
 msgid "Access denied to `%s'\n"
 msgstr ""
 
-#: src/util/connection.c:438
+#: src/util/connection.c:441
 #, c-format
 msgid "Accepting connection from `%s': %p\n"
 msgstr ""
 
-#: src/util/connection.c:553
-#, c-format
-msgid "Failed to establish TCP connection to `%s:%u', no further addresses to 
try.\n"
-msgstr ""
-
-#: src/util/connection.c:751 src/util/connection.c:919
-#, c-format
-msgid "Trying to connect to `%s' (%p)\n"
-msgstr ""
-
-#: src/util/connection.c:910
-#, c-format
-msgid "Attempt to connect to `%s' failed\n"
-msgstr ""
-
 #: src/util/container_bloomfilter.c:531
 #, c-format
-msgid "Size of file on disk is incorrect for this Bloom filter (want %llu, 
have %llu)\n"
+msgid ""
+"Size of file on disk is incorrect for this Bloom filter (want %llu, have "
+"%llu)\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:702 src/util/crypto_ecc.c:740
-#: src/util/crypto_ecc.c:858 src/util/crypto_ecc.c:896
+#: src/util/crypto_ecc.c:733 src/util/crypto_ecc.c:771
+#: src/util/crypto_ecc.c:889 src/util/crypto_ecc.c:927
 #, c-format
 msgid "Could not acquire lock on file `%s': %s...\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:707 src/util/crypto_ecc.c:863
+#: src/util/crypto_ecc.c:738 src/util/crypto_ecc.c:894
 msgid "Creating a new private key.  This may take a while.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:744 src/util/crypto_ecc.c:900
+#: src/util/crypto_ecc.c:775 src/util/crypto_ecc.c:931
 msgid "This may be ok if someone is currently generating a private key.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:774 src/util/crypto_ecc.c:930
+#: src/util/crypto_ecc.c:805 src/util/crypto_ecc.c:961
 #, c-format
-msgid "When trying to read key file `%s' I found %u bytes but I need at least 
%u.\n"
+msgid ""
+"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:778 src/util/crypto_ecc.c:934
+#: src/util/crypto_ecc.c:809 src/util/crypto_ecc.c:965
 msgid "This may be ok if someone is currently generating a key.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:1016
+#: src/util/crypto_ecc.c:1047
 msgid "Could not load peer's private key\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:1120
+#: src/util/crypto_ecc.c:1151
 #, c-format
 msgid "ECC signing failed at %s:%d: %s\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:1170
+#: src/util/crypto_ecc.c:1201
 #, c-format
 msgid "EdDSA signing failed at %s:%d: %s\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:1244
+#: src/util/crypto_ecc.c:1275
 #, c-format
 msgid "ECDSA signature verification failed at %s:%d: %s\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:1301
+#: src/util/crypto_ecc.c:1332
 #, c-format
 msgid "EdDSA signature verification failed at %s:%d: %s\n"
 msgstr ""
@@ -7471,12 +8198,17 @@
 msgid "libgcrypt has not the expected version (version %s is required).\n"
 msgstr ""
 
-#: src/util/disk.c:1184
+#: src/util/crypto_rsa.c:825
 #, c-format
+msgid "RSA signature verification failed at %s:%d: %s\n"
+msgstr ""
+
+#: src/util/disk.c:1222
+#, c-format
 msgid "Expected `%s' to be a directory!\n"
 msgstr ""
 
-#: src/util/disk.c:1546 src/util/service.c:1318
+#: src/util/disk.c:1584 src/util/service.c:1328
 #, c-format
 msgid "Cannot obtain information about user `%s': %s\n"
 msgstr ""
@@ -7541,126 +8273,137 @@
 msgid "Use %s to get a list of options.\n"
 msgstr ""
 
-#: src/util/getopt_helpers.c:84
+#: src/util/getopt_helpers.c:90
 #, c-format
-msgid "Arguments mandatory for long options are also mandatory for short 
options.\n"
+msgid ""
+"Arguments mandatory for long options are also mandatory for short options.\n"
 msgstr ""
 
-#: src/util/getopt_helpers.c:268 src/util/getopt_helpers.c:326
+#: src/util/getopt_helpers.c:274 src/util/getopt_helpers.c:332
 #, c-format
 msgid "You must pass a number to the `%s' option.\n"
 msgstr ""
 
-#: src/util/getopt_helpers.c:298
+#: src/util/getopt_helpers.c:304
 #, c-format
 msgid "You must pass relative time to the `%s' option.\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:90
+#: src/util/gnunet-config.c:111
 #, c-format
 msgid "--section argument is required\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:133
+#: src/util/gnunet-config.c:113
 #, c-format
+msgid "The following sections are available:\n"
+msgstr ""
+
+#: src/util/gnunet-config.c:157
+#, c-format
 msgid "--option argument required to set value\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:160
+#: src/util/gnunet-config.c:184
 msgid "obtain option of value as a filename (with $-expansion)"
 msgstr ""
 
-#: src/util/gnunet-config.c:163
+#: src/util/gnunet-config.c:187
 msgid "name of the section to access"
 msgstr ""
 
-#: src/util/gnunet-config.c:166
+#: src/util/gnunet-config.c:190
 msgid "name of the option to access"
 msgstr ""
 
-#: src/util/gnunet-config.c:169
+#: src/util/gnunet-config.c:193
 msgid "value to set"
 msgstr ""
 
-#: src/util/gnunet-config.c:178
+#: src/util/gnunet-config.c:196
+msgid "print available configuration sections"
+msgstr ""
+
+#: src/util/gnunet-config.c:205
 msgid "Manipulate GNUnet configuration files"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:75
+#: src/util/gnunet-ecc.c:81
 #, c-format
 msgid "Failed to open `%s': %s\n"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:81
+#: src/util/gnunet-ecc.c:117
 #, c-format
+msgid "Generating %u keys like %s, please wait"
+msgstr ""
+
+#: src/util/gnunet-ecc.c:130
+#, c-format
 msgid "Generating %u keys, please wait"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:97
+#: src/util/gnunet-ecc.c:171
 #, c-format
 msgid ""
 "\n"
 "Failed to write to `%s': %s\n"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:107
+#: src/util/gnunet-ecc.c:181
 #, c-format
 msgid ""
 "\n"
 "Finished!\n"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:110
+#: src/util/gnunet-ecc.c:184
 #, c-format
 msgid ""
 "\n"
 "Error, %u keys not generated\n"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:199
+#: src/util/gnunet-ecc.c:277
 #, c-format
 msgid "Hostkeys file `%s' not found\n"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:210
+#: src/util/gnunet-ecc.c:288
 #, c-format
 msgid "Hostkeys file `%s' is empty\n"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:232
+#: src/util/gnunet-ecc.c:310
 #, c-format
 msgid "Could not read hostkey file: %s\n"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:283
+#: src/util/gnunet-ecc.c:361
 msgid "No hostkey file specified on command line\n"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:349
+#: src/util/gnunet-ecc.c:411
 msgid "list keys included in a file (for testing)"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:352
+#: src/util/gnunet-ecc.c:414
 msgid "number of keys to list included in a file (for testing)"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:355
+#: src/util/gnunet-ecc.c:417
 msgid "create COUNT public-private key pairs (for testing)"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:358
+#: src/util/gnunet-ecc.c:420
 msgid "print the public key in ASCII format"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:361
-msgid "print the hash of the public key in ASCII format"
-msgstr ""
-
-#: src/util/gnunet-ecc.c:364
+#: src/util/gnunet-ecc.c:423
 msgid "print examples of ECC operations (used for compatibility testing)"
 msgstr ""
 
-#: src/util/gnunet-ecc.c:375
+#: src/util/gnunet-ecc.c:434
 msgid "Manipulate GNUnet private ECC key files"
 msgstr ""
 
@@ -7672,33 +8415,38 @@
 msgid "Use build-in GNUnet stub resolver"
 msgstr ""
 
-#: src/util/gnunet-scrypt.c:279
+#: src/util/gnunet-scrypt.c:233
+#, c-format
+msgid "Loading hostkey from `%s' failed.\n"
+msgstr ""
+
+#: src/util/gnunet-scrypt.c:294
 msgid "number of bits to require for the proof of work"
 msgstr ""
 
-#: src/util/gnunet-scrypt.c:282
+#: src/util/gnunet-scrypt.c:297
 msgid "file with private key, otherwise default is used"
 msgstr ""
 
-#: src/util/gnunet-scrypt.c:285
+#: src/util/gnunet-scrypt.c:300
 msgid "file with proof of work, otherwise default is used"
 msgstr ""
 
-#: src/util/gnunet-scrypt.c:288
+#: src/util/gnunet-scrypt.c:303
 msgid "time to wait between calculations"
 msgstr ""
 
-#: src/util/gnunet-scrypt.c:299
+#: src/util/gnunet-scrypt.c:315
 msgid "Manipulate GNUnet proof of work files"
 msgstr ""
 
-#: src/util/gnunet-service-resolver.c:299
+#: src/util/gnunet-service-resolver.c:310
 #, c-format
 msgid "Could not resolve `%s' (%s): %s\n"
 msgstr ""
 
-#: src/util/gnunet-service-resolver.c:371
-#: src/util/gnunet-service-resolver.c:412
+#: src/util/gnunet-service-resolver.c:382
+#: src/util/gnunet-service-resolver.c:423
 #, c-format
 msgid "Could not find IP of host `%s': %s\n"
 msgstr ""
@@ -7727,34 +8475,37 @@
 msgid "Perform default-actions for GNUnet URIs"
 msgstr ""
 
-#: src/util/helper.c:338
+#: src/util/helper.c:342
 #, c-format
 msgid "Error reading from `%s': %s\n"
 msgstr ""
 
-#: src/util/helper.c:383
+#: src/util/helper.c:388
 #, c-format
 msgid "Failed to parse inbound message from helper `%s'\n"
 msgstr ""
 
-#: src/util/helper.c:609
+#: src/util/helper.c:620
 #, c-format
 msgid "Error writing to `%s': %s\n"
 msgstr ""
 
-#: src/util/network.c:134
+#: src/util/network.c:137
 #, c-format
 msgid "Unable to shorten unix path `%s' while keeping name unique\n"
 msgstr ""
 
-#: src/util/network.c:1355 src/util/network.c:1480
+#: src/util/network.c:1681 src/util/network.c:1857
 #, c-format
-msgid "Fatal internal logic error, process hangs in `%s' (abort with 
CTRL-C)!\n"
+msgid ""
+"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
 msgstr ""
 
 #: src/util/os_installation.c:421
 #, c-format
-msgid "Could not determine installation path for %s.  Set `%s' environment 
variable.\n"
+msgid ""
+"Could not determine installation path for %s.  Set `%s' environment "
+"variable.\n"
 msgstr ""
 
 #: src/util/os_installation.c:766
@@ -7772,75 +8523,67 @@
 msgid "GetExitCodeProcess failed for binary %s (%d).\n"
 msgstr ""
 
-#: src/util/plugin.c:87
+#: src/util/plugin.c:86
 #, c-format
 msgid "Initialization of plugin mechanism failed: %s!\n"
 msgstr ""
 
-#: src/util/plugin.c:148
+#: src/util/plugin.c:151
 #, c-format
 msgid "`%s' failed to resolve method '%s' with error: %s\n"
 msgstr ""
 
-#: src/util/plugin.c:223
+#: src/util/plugin.c:226
 #, c-format
 msgid "`%s' failed for library `%s' with error: %s\n"
 msgstr ""
 
-#: src/util/plugin.c:382
+#: src/util/plugin.c:385
 msgid "Could not determine plugin installation path.\n"
 msgstr ""
 
-#: src/util/program.c:246 src/util/service.c:1452
+#: src/util/program.c:246 src/util/service.c:1462
 #, c-format
 msgid "Malformed configuration file `%s', exit ...\n"
 msgstr ""
 
-#: src/util/program.c:258 src/util/service.c:1467
+#: src/util/program.c:258 src/util/service.c:1477
 #, c-format
 msgid "Could not access configuration file `%s'\n"
 msgstr ""
 
-#: src/util/program.c:263 src/util/service.c:1462
+#: src/util/program.c:263 src/util/service.c:1472
 msgid "Malformed configuration, exit ...\n"
 msgstr ""
 
-#: src/util/resolver_api.c:198
+#: src/util/resolver_api.c:201
 #, c-format
 msgid "Must specify `%s' for `%s' in configuration!\n"
 msgstr ""
 
-#: src/util/resolver_api.c:216
+#: src/util/resolver_api.c:220
 #, c-format
-msgid "Must specify `%s' or numeric IP address for `%s' of `%s' in 
configuration!\n"
+msgid ""
+"Must specify `%s' or numeric IP address for `%s' of `%s' in configuration!\n"
 msgstr ""
 
-#: src/util/resolver_api.c:348
+#: src/util/resolver_api.c:354
 #, c-format
 msgid "Timeout trying to resolve IP address `%s'.\n"
 msgstr ""
 
-#: src/util/resolver_api.c:352
+#: src/util/resolver_api.c:361
 #, c-format
 msgid "Timeout trying to resolve hostname `%s'.\n"
 msgstr ""
 
-#: src/util/resolver_api.c:908
+#: src/util/resolver_api.c:1004
 #, c-format
 msgid "Could not resolve our FQDN : %s\n"
 msgstr ""
 
-#: src/util/scheduler.c:813
-msgid "Looks like we're busy waiting...\n"
-msgstr ""
-
-#: src/util/scheduler.c:948
+#: src/util/server.c:483
 #, c-format
-msgid "Attempt to cancel dead task %llu!\n"
-msgstr ""
-
-#: src/util/server.c:484
-#, c-format
 msgid "`%s' failed for port %d (%s).\n"
 msgstr ""
 
@@ -7854,9 +8597,11 @@
 msgid "`%s' failed for `%s': address already in use\n"
 msgstr ""
 
-#: src/util/server.c:892
+#: src/util/server.c:904
 #, c-format
-msgid "Processing code for message of type %u did not call 
`GNUNET_SERVER_receive_done' after %s\n"
+msgid ""
+"Processing code for message of type %u did not call "
+"`GNUNET_SERVER_receive_done' after %s\n"
 msgstr ""
 
 #: src/util/service.c:347
@@ -7869,77 +8614,80 @@
 msgid "Access from `%s' denied to service `%s'\n"
 msgstr ""
 
-#: src/util/service.c:409
+#: src/util/service.c:410
 #, c-format
 msgid "Could not parse IPv4 network specification `%s' for `%s:%s'\n"
 msgstr ""
 
-#: src/util/service.c:446
+#: src/util/service.c:448
 #, c-format
 msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
 msgstr ""
 
-#: src/util/service.c:563
+#: src/util/service.c:565
 #, c-format
-msgid "Disabling IPv6 support for service `%s', failed to create IPv6 socket: 
%s\n"
+msgid ""
+"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
 msgstr ""
 
-#: src/util/service.c:653
+#: src/util/service.c:656
 #, c-format
-msgid "Disabling UNIX domain socket support for service `%s', failed to create 
UNIX domain socket: %s\n"
+msgid ""
+"Disabling UNIX domain socket support for service `%s', failed to create UNIX "
+"domain socket: %s\n"
 msgstr ""
 
-#: src/util/service.c:669
+#: src/util/service.c:673
 #, c-format
 msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
 msgstr ""
 
-#: src/util/service.c:903
+#: src/util/service.c:912
 msgid "Could not access a pre-bound socket, will try to bind myself\n"
 msgstr ""
 
-#: src/util/service.c:952 src/util/service.c:970
+#: src/util/service.c:961 src/util/service.c:979
 #, c-format
 msgid "Specified value for `%s' of service `%s' is invalid\n"
 msgstr ""
 
-#: src/util/service.c:995
+#: src/util/service.c:1004
 #, c-format
 msgid "Could not access pre-bound socket %u, will try to bind myself\n"
 msgstr ""
 
-#: src/util/service.c:1165
+#: src/util/service.c:1175
 #, c-format
 msgid "Failed to start `%s' at `%s'\n"
 msgstr ""
 
-#: src/util/service.c:1207
+#: src/util/service.c:1217
 #, c-format
 msgid "Service `%s' runs at %s\n"
 msgstr ""
 
-#: src/util/service.c:1256
+#: src/util/service.c:1266
 msgid "Service process failed to initialize\n"
 msgstr ""
 
-#: src/util/service.c:1260
+#: src/util/service.c:1270
 msgid "Service process could not initialize server function\n"
 msgstr ""
 
-#: src/util/service.c:1264
+#: src/util/service.c:1274
 msgid "Service process failed to report status\n"
 msgstr ""
 
-#: src/util/service.c:1319
+#: src/util/service.c:1329
 msgid "No such user"
 msgstr ""
 
-#: src/util/service.c:1332
+#: src/util/service.c:1342
 #, c-format
 msgid "Cannot change user/group to `%s': %s\n"
 msgstr ""
 
-#: src/util/service.c:1402
+#: src/util/service.c:1412
 msgid "do daemonize (detach from terminal)"
 msgstr ""
 
@@ -7952,112 +8700,112 @@
 msgid "b"
 msgstr ""
 
-#: src/util/strings.c:433
+#: src/util/strings.c:434
 #, c-format
 msgid "Character sets requested were `%s'->`%s'\n"
 msgstr ""
 
-#: src/util/strings.c:561
+#: src/util/strings.c:562
 msgid "Failed to expand `$HOME': environment variable `HOME' not set"
 msgstr ""
 
-#: src/util/strings.c:658
+#: src/util/strings.c:659
 msgid "µs"
 msgstr ""
 
-#: src/util/strings.c:662
+#: src/util/strings.c:663
 msgid "forever"
 msgstr ""
 
-#: src/util/strings.c:664
+#: src/util/strings.c:665
 msgid "0 ms"
 msgstr ""
 
-#: src/util/strings.c:670
+#: src/util/strings.c:671
 msgid "ms"
 msgstr ""
 
-#: src/util/strings.c:676
+#: src/util/strings.c:677
 msgid "s"
 msgstr ""
 
-#: src/util/strings.c:682
+#: src/util/strings.c:683
 msgid "m"
 msgstr ""
 
-#: src/util/strings.c:688
+#: src/util/strings.c:689
 msgid "h"
 msgstr ""
 
-#: src/util/strings.c:695
+#: src/util/strings.c:696
 msgid "day"
 msgstr ""
 
-#: src/util/strings.c:697
+#: src/util/strings.c:698
 msgid "days"
 msgstr ""
 
-#: src/util/strings.c:726
+#: src/util/strings.c:727
 msgid "end of time"
 msgstr ""
 
-#: src/util/strings.c:1159
+#: src/util/strings.c:1226
 msgid "IPv6 address did not start with `['\n"
 msgstr ""
 
-#: src/util/strings.c:1167
+#: src/util/strings.c:1234
 msgid "IPv6 address did contain ':' to separate port number\n"
 msgstr ""
 
-#: src/util/strings.c:1173
+#: src/util/strings.c:1240
 msgid "IPv6 address did contain ']' before ':' to separate port number\n"
 msgstr ""
 
-#: src/util/strings.c:1180
+#: src/util/strings.c:1247
 msgid "IPv6 address did contain a valid port number after the last ':'\n"
 msgstr ""
 
-#: src/util/strings.c:1189
+#: src/util/strings.c:1256
 #, c-format
 msgid "Invalid IPv6 address `%s': %s\n"
 msgstr ""
 
-#: src/util/strings.c:1395 src/util/strings.c:1411
+#: src/util/strings.c:1462 src/util/strings.c:1478
 msgid "Port not in range\n"
 msgstr ""
 
-#: src/util/strings.c:1420
+#: src/util/strings.c:1487
 #, c-format
 msgid "Malformed port policy `%s'\n"
 msgstr ""
 
-#: src/util/strings.c:1503 src/util/strings.c:1534 src/util/strings.c:1582
-#: src/util/strings.c:1603
+#: src/util/strings.c:1570 src/util/strings.c:1601 src/util/strings.c:1649
+#: src/util/strings.c:1670
 #, c-format
 msgid "Invalid format for IP: `%s'\n"
 msgstr ""
 
-#: src/util/strings.c:1560
+#: src/util/strings.c:1627
 #, c-format
 msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
 msgstr ""
 
-#: src/util/strings.c:1612
+#: src/util/strings.c:1679
 #, c-format
 msgid "Invalid format: `%s'\n"
 msgstr ""
 
-#: src/util/strings.c:1664
+#: src/util/strings.c:1731
 #, c-format
 msgid "Invalid network notation (does not end with ';': `%s')\n"
 msgstr ""
 
-#: src/util/strings.c:1714
+#: src/util/strings.c:1781
 #, c-format
 msgid "Wrong format `%s' for netmask\n"
 msgstr ""
 
-#: src/util/strings.c:1745
+#: src/util/strings.c:1812
 #, c-format
 msgid "Wrong format `%s' for network\n"
 msgstr ""
@@ -8067,19 +8815,19 @@
 msgstr ""
 
 #: src/vpn/gnunet-service-vpn.c:642
-msgid "# Bytes given to mesh for transmission"
+msgid "# Bytes given to cadet for transmission"
 msgstr ""
 
 #: src/vpn/gnunet-service-vpn.c:680
-msgid "# Bytes dropped in mesh queue (overflow)"
+msgid "# Bytes dropped in cadet queue (overflow)"
 msgstr ""
 
 #: src/vpn/gnunet-service-vpn.c:753
-msgid "# Mesh channels created"
+msgid "# Cadet channels created"
 msgstr ""
 
 #: src/vpn/gnunet-service-vpn.c:784
-msgid "Failed to setup mesh channel!\n"
+msgid "Failed to setup cadet channel!\n"
 msgstr ""
 
 #: src/vpn/gnunet-service-vpn.c:978
@@ -8114,15 +8862,15 @@
 msgstr ""
 
 #: src/vpn/gnunet-service-vpn.c:1706
-msgid "# ICMP packets received from mesh"
+msgid "# ICMP packets received from cadet"
 msgstr ""
 
 #: src/vpn/gnunet-service-vpn.c:2045
-msgid "# UDP packets received from mesh"
+msgid "# UDP packets received from cadet"
 msgstr ""
 
 #: src/vpn/gnunet-service-vpn.c:2200
-msgid "# TCP packets received from mesh"
+msgid "# TCP packets received from cadet"
 msgstr ""
 
 #: src/vpn/gnunet-service-vpn.c:2351
@@ -8141,27 +8889,27 @@
 msgid "Failed to allocate IP address for new destination\n"
 msgstr ""
 
-#: src/vpn/gnunet-service-vpn.c:2982
+#: src/vpn/gnunet-service-vpn.c:2987
 msgid "Must specify valid IPv6 address"
 msgstr ""
 
-#: src/vpn/gnunet-service-vpn.c:3006
+#: src/vpn/gnunet-service-vpn.c:3011
 msgid "Must specify valid IPv6 mask"
 msgstr ""
 
-#: src/vpn/gnunet-service-vpn.c:3014
+#: src/vpn/gnunet-service-vpn.c:3019
 msgid "IPv6 support disabled as this system does not support IPv6\n"
 msgstr ""
 
-#: src/vpn/gnunet-service-vpn.c:3027
+#: src/vpn/gnunet-service-vpn.c:3032
 msgid "Must specify valid IPv4 address"
 msgstr ""
 
-#: src/vpn/gnunet-service-vpn.c:3040
+#: src/vpn/gnunet-service-vpn.c:3045
 msgid "Must specify valid IPv4 mask"
 msgstr ""
 
-#: src/vpn/gnunet-service-vpn.c:3050
+#: src/vpn/gnunet-service-vpn.c:3055
 msgid "IPv4 support disabled as this system does not support IPv4\n"
 msgstr ""
 
@@ -8230,18 +8978,18 @@
 msgid "Setup tunnels via VPN."
 msgstr ""
 
-#: src/include/gnunet_common.h:566 src/include/gnunet_common.h:573
-#: src/include/gnunet_common.h:581
+#: src/include/gnunet_common.h:590 src/include/gnunet_common.h:597
+#: src/include/gnunet_common.h:605
 #, c-format
 msgid "Assertion failed at %s:%d.\n"
 msgstr ""
 
-#: src/include/gnunet_common.h:593
+#: src/include/gnunet_common.h:617
 #, c-format
 msgid "External protocol violation detected at %s:%d.\n"
 msgstr ""
 
-#: src/include/gnunet_common.h:620 src/include/gnunet_common.h:629
+#: src/include/gnunet_common.h:644 src/include/gnunet_common.h:653
 #, c-format
 msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
 msgstr ""

Modified: gnunet/po/sv.po
===================================================================
--- gnunet/po/sv.po     2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/sv.po     2015-04-27 11:12:21 UTC (rev 35559)
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: GNUnet 0.7.0b\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2015-03-14 18:00+0100\n"
+"POT-Creation-Date: 2015-04-27 13:05+0200\n"
 "PO-Revision-Date: 2006-01-21 17:16+0100\n"
 "Last-Translator: Daniel Nylander <address@hidden>\n"
 "Language-Team: Swedish <address@hidden>\n"
@@ -497,16 +497,16 @@
 msgid "Could not connect master [%u] and slave [%u]\n"
 msgstr "Kunde inte ansluta till gnunetd.\n"
 
-#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:662
+#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:634
 #, fuzzy
 msgid "Initialization failed, shutdown\n"
 msgstr "Initiering av insticksmekanism misslyckades: %s!\n"
 
-#: src/ats-tests/ats-testing-log.c:846
+#: src/ats-tests/ats-testing-log.c:834
 msgid "Stop logging\n"
 msgstr ""
 
-#: src/ats-tests/ats-testing-log.c:897
+#: src/ats-tests/ats-testing-log.c:885
 #, fuzzy, c-format
 msgid "Start logging `%s'\n"
 msgstr "Startade samling \"%s\".\n"
@@ -554,6 +554,7 @@
 msgstr ""
 
 #: src/ats-tool/gnunet-ats.c:708 src/namestore/gnunet-namestore.c:700
+#: src/namestore/plugin_rest_namestore.c:812
 #: src/transport/gnunet-transport.c:1890
 #: src/transport/gnunet-transport-profiler.c:531
 #, fuzzy, c-format
@@ -1436,30 +1437,30 @@
 msgid "# PAYLOAD dropped (out of order)"
 msgstr "# byte kastade via UDP (utgående)"
 
-#: src/core/gnunet-service-core_neighbours.c:168
+#: src/core/gnunet-service-core_neighbours.c:177
 #, fuzzy
 msgid "# sessions terminated by transport disconnect"
 msgstr "Nätverksannonsering avstängd i konfigurationen!\n"
 
-#: src/core/gnunet-service-core_neighbours.c:184
-#: src/core/gnunet-service-core_neighbours.c:342
+#: src/core/gnunet-service-core_neighbours.c:193
+#: src/core/gnunet-service-core_neighbours.c:355
 msgid "# neighbour entries allocated"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:252
+#: src/core/gnunet-service-core_neighbours.c:264
 msgid "# encrypted bytes given to transport"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:425
+#: src/core/gnunet-service-core_neighbours.c:438
 #, c-format
 msgid "Unsupported message of type %u (%u bytes) received from peer `%s'\n"
 msgstr ""
 
-#: src/core/gnunet-service-core_sessions.c:245
-#: src/core/gnunet-service-core_sessions.c:331
+#: src/core/gnunet-service-core_sessions.c:252
+#: src/core/gnunet-service-core_sessions.c:338
 #: src/dht/gnunet-service-dht_neighbours.c:661
 #: src/dht/gnunet-service-dht_neighbours.c:726
-#: src/fs/gnunet-service-fs_cp.c:645 src/fs/gnunet-service-fs_cp.c:1627
+#: src/fs/gnunet-service-fs_cp.c:654 src/fs/gnunet-service-fs_cp.c:1647
 #: src/topology/gnunet-daemon-topology.c:734
 #: src/topology/gnunet-daemon-topology.c:835
 #: src/transport/gnunet-service-transport_neighbours.c:755
@@ -1468,21 +1469,21 @@
 msgid "# peers connected"
 msgstr "# av anslutna parter"
 
-#: src/core/gnunet-service-core_sessions.c:278
+#: src/core/gnunet-service-core_sessions.c:285
 msgid "# type map refreshes sent"
 msgstr ""
 
-#: src/core/gnunet-service-core_sessions.c:397
+#: src/core/gnunet-service-core_sessions.c:404
 #, fuzzy
 msgid "# outdated typemap confirmations received"
 msgstr "Kunde inte spara konfiguration!"
 
-#: src/core/gnunet-service-core_sessions.c:408
+#: src/core/gnunet-service-core_sessions.c:415
 #, fuzzy
 msgid "# valid typemap confirmations received"
 msgstr "Kunde inte spara konfiguration!"
 
-#: src/core/gnunet-service-core_sessions.c:546
+#: src/core/gnunet-service-core_sessions.c:554
 msgid "# messages discarded (expired prior to transmission)"
 msgstr ""
 
@@ -1497,7 +1498,7 @@
 msgstr ""
 
 #: src/datacache/datacache.c:115 src/datacache/datacache.c:266
-#: src/datastore/gnunet-service-datastore.c:855
+#: src/datastore/gnunet-service-datastore.c:841
 #, fuzzy
 msgid "# bytes stored"
 msgstr "# byte krypterade"
@@ -1508,8 +1509,8 @@
 msgstr "# byte krypterade"
 
 #: src/datacache/datacache.c:143 src/datacache/datacache.c:150
-#: src/datastore/gnunet-service-datastore.c:1557
-#: src/datastore/gnunet-service-datastore.c:1568
+#: src/datastore/gnunet-service-datastore.c:1598
+#: src/datastore/gnunet-service-datastore.c:1609
 #, fuzzy, c-format
 msgid "No `%s' specified for `%s' in configuration!\n"
 msgstr "Inga applikationer definierade i konfiguration!\n"
@@ -1543,8 +1544,8 @@
 
 #: src/datacache/plugin_datacache_sqlite.c:69
 #: src/datacache/plugin_datacache_sqlite.c:72
-#: src/datastore/plugin_datastore_mysql.c:809
-#: src/datastore/plugin_datastore_mysql.c:823
+#: src/datastore/plugin_datastore_mysql.c:818
+#: src/datastore/plugin_datastore_mysql.c:834
 #: src/datastore/plugin_datastore_sqlite.c:57 src/mysql/mysql.c:41
 #: src/mysql/mysql.c:48 src/mysql/mysql.c:522 src/mysql/mysql.c:531
 #: src/mysql/mysql.c:591 src/mysql/mysql.c:607
@@ -1746,8 +1747,8 @@
 
 #: src/datastore/gnunet-service-datastore.c:712
 #: src/datastore/gnunet-service-datastore.c:767
-#: src/datastore/gnunet-service-datastore.c:982
-#: src/datastore/gnunet-service-datastore.c:1529
+#: src/datastore/gnunet-service-datastore.c:999
+#: src/datastore/gnunet-service-datastore.c:1570
 msgid "# reserved"
 msgstr ""
 
@@ -1755,133 +1756,148 @@
 msgid "Could not find matching reservation"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:867
+#: src/datastore/gnunet-service-datastore.c:853
 #, c-format
 msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1029
+#: src/datastore/gnunet-service-datastore.c:1046
 #, fuzzy
 msgid "# GET requests received"
 msgstr "# byte mottogs via TCP"
 
-#: src/datastore/gnunet-service-datastore.c:1041
+#: src/datastore/gnunet-service-datastore.c:1058
 msgid "# requests filtered by bloomfilter"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1069
+#: src/datastore/gnunet-service-datastore.c:1094
 #, fuzzy
 msgid "# UPDATE requests received"
 msgstr "# byte mottogs via TCP"
 
-#: src/datastore/gnunet-service-datastore.c:1099
+#: src/datastore/gnunet-service-datastore.c:1122
 msgid "# GET REPLICATION requests received"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1132
+#: src/datastore/gnunet-service-datastore.c:1155
 msgid "# GET ZERO ANONYMITY requests received"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1157
+#: src/datastore/gnunet-service-datastore.c:1180
 #, fuzzy
 msgid "Content not found"
 msgstr "Kommando \"%s\" hittades inte!\n"
 
-#: src/datastore/gnunet-service-datastore.c:1165
+#: src/datastore/gnunet-service-datastore.c:1188
 msgid "# bytes removed (explicit request)"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1197
+#: src/datastore/gnunet-service-datastore.c:1220
 #, fuzzy
 msgid "# REMOVE requests received"
 msgstr "# byte mottogs via TCP"
 
-#: src/datastore/gnunet-service-datastore.c:1241
+#: src/datastore/gnunet-service-datastore.c:1264
 #, c-format
 msgid ""
 "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1269
 #, c-format
 msgid "New payload: %lld\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1299
+#: src/datastore/gnunet-service-datastore.c:1322
 #, c-format
 msgid "Loading `%s' datastore plugin\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1310
+#: src/datastore/gnunet-service-datastore.c:1333
 #, fuzzy, c-format
 msgid "Failed to load datastore plugin for `%s'\n"
 msgstr "Kunde inte slå upp \"%s\": %s\n"
 
-#: src/datastore/gnunet-service-datastore.c:1412
+#: src/datastore/gnunet-service-datastore.c:1402
+#: src/datastore/gnunet-service-datastore.c:1463
+msgid "Bloomfilter construction complete.\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1450
 msgid "Rebuilding bloomfilter.  Please be patient.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1419
+#: src/datastore/gnunet-service-datastore.c:1460
 msgid "Plugin does not support get_keys function. Please fix!\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1422
-msgid "Bloomfilter construction complete.\n"
-msgstr ""
-
-#: src/datastore/gnunet-service-datastore.c:1562
+#: src/datastore/gnunet-service-datastore.c:1603
 #, fuzzy, c-format
 msgid "# bytes used in file-sharing datastore `%s'"
 msgstr "# byte krypterade"
 
-#: src/datastore/gnunet-service-datastore.c:1573
+#: src/datastore/gnunet-service-datastore.c:1614
 msgid "# quota"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1575
+#: src/datastore/gnunet-service-datastore.c:1616
 msgid "# cache size"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1588
+#: src/datastore/gnunet-service-datastore.c:1629
 #, c-format
 msgid "Could not use specified filename `%s' for bloomfilter.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1606
-#: src/datastore/gnunet-service-datastore.c:1622
+#: src/datastore/gnunet-service-datastore.c:1647
+#: src/datastore/gnunet-service-datastore.c:1663
 #, fuzzy, c-format
 msgid "Failed to remove bogus bloomfilter file `%s'\n"
 msgstr "Kunde inte spara konfigurationsfil \"%s\":"
 
-#: src/datastore/gnunet-service-datastore.c:1652
+#: src/datastore/gnunet-service-datastore.c:1693
 #, fuzzy
 msgid "Failed to initialize bloomfilter.\n"
 msgstr "Misslyckades att initiera tjänsten \"%s\".\n"
 
-#: src/datastore/plugin_datastore_heap.c:821
+#: src/datastore/plugin_datastore_heap.c:826
 msgid "Heap database running\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_mysql.c:786
+#: src/datastore/plugin_datastore_mysql.c:309
+#: src/datastore/plugin_datastore_sqlite.c:499
+#, fuzzy
+msgid "Data too large"
+msgstr "antal iterationer"
+
+#: src/datastore/plugin_datastore_mysql.c:328
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:793
 #, fuzzy, c-format
 msgid "Failed to prepare statement `%s'\n"
 msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
 
-#: src/datastore/plugin_datastore_mysql.c:794
+#: src/datastore/plugin_datastore_mysql.c:802
 #, fuzzy, c-format
 msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
 msgstr "\"%s\" till \"%s\" misslyckades vid %s:%d med fel: %s\n"
 
-#: src/datastore/plugin_datastore_mysql.c:1025
+#: src/datastore/plugin_datastore_mysql.c:1036
 msgid "Mysql database running\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_postgres.c:837
+#: src/datastore/plugin_datastore_postgres.c:331
+msgid "Postgress exec failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_postgres.c:846
 #, fuzzy
 msgid "Failed to drop table from database.\n"
 msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
 
-#: src/datastore/plugin_datastore_postgres.c:873
+#: src/datastore/plugin_datastore_postgres.c:882
 #: src/namecache/plugin_namecache_postgres.c:414
 #: src/namestore/plugin_namestore_postgres.c:569
 msgid "Postgres database running\n"
@@ -1904,28 +1920,28 @@
 msgid "Unable to initialize SQLite: %s.\n"
 msgstr "Kunde inte initiera SQLite.\n"
 
-#: src/datastore/plugin_datastore_sqlite.c:661
+#: src/datastore/plugin_datastore_sqlite.c:680
 msgid "Invalid data in database.  Trying to fix (by deletion).\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_sqlite.c:1156
+#: src/datastore/plugin_datastore_sqlite.c:1177
 msgid "sqlite version to old to determine size, assuming zero\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_sqlite.c:1176
+#: src/datastore/plugin_datastore_sqlite.c:1197
 #, c-format
 msgid ""
 "Using sqlite page utilization to estimate payload (%llu pages of size %llu "
 "bytes)\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_sqlite.c:1216
+#: src/datastore/plugin_datastore_sqlite.c:1237
 #: src/namecache/plugin_namecache_sqlite.c:580
 #: src/namestore/plugin_namestore_sqlite.c:716
 msgid "Sqlite database running\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:260
 msgid "Template database running\n"
 msgstr ""
 
@@ -2558,54 +2574,54 @@
 msgid "Change DNS replies to point elsewhere."
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:456
+#: src/dns/gnunet-service-dns.c:459
 msgid "# DNS requests answered via TUN interface"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:603
+#: src/dns/gnunet-service-dns.c:606
 msgid "# DNS exit failed (failed to open socket)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:714
+#: src/dns/gnunet-service-dns.c:717
 msgid "# External DNS response discarded (no matching request)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:792
+#: src/dns/gnunet-service-dns.c:795
 msgid "# Client response discarded (no matching request)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:907
+#: src/dns/gnunet-service-dns.c:910
 msgid "Received malformed IPv4-UDP packet on TUN interface.\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:923
+#: src/dns/gnunet-service-dns.c:926
 msgid "Received malformed IPv6-UDP packet on TUN interface.\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:932
+#: src/dns/gnunet-service-dns.c:935
 #, c-format
 msgid "Got non-IP packet with %u bytes and protocol %u from TUN\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:942
+#: src/dns/gnunet-service-dns.c:945
 msgid "# Non-DNS UDP packet received via TUN interface"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:1009
+#: src/dns/gnunet-service-dns.c:1012
 #, fuzzy
 msgid "# DNS requests received via TUN interface"
 msgstr "Meddelande mottaget från klient är ogiltig.\n"
 
-#: src/dns/gnunet-service-dns.c:1049
-#, c-format
-msgid "`%s' must be installed SUID, refusing to run\n"
-msgstr ""
-
-#: src/dns/gnunet-service-dns.c:1069 src/exit/gnunet-daemon-exit.c:3594
+#: src/dns/gnunet-service-dns.c:1064 src/exit/gnunet-daemon-exit.c:3594
 #, fuzzy
 msgid "need a valid IPv4 or IPv6 address\n"
 msgstr "Ogiltigt svar på \"%s\".\n"
 
+#: src/dns/gnunet-service-dns.c:1082
+#, c-format
+msgid "`%s' must be installed SUID, will not run DNS interceptor\n"
+msgstr ""
+
 #: src/dv/gnunet-dv.c:169
 msgid "verbose output"
 msgstr ""
@@ -2842,57 +2858,57 @@
 msgid "Daemon to run to provide an IP exit node for the VPN"
 msgstr ""
 
-#: src/fragmentation/defragmentation.c:271
+#: src/fragmentation/defragmentation.c:277
 msgid "# acknowledgements sent for fragment"
 msgstr ""
 
-#: src/fragmentation/defragmentation.c:463
+#: src/fragmentation/defragmentation.c:470
 #: src/transport/plugin_transport_wlan.c:1515
 #, fuzzy
 msgid "# fragments received"
 msgstr "# byte mottogs via TCP"
 
-#: src/fragmentation/defragmentation.c:533
+#: src/fragmentation/defragmentation.c:540
 #, fuzzy
 msgid "# duplicate fragments received"
 msgstr "# byte mottogs via TCP"
 
-#: src/fragmentation/defragmentation.c:549
+#: src/fragmentation/defragmentation.c:558
 msgid "# messages defragmented"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:234
+#: src/fragmentation/fragmentation.c:235
 #, fuzzy
 msgid "# fragments transmitted"
 msgstr "# byte skickade av typen %d"
 
-#: src/fragmentation/fragmentation.c:237
+#: src/fragmentation/fragmentation.c:240
 #, fuzzy
 msgid "# fragments retransmitted"
 msgstr "# byte skickade av typen %d"
 
-#: src/fragmentation/fragmentation.c:263
+#: src/fragmentation/fragmentation.c:269
 #, fuzzy
 msgid "# fragments wrap arounds"
 msgstr "# byte skickade av typen %d"
 
-#: src/fragmentation/fragmentation.c:307
+#: src/fragmentation/fragmentation.c:315
 msgid "# messages fragmented"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:310
+#: src/fragmentation/fragmentation.c:321
 msgid "# total size of fragmented messages"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:431
+#: src/fragmentation/fragmentation.c:444
 msgid "# fragment acknowledgements received"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:437
+#: src/fragmentation/fragmentation.c:451
 msgid "# bits removed from fragmentation ACKs"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:461
+#: src/fragmentation/fragmentation.c:475
 #, fuzzy
 msgid "# fragmentation transmissions completed"
 msgstr "# klartext PONG-meddelanden mottagna"
@@ -3164,59 +3180,59 @@
 msgid "Got result with unknown block type `%d', ignoring"
 msgstr ""
 
-#: src/fs/fs_unindex.c:59
+#: src/fs/fs_unindex.c:63
 msgid "Failed to find given position in file"
 msgstr ""
 
-#: src/fs/fs_unindex.c:64
+#: src/fs/fs_unindex.c:68
 #, fuzzy
 msgid "Failed to read file"
 msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
 
-#: src/fs/fs_unindex.c:234
+#: src/fs/fs_unindex.c:245
 msgid "Unexpected time for a response from `fs' service."
 msgstr ""
 
-#: src/fs/fs_unindex.c:242
+#: src/fs/fs_unindex.c:253
 msgid "Timeout waiting for `fs' service."
 msgstr ""
 
-#: src/fs/fs_unindex.c:250
+#: src/fs/fs_unindex.c:261
 #, fuzzy
 msgid "Invalid response from `fs' service."
 msgstr "Ogiltigt svar till \"%s\" från \"%s\"\n"
 
-#: src/fs/fs_unindex.c:291
+#: src/fs/fs_unindex.c:304
 #, fuzzy
 msgid "Failed to connect to FS service for unindexing."
 msgstr "Misslyckades att ansluta till gnunetd.\n"
 
-#: src/fs/fs_unindex.c:347 src/fs/fs_unindex.c:359
+#: src/fs/fs_unindex.c:360 src/fs/fs_unindex.c:372
 #, fuzzy
 msgid "Failed to get KSKs from directory scan."
 msgstr "Filformatsfel (inte en GNUnet-katalog?)\n"
 
-#: src/fs/fs_unindex.c:355
+#: src/fs/fs_unindex.c:368
 #, fuzzy, c-format
 msgid "Internal error scanning `%s'.\n"
 msgstr "=\tFel vid läsning av katalog.\n"
 
-#: src/fs/fs_unindex.c:414
+#: src/fs/fs_unindex.c:427
 #, fuzzy, c-format
 msgid "Failed to remove UBlock: %s\n"
 msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
 
-#: src/fs/fs_unindex.c:562 src/fs/fs_unindex.c:626
+#: src/fs/fs_unindex.c:590 src/fs/fs_unindex.c:656
 #, fuzzy
 msgid "Failed to connect to `datastore' service."
 msgstr "Misslyckades att initiera tjänsten \"%s\".\n"
 
-#: src/fs/fs_unindex.c:639
+#: src/fs/fs_unindex.c:669
 #, fuzzy
 msgid "Failed to open file for unindexing."
 msgstr "Misslyckades att ansluta till gnunetd.\n"
 
-#: src/fs/fs_unindex.c:673
+#: src/fs/fs_unindex.c:708
 #, fuzzy
 msgid "Failed to compute hash of file."
 msgstr "Misslyckades att ansluta till gnunetd.\n"
@@ -3801,94 +3817,94 @@
 msgid "# cadet connections active"
 msgstr "Nätverksanslutning"
 
-#: src/fs/gnunet-service-fs_cp.c:726
+#: src/fs/gnunet-service-fs_cp.c:735
 #, fuzzy
 msgid "# migration stop messages received"
 msgstr "# krypterade PONG-meddelanden mottagna"
 
-#: src/fs/gnunet-service-fs_cp.c:730
+#: src/fs/gnunet-service-fs_cp.c:739
 #, c-format
 msgid "Migration of content to peer `%s' blocked for %s\n"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:768
+#: src/fs/gnunet-service-fs_cp.c:776
 #, fuzzy
 msgid "# replies transmitted to other peers"
 msgstr "# byte skickade av typen %d"
 
-#: src/fs/gnunet-service-fs_cp.c:774
+#: src/fs/gnunet-service-fs_cp.c:784
 msgid "# replies dropped"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:799 src/fs/gnunet-service-fs_cp.c:1384
+#: src/fs/gnunet-service-fs_cp.c:810 src/fs/gnunet-service-fs_cp.c:1404
 msgid "# P2P searches active"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:904
+#: src/fs/gnunet-service-fs_cp.c:915
 msgid "# artificial delays introduced (ms)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:960
+#: src/fs/gnunet-service-fs_cp.c:971
 #, fuzzy
 msgid "# replies dropped due to type mismatch"
 msgstr "# byte mottagna av typen %d"
 
-#: src/fs/gnunet-service-fs_cp.c:968
+#: src/fs/gnunet-service-fs_cp.c:979
 #, fuzzy
 msgid "# replies received for other peers"
 msgstr "# byte mottagna av typen %d"
 
-#: src/fs/gnunet-service-fs_cp.c:982
+#: src/fs/gnunet-service-fs_cp.c:993
 msgid "# replies dropped due to insufficient cover traffic"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1030
+#: src/fs/gnunet-service-fs_cp.c:1041
 msgid "# P2P searches destroyed due to ultimate reply"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1098
+#: src/fs/gnunet-service-fs_cp.c:1109
 msgid "# requests done for free (low load)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1123
+#: src/fs/gnunet-service-fs_cp.c:1134
 msgid "# request dropped, priority insufficient"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1133
+#: src/fs/gnunet-service-fs_cp.c:1144
 msgid "# requests done for a price (normal load)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1210
+#: src/fs/gnunet-service-fs_cp.c:1221
 msgid "# GET requests received (from other peers)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1245
+#: src/fs/gnunet-service-fs_cp.c:1256
 msgid "# requests dropped due to initiator not being connected"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1266
+#: src/fs/gnunet-service-fs_cp.c:1277
 msgid "# requests dropped due to missing reverse route"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1277
+#: src/fs/gnunet-service-fs_cp.c:1288
 #, fuzzy
 msgid "# requests dropped due to full reply queue"
 msgstr "Nätverksannonsering avstängd i konfigurationen!\n"
 
-#: src/fs/gnunet-service-fs_cp.c:1329
+#: src/fs/gnunet-service-fs_cp.c:1340
 msgid "# requests dropped due TTL underflow"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1353
+#: src/fs/gnunet-service-fs_cp.c:1365
 msgid "# requests dropped due to higher-TTL request"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1382
+#: src/fs/gnunet-service-fs_cp.c:1402
 #, fuzzy
 msgid "# P2P query messages received and processed"
 msgstr "# krypterade PONG-meddelanden mottagna"
 
-#: src/fs/gnunet-service-fs_cp.c:1821
+#: src/fs/gnunet-service-fs_cp.c:1841
 #, fuzzy
 msgid "# migration stop messages sent"
 msgstr "# krypterade PONG-meddelanden mottagna"
@@ -4232,7 +4248,7 @@
 msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:215
+#: src/gns/gnunet-gns.c:215 src/gns/plugin_rest_gns.c:334
 #, c-format
 msgid "Invalid typename specified, assuming `ANY'\n"
 msgstr ""
@@ -4248,6 +4264,7 @@
 msgstr ""
 
 #: src/gns/gnunet-gns.c:353 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/plugin_rest_gns.c:459
 #, c-format
 msgid ""
 "Ego for `gns-master' not found, cannot perform lookup.  Did you run gnunet-"
@@ -4389,7 +4406,7 @@
 msgid "Failed to start HTTPS server for `%s'\n"
 msgstr "Misslyckades att starta samling.\n"
 
-#: src/gns/gnunet-gns-proxy.c:2225
+#: src/gns/gnunet-gns-proxy.c:2225 src/rest/gnunet-rest-server.c:529
 #, fuzzy
 msgid "Failed to pass client to MHD\n"
 msgstr "Misslyckades att ansluta till gnunetd.\n"
@@ -4493,21 +4510,21 @@
 msgid "GNS lookup resulted in DNS name that is too long (`%s')\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:1886
+#: src/gns/gnunet-service-gns_resolver.c:1891
 msgid "GNS lookup recursion failed (no delegation record found)\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:1910
+#: src/gns/gnunet-service-gns_resolver.c:1915
 #, fuzzy, c-format
 msgid "Failed to cache GNS resolution: %s\n"
 msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n"
 
-#: src/gns/gnunet-service-gns_resolver.c:2192
+#: src/gns/gnunet-service-gns_resolver.c:2197
 #, c-format
 msgid "Zone %s was revoked, resolution fails\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:2341
+#: src/gns/gnunet-service-gns_resolver.c:2346
 #, c-format
 msgid "Hostname `%s' is not well-formed, resolution fails\n"
 msgstr ""
@@ -4537,6 +4554,15 @@
 msgid "Unable to parse BOX record string `%s'\n"
 msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
 
+#: src/gns/plugin_rest_gns.c:422
+msgid "Ego for not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:652
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
 #: src/gnsrecord/plugin_gnsrecord_dns.c:291
 #, fuzzy, c-format
 msgid "Unable to parse IPv4 address `%s'\n"
@@ -5059,6 +5085,11 @@
 msgid "Failed to create directory `%s' for storing egos\n"
 msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
 
+#: src/identity/plugin_rest_identity.c:803
+#, fuzzy
+msgid "Identity REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
 #: src/mysql/mysql.c:174
 #, c-format
 msgid "Trying to use file `%s' for MySQL configuration.\n"
@@ -5084,9 +5115,9 @@
 msgid "You must specify which zone should be accessed\n"
 msgstr "anger vilken TRANSPORT som ska testas"
 
-#: src/namecache/gnunet-namecache.c:195 src/namestore/gnunet-namestore.c:844
+#: src/namecache/gnunet-namecache.c:195
 #, fuzzy, c-format
-msgid "Invalid public key for reverse lookup `%s'\n"
+msgid "Invalid public key for zone `%s'\n"
 msgstr "Ogiltigt argument: \"%s\"\n"
 
 #: src/namecache/gnunet-namecache.c:203
@@ -5126,6 +5157,7 @@
 "Fel vid uppladdning av fil: %s\n"
 
 #: src/namestore/gnunet-namestore.c:332
+#: src/namestore/plugin_rest_namestore.c:505
 #, fuzzy, c-format
 msgid "Deleting record failed, record does not exist%s%s\n"
 msgstr ""
@@ -5133,6 +5165,7 @@
 "Fel vid uppladdning av fil: %s\n"
 
 #: src/namestore/gnunet-namestore.c:339
+#: src/namestore/plugin_rest_namestore.c:514
 #, fuzzy, c-format
 msgid "Deleting record failed%s%s\n"
 msgstr ""
@@ -5152,6 +5185,7 @@
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:628
+#: src/namestore/plugin_rest_namestore.c:538
 #, c-format
 msgid "There are no records under label `%s' that could be deleted.\n"
 msgstr ""
@@ -5169,6 +5203,7 @@
 
 #: src/namestore/gnunet-namestore.c:719
 #: src/namestore/gnunet-namestore-fcfsd.c:984
+#: src/namestore/plugin_rest_namestore.c:821
 #, fuzzy
 msgid "Failed to connect to namestore\n"
 msgstr "Misslyckades att ansluta till gnunetd.\n"
@@ -5186,11 +5221,14 @@
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:745
+#: src/namestore/plugin_rest_namestore.c:608
 #, fuzzy, c-format
 msgid "Unsupported type `%s'\n"
 msgstr "Kommando \"%s\" stöds ej.  Avbryter.\n"
 
 #: src/namestore/gnunet-namestore.c:765
+#: src/namestore/plugin_rest_namestore.c:626
+#: src/namestore/plugin_rest_namestore.c:666
 #, fuzzy, c-format
 msgid "Value `%s' invalid for record type `%s'\n"
 msgstr "%s: symbolvärde \"%s\" ogiltigt för %s\n"
@@ -5204,6 +5242,11 @@
 msgid "del"
 msgstr ""
 
+#: src/namestore/gnunet-namestore.c:844
+#, fuzzy, c-format
+msgid "Invalid public key for reverse lookup `%s'\n"
+msgstr "Ogiltigt argument: \"%s\"\n"
+
 #: src/namestore/gnunet-namestore.c:868
 #: src/peerinfo-tool/gnunet-peerinfo.c:817
 #, fuzzy, c-format
@@ -5216,21 +5259,25 @@
 msgstr "Ogiltiga argument: "
 
 #: src/namestore/gnunet-namestore.c:943
+#: src/namestore/plugin_rest_namestore.c:851
 #, fuzzy, c-format
 msgid "Ego `%s' not known to identity service\n"
 msgstr "\"%s\": okänd tjänst: %s\n"
 
 #: src/namestore/gnunet-namestore.c:970
+#: src/namestore/plugin_rest_namestore.c:878
 #, fuzzy, c-format
 msgid "No default ego configured in identity service\n"
 msgstr "\"%s\": okänd tjänst: %s\n"
 
 #: src/namestore/gnunet-namestore.c:1006
+#: src/namestore/plugin_rest_namestore.c:917
 #, fuzzy, c-format
 msgid "Identity service is not running\n"
 msgstr "\"%s\" är inte en fil.\n"
 
 #: src/namestore/gnunet-namestore.c:1018
+#: src/namestore/plugin_rest_namestore.c:946
 #, fuzzy, c-format
 msgid "Cannot connect to identity service\n"
 msgstr "Kunde inte ansluta till gnunetd.\n"
@@ -5363,6 +5410,11 @@
 msgid "Namestore failed to store record\n"
 msgstr ""
 
+#: src/namestore/plugin_rest_namestore.c:1023
+#, fuzzy
+msgid "Namestore REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
 #: src/nat/gnunet-nat-server.c:279
 #, c-format
 msgid "Please pass valid port number as the first argument! (got `%s')\n"
@@ -5615,7 +5667,7 @@
 msgstr "Kan inte tillgå tjänsten"
 
 #: src/nse/gnunet-service-nse.c:1537
-#: src/revocation/gnunet-service-revocation.c:815 src/util/gnunet-scrypt.c:260
+#: src/revocation/gnunet-service-revocation.c:827 src/util/gnunet-scrypt.c:260
 msgid "Value is too large.\n"
 msgstr ""
 
@@ -6155,6 +6207,15 @@
 msgid "Regex `%s' is too long!\n"
 msgstr "\"%s\" är inte en fil.\n"
 
+#: src/rest/gnunet-rest-server.c:766
+msgid "listen on specified port (default: 7776)"
+msgstr ""
+
+#: src/rest/gnunet-rest-server.c:783
+#, fuzzy
+msgid "GNUnet REST server"
+msgstr "Spåra GNUnets nätverkstopologi."
+
 #: src/revocation/gnunet-revocation.c:126
 #, fuzzy, c-format
 msgid "Key `%s' is valid\n"
@@ -6285,11 +6346,11 @@
 msgstr "# klartext PONG-meddelanden mottagna"
 
 #: src/revocation/gnunet-service-revocation.c:493
-#: src/revocation/gnunet-service-revocation.c:747
+#: src/revocation/gnunet-service-revocation.c:759
 msgid "SET service crashed, terminating revocation service\n"
 msgstr ""
 
-#: src/revocation/gnunet-service-revocation.c:839
+#: src/revocation/gnunet-service-revocation.c:851
 #, fuzzy
 msgid "Could not open revocation database file!"
 msgstr "Kunde inte ansluta till gnunetd.\n"
@@ -8026,7 +8087,7 @@
 msgstr ""
 
 #: src/transport/plugin_transport_http_server.c:2825
-#: src/transport/plugin_transport_udp.c:3336
+#: src/transport/plugin_transport_udp.c:3335
 msgid "Disabling IPv6 since it is not supported on this system!\n"
 msgstr ""
 
@@ -8268,50 +8329,50 @@
 msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3082
+#: src/transport/plugin_transport_udp.c:3081
 #, c-format
 msgid ""
 "UDP could not transmit message to `%s': Network seems down, please check "
 "your network configuration\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3096
+#: src/transport/plugin_transport_udp.c:3095
 msgid ""
 "UDP could not transmit IPv6 message! Please check your network configuration "
 "and disable IPv6 if your connection does not have a global IPv6 address\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3412
-#: src/transport/plugin_transport_udp.c:3511
+#: src/transport/plugin_transport_udp.c:3411
+#: src/transport/plugin_transport_udp.c:3510
 #, fuzzy, c-format
 msgid "Failed to bind UDP socket to %s: %s\n"
 msgstr "Misslyckades att binda till UDP6-port %d.\n"
 
-#: src/transport/plugin_transport_udp.c:3430
+#: src/transport/plugin_transport_udp.c:3429
 msgid "Disabling IPv4 since it is not supported on this system!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3521
+#: src/transport/plugin_transport_udp.c:3520
 #, fuzzy
 msgid "Failed to open UDP sockets\n"
 msgstr "Misslyckades att binda till UDP6-port %d.\n"
 
-#: src/transport/plugin_transport_udp.c:3592
-#: src/transport/plugin_transport_udp.c:3606
+#: src/transport/plugin_transport_udp.c:3591
+#: src/transport/plugin_transport_udp.c:3605
 msgid "must be in [0,65535]"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3638
+#: src/transport/plugin_transport_udp.c:3637
 #, fuzzy
 msgid "must be valid IPv4 address"
 msgstr "\"%s\" är inte tillgänglig."
 
-#: src/transport/plugin_transport_udp.c:3665
+#: src/transport/plugin_transport_udp.c:3664
 #, fuzzy
 msgid "must be valid IPv6 address"
 msgstr "\"%s\" är inte tillgänglig."
 
-#: src/transport/plugin_transport_udp.c:3731
+#: src/transport/plugin_transport_udp.c:3730
 #, fuzzy
 msgid "Failed to create UDP network sockets\n"
 msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
@@ -8533,24 +8594,24 @@
 msgid "Syntax error while deserializing in line %u\n"
 msgstr "Syntaxfel i konfigurationsfil \"%s\" på rad %d.\n"
 
-#: src/util/configuration.c:1026
+#: src/util/configuration.c:1025
 #, c-format
 msgid ""
 "Configuration value '%s' for '%s' in section '%s' is not in set of legal "
 "choices\n"
 msgstr ""
 
-#: src/util/configuration.c:1145
+#: src/util/configuration.c:1144
 #, c-format
 msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
 msgstr ""
 
-#: src/util/configuration.c:1177
+#: src/util/configuration.c:1176
 #, fuzzy, c-format
 msgid "Missing closing `%s' in option `%s'\n"
 msgstr "Konfigurationsfil \"%s\" skapad.\n"
 
-#: src/util/configuration.c:1251
+#: src/util/configuration.c:1250
 #, c-format
 msgid ""
 "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8574,52 +8635,52 @@
 "%llu)\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:731 src/util/crypto_ecc.c:769
-#: src/util/crypto_ecc.c:887 src/util/crypto_ecc.c:925
+#: src/util/crypto_ecc.c:733 src/util/crypto_ecc.c:771
+#: src/util/crypto_ecc.c:889 src/util/crypto_ecc.c:927
 #, fuzzy, c-format
 msgid "Could not acquire lock on file `%s': %s...\n"
 msgstr "Kunde inte slå upp \"%s\": %s\n"
 
-#: src/util/crypto_ecc.c:736 src/util/crypto_ecc.c:892
+#: src/util/crypto_ecc.c:738 src/util/crypto_ecc.c:894
 #, fuzzy
 msgid "Creating a new private key.  This may take a while.\n"
 msgstr "Skapar ny värdnyckel (det här kan ta en stund).\n"
 
-#: src/util/crypto_ecc.c:773 src/util/crypto_ecc.c:929
+#: src/util/crypto_ecc.c:775 src/util/crypto_ecc.c:931
 msgid "This may be ok if someone is currently generating a private key.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:803 src/util/crypto_ecc.c:959
+#: src/util/crypto_ecc.c:805 src/util/crypto_ecc.c:961
 #, c-format
 msgid ""
 "When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:807 src/util/crypto_ecc.c:963
+#: src/util/crypto_ecc.c:809 src/util/crypto_ecc.c:965
 msgid "This may be ok if someone is currently generating a key.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:1045
+#: src/util/crypto_ecc.c:1047
 #, fuzzy
 msgid "Could not load peer's private key\n"
 msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
 
-#: src/util/crypto_ecc.c:1149
+#: src/util/crypto_ecc.c:1151
 #, fuzzy, c-format
 msgid "ECC signing failed at %s:%d: %s\n"
 msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
 
-#: src/util/crypto_ecc.c:1199
+#: src/util/crypto_ecc.c:1201
 #, fuzzy, c-format
 msgid "EdDSA signing failed at %s:%d: %s\n"
 msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
 
-#: src/util/crypto_ecc.c:1273
+#: src/util/crypto_ecc.c:1275
 #, fuzzy, c-format
 msgid "ECDSA signature verification failed at %s:%d: %s\n"
 msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
 
-#: src/util/crypto_ecc.c:1330
+#: src/util/crypto_ecc.c:1332
 #, fuzzy, c-format
 msgid "EdDSA signature verification failed at %s:%d: %s\n"
 msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
@@ -8629,17 +8690,17 @@
 msgid "libgcrypt has not the expected version (version %s is required).\n"
 msgstr "libgcrypt har inte den förväntande versionen (version %s krävs).\n"
 
-#: src/util/crypto_rsa.c:809
+#: src/util/crypto_rsa.c:825
 #, fuzzy, c-format
 msgid "RSA signature verification failed at %s:%d: %s\n"
 msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
 
-#: src/util/disk.c:1218
+#: src/util/disk.c:1222
 #, fuzzy, c-format
 msgid "Expected `%s' to be a directory!\n"
 msgstr "\"%s\" förväntade att \"%s\" skulle vara en katalog!\n"
 
-#: src/util/disk.c:1580 src/util/service.c:1328
+#: src/util/disk.c:1584 src/util/service.c:1328
 #, fuzzy, c-format
 msgid "Cannot obtain information about user `%s': %s\n"
 msgstr "Kan inte öppna konfigurationsfil \"%s\".\n"
@@ -8704,7 +8765,7 @@
 msgid "Use %s to get a list of options.\n"
 msgstr "Använd --help för att få en lista på flaggor.\n"
 
-#: src/util/getopt_helpers.c:84
+#: src/util/getopt_helpers.c:90
 #, c-format
 msgid ""
 "Arguments mandatory for long options are also mandatory for short options.\n"
@@ -8712,12 +8773,12 @@
 "Argument som är obligatoriska för långa flaggor är också obligatoriska för "
 "korta flaggor.\n"
 
-#: src/util/getopt_helpers.c:268 src/util/getopt_helpers.c:326
+#: src/util/getopt_helpers.c:274 src/util/getopt_helpers.c:332
 #, c-format
 msgid "You must pass a number to the `%s' option.\n"
 msgstr "Du måste skicka med ett nummer till flaggan \"%s\".\n"
 
-#: src/util/getopt_helpers.c:298
+#: src/util/getopt_helpers.c:304
 #, fuzzy, c-format
 msgid "You must pass relative time to the `%s' option.\n"
 msgstr "Du måste skicka med ett nummer till flaggan \"%s\".\n"
@@ -8962,22 +9023,22 @@
 msgid "GetExitCodeProcess failed for binary %s (%d).\n"
 msgstr ""
 
-#: src/util/plugin.c:87
+#: src/util/plugin.c:86
 #, c-format
 msgid "Initialization of plugin mechanism failed: %s!\n"
 msgstr "Initiering av insticksmekanism misslyckades: %s!\n"
 
-#: src/util/plugin.c:148
+#: src/util/plugin.c:151
 #, fuzzy, c-format
 msgid "`%s' failed to resolve method '%s' with error: %s\n"
 msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n"
 
-#: src/util/plugin.c:223
+#: src/util/plugin.c:226
 #, fuzzy, c-format
 msgid "`%s' failed for library `%s' with error: %s\n"
 msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n"
 
-#: src/util/plugin.c:382
+#: src/util/plugin.c:385
 #, fuzzy
 msgid "Could not determine plugin installation path.\n"
 msgstr "Kunde inte fastställa min publika IPv6-adress.\n"
@@ -9627,10 +9688,6 @@
 #~ msgstr "\"%s\" ansluten till \"%s\".\n"
 
 #, fuzzy
-#~ msgid "CADET initialized\n"
-#~ msgstr " Anslutning misslyckades\n"
-
-#, fuzzy
 #~ msgid "Reloading sensor definitions from directory `%s'\n"
 #~ msgstr "Ladda ner filer från GNUnet."
 

Modified: gnunet/po/vi.po
===================================================================
--- gnunet/po/vi.po     2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/vi.po     2015-04-27 11:12:21 UTC (rev 35559)
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gnunet 0.8.0a\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2015-03-14 18:00+0100\n"
+"POT-Creation-Date: 2015-04-27 13:05+0200\n"
 "PO-Revision-Date: 2008-09-10 22:05+0930\n"
 "Last-Translator: Clytie Siddall <address@hidden>\n"
 "Language-Team: Vietnamese <address@hidden>\n"
@@ -503,17 +503,17 @@
 msgid "Could not connect master [%u] and slave [%u]\n"
 msgstr "Không thể kết nối tới %s:%u: %s\n"
 
-#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:662
+#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:634
 #, fuzzy
 msgid "Initialization failed, shutdown\n"
 msgstr "Lỗi sơ khởi cơ chế phần bổ sung: %s\n"
 
-#: src/ats-tests/ats-testing-log.c:846
+#: src/ats-tests/ats-testing-log.c:834
 #, fuzzy
 msgid "Stop logging\n"
 msgstr "Theo dõi"
 
-#: src/ats-tests/ats-testing-log.c:897
+#: src/ats-tests/ats-testing-log.c:885
 #, fuzzy, c-format
 msgid "Start logging `%s'\n"
 msgstr "Đang bắt đầu tài về « %s »\n"
@@ -561,6 +561,7 @@
 msgstr ""
 
 #: src/ats-tool/gnunet-ats.c:708 src/namestore/gnunet-namestore.c:700
+#: src/namestore/plugin_rest_namestore.c:812
 #: src/transport/gnunet-transport.c:1890
 #: src/transport/gnunet-transport-profiler.c:531
 #, fuzzy, c-format
@@ -1442,30 +1443,30 @@
 msgid "# PAYLOAD dropped (out of order)"
 msgstr "# các byte loại bỏ bởi UDP (đi ra)"
 
-#: src/core/gnunet-service-core_neighbours.c:168
+#: src/core/gnunet-service-core_neighbours.c:177
 #, fuzzy
 msgid "# sessions terminated by transport disconnect"
 msgstr "# Các quảng cáo đồng đẳng bị hủy do trọng tải"
 
-#: src/core/gnunet-service-core_neighbours.c:184
-#: src/core/gnunet-service-core_neighbours.c:342
+#: src/core/gnunet-service-core_neighbours.c:193
+#: src/core/gnunet-service-core_neighbours.c:355
 msgid "# neighbour entries allocated"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:252
+#: src/core/gnunet-service-core_neighbours.c:264
 msgid "# encrypted bytes given to transport"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:425
+#: src/core/gnunet-service-core_neighbours.c:438
 #, c-format
 msgid "Unsupported message of type %u (%u bytes) received from peer `%s'\n"
 msgstr ""
 
-#: src/core/gnunet-service-core_sessions.c:245
-#: src/core/gnunet-service-core_sessions.c:331
+#: src/core/gnunet-service-core_sessions.c:252
+#: src/core/gnunet-service-core_sessions.c:338
 #: src/dht/gnunet-service-dht_neighbours.c:661
 #: src/dht/gnunet-service-dht_neighbours.c:726
-#: src/fs/gnunet-service-fs_cp.c:645 src/fs/gnunet-service-fs_cp.c:1627
+#: src/fs/gnunet-service-fs_cp.c:654 src/fs/gnunet-service-fs_cp.c:1647
 #: src/topology/gnunet-daemon-topology.c:734
 #: src/topology/gnunet-daemon-topology.c:835
 #: src/transport/gnunet-service-transport_neighbours.c:755
@@ -1474,22 +1475,22 @@
 msgid "# peers connected"
 msgstr "# của các đồng đẳng đã kết nối"
 
-#: src/core/gnunet-service-core_sessions.c:278
+#: src/core/gnunet-service-core_sessions.c:285
 #, fuzzy
 msgid "# type map refreshes sent"
 msgstr "# tổng số yêu cầu lỗ hổng được gửi"
 
-#: src/core/gnunet-service-core_sessions.c:397
+#: src/core/gnunet-service-core_sessions.c:404
 #, fuzzy
 msgid "# outdated typemap confirmations received"
 msgstr "Lỗi lưu cấu hình."
 
-#: src/core/gnunet-service-core_sessions.c:408
+#: src/core/gnunet-service-core_sessions.c:415
 #, fuzzy
 msgid "# valid typemap confirmations received"
 msgstr "Lỗi lưu cấu hình."
 
-#: src/core/gnunet-service-core_sessions.c:546
+#: src/core/gnunet-service-core_sessions.c:554
 msgid "# messages discarded (expired prior to transmission)"
 msgstr ""
 
@@ -1504,7 +1505,7 @@
 msgstr ""
 
 #: src/datacache/datacache.c:115 src/datacache/datacache.c:266
-#: src/datastore/gnunet-service-datastore.c:855
+#: src/datastore/gnunet-service-datastore.c:841
 #, fuzzy
 msgid "# bytes stored"
 msgstr "# các byte trong kho dữ liệu"
@@ -1515,8 +1516,8 @@
 msgstr "# các byte trong kho dữ liệu"
 
 #: src/datacache/datacache.c:143 src/datacache/datacache.c:150
-#: src/datastore/gnunet-service-datastore.c:1557
-#: src/datastore/gnunet-service-datastore.c:1568
+#: src/datastore/gnunet-service-datastore.c:1598
+#: src/datastore/gnunet-service-datastore.c:1609
 #, c-format
 msgid "No `%s' specified for `%s' in configuration!\n"
 msgstr ""
@@ -1551,8 +1552,8 @@
 
 #: src/datacache/plugin_datacache_sqlite.c:69
 #: src/datacache/plugin_datacache_sqlite.c:72
-#: src/datastore/plugin_datastore_mysql.c:809
-#: src/datastore/plugin_datastore_mysql.c:823
+#: src/datastore/plugin_datastore_mysql.c:818
+#: src/datastore/plugin_datastore_mysql.c:834
 #: src/datastore/plugin_datastore_sqlite.c:57 src/mysql/mysql.c:41
 #: src/mysql/mysql.c:48 src/mysql/mysql.c:522 src/mysql/mysql.c:531
 #: src/mysql/mysql.c:591 src/mysql/mysql.c:607
@@ -1761,8 +1762,8 @@
 
 #: src/datastore/gnunet-service-datastore.c:712
 #: src/datastore/gnunet-service-datastore.c:767
-#: src/datastore/gnunet-service-datastore.c:982
-#: src/datastore/gnunet-service-datastore.c:1529
+#: src/datastore/gnunet-service-datastore.c:999
+#: src/datastore/gnunet-service-datastore.c:1570
 msgid "# reserved"
 msgstr ""
 
@@ -1770,138 +1771,153 @@
 msgid "Could not find matching reservation"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:867
+#: src/datastore/gnunet-service-datastore.c:853
 #, c-format
 msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1029
+#: src/datastore/gnunet-service-datastore.c:1046
 #, fuzzy
 msgid "# GET requests received"
 msgstr "# các yêu cầu get (lấy) dht được nhận"
 
-#: src/datastore/gnunet-service-datastore.c:1041
+#: src/datastore/gnunet-service-datastore.c:1058
 #, fuzzy
 msgid "# requests filtered by bloomfilter"
 msgstr "# các yêu cầu được lọc theo bộ lọc bloom"
 
-#: src/datastore/gnunet-service-datastore.c:1069
+#: src/datastore/gnunet-service-datastore.c:1094
 #, fuzzy
 msgid "# UPDATE requests received"
 msgstr "# các yêu cầu get (lấy) dht được nhận"
 
-#: src/datastore/gnunet-service-datastore.c:1099
+#: src/datastore/gnunet-service-datastore.c:1122
 #, fuzzy
 msgid "# GET REPLICATION requests received"
 msgstr "# các yêu cầu get (lấy) dht được nhận"
 
-#: src/datastore/gnunet-service-datastore.c:1132
+#: src/datastore/gnunet-service-datastore.c:1155
 #, fuzzy
 msgid "# GET ZERO ANONYMITY requests received"
 msgstr "# các yêu cầu get (lấy) dht được nhận"
 
-#: src/datastore/gnunet-service-datastore.c:1157
+#: src/datastore/gnunet-service-datastore.c:1180
 msgid "Content not found"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1165
+#: src/datastore/gnunet-service-datastore.c:1188
 msgid "# bytes removed (explicit request)"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1197
+#: src/datastore/gnunet-service-datastore.c:1220
 #, fuzzy
 msgid "# REMOVE requests received"
 msgstr "# các yêu cầu get (lấy) dht được nhận"
 
-#: src/datastore/gnunet-service-datastore.c:1241
+#: src/datastore/gnunet-service-datastore.c:1264
 #, c-format
 msgid ""
 "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1269
 #, c-format
 msgid "New payload: %lld\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1299
+#: src/datastore/gnunet-service-datastore.c:1322
 #, c-format
 msgid "Loading `%s' datastore plugin\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1310
+#: src/datastore/gnunet-service-datastore.c:1333
 #, fuzzy, c-format
 msgid "Failed to load datastore plugin for `%s'\n"
 msgstr "Không thể nạp phần bổ sung truyền tải « %s »\n"
 
-#: src/datastore/gnunet-service-datastore.c:1412
+#: src/datastore/gnunet-service-datastore.c:1402
+#: src/datastore/gnunet-service-datastore.c:1463
+msgid "Bloomfilter construction complete.\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1450
 msgid "Rebuilding bloomfilter.  Please be patient.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1419
+#: src/datastore/gnunet-service-datastore.c:1460
 msgid "Plugin does not support get_keys function. Please fix!\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1422
-msgid "Bloomfilter construction complete.\n"
-msgstr ""
-
-#: src/datastore/gnunet-service-datastore.c:1562
+#: src/datastore/gnunet-service-datastore.c:1603
 #, fuzzy, c-format
 msgid "# bytes used in file-sharing datastore `%s'"
 msgstr "# các byte được phép trong kho dữ liệu"
 
-#: src/datastore/gnunet-service-datastore.c:1573
+#: src/datastore/gnunet-service-datastore.c:1614
 msgid "# quota"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1575
+#: src/datastore/gnunet-service-datastore.c:1616
 msgid "# cache size"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1588
+#: src/datastore/gnunet-service-datastore.c:1629
 #, c-format
 msgid "Could not use specified filename `%s' for bloomfilter.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1606
-#: src/datastore/gnunet-service-datastore.c:1622
+#: src/datastore/gnunet-service-datastore.c:1647
+#: src/datastore/gnunet-service-datastore.c:1663
 #, fuzzy, c-format
 msgid "Failed to remove bogus bloomfilter file `%s'\n"
 msgstr "Không thể lưu tập tin cấu hình « %s »:"
 
-#: src/datastore/gnunet-service-datastore.c:1652
+#: src/datastore/gnunet-service-datastore.c:1693
 #, fuzzy
 msgid "Failed to initialize bloomfilter.\n"
 msgstr "Lỗi sơ khởi dịch vụ « %s ».\n"
 
-#: src/datastore/plugin_datastore_heap.c:821
+#: src/datastore/plugin_datastore_heap.c:826
 #, fuzzy
 msgid "Heap database running\n"
 msgstr "kho dữ liệu sqlite"
 
-#: src/datastore/plugin_datastore_mysql.c:786
+#: src/datastore/plugin_datastore_mysql.c:309
+#: src/datastore/plugin_datastore_sqlite.c:499
+#, fuzzy
+msgid "Data too large"
+msgstr "số lần lặp lại"
+
+#: src/datastore/plugin_datastore_mysql.c:328
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:793
 #, fuzzy, c-format
 msgid "Failed to prepare statement `%s'\n"
 msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
 
-#: src/datastore/plugin_datastore_mysql.c:794
+#: src/datastore/plugin_datastore_mysql.c:802
 #, fuzzy, c-format
 msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
 msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n"
 
-#: src/datastore/plugin_datastore_mysql.c:1025
+#: src/datastore/plugin_datastore_mysql.c:1036
 msgid "Mysql database running\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_postgres.c:837
+#: src/datastore/plugin_datastore_postgres.c:331
+msgid "Postgress exec failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_postgres.c:846
 #, fuzzy
 msgid "Failed to drop table from database.\n"
 msgstr ""
 "\n"
 "Không nhận được đáp ứng từ gnunetd.\n"
 
-#: src/datastore/plugin_datastore_postgres.c:873
+#: src/datastore/plugin_datastore_postgres.c:882
 #: src/namecache/plugin_namecache_postgres.c:414
 #: src/namestore/plugin_namestore_postgres.c:569
 msgid "Postgres database running\n"
@@ -1924,30 +1940,30 @@
 msgid "Unable to initialize SQLite: %s.\n"
 msgstr "Không thể sơ khởi SQLite: %s.\n"
 
-#: src/datastore/plugin_datastore_sqlite.c:661
+#: src/datastore/plugin_datastore_sqlite.c:680
 #, fuzzy
 msgid "Invalid data in database.  Trying to fix (by deletion).\n"
 msgstr "Dữ liệu sai trong %s. Đang thử sửa chữa (bằng cách xoá).\n"
 
-#: src/datastore/plugin_datastore_sqlite.c:1156
+#: src/datastore/plugin_datastore_sqlite.c:1177
 msgid "sqlite version to old to determine size, assuming zero\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_sqlite.c:1176
+#: src/datastore/plugin_datastore_sqlite.c:1197
 #, c-format
 msgid ""
 "Using sqlite page utilization to estimate payload (%llu pages of size %llu "
 "bytes)\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_sqlite.c:1216
+#: src/datastore/plugin_datastore_sqlite.c:1237
 #: src/namecache/plugin_namecache_sqlite.c:580
 #: src/namestore/plugin_namestore_sqlite.c:716
 #, fuzzy
 msgid "Sqlite database running\n"
 msgstr "kho dữ liệu sqlite"
 
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:260
 msgid "Template database running\n"
 msgstr ""
 
@@ -2581,54 +2597,54 @@
 msgid "Change DNS replies to point elsewhere."
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:456
+#: src/dns/gnunet-service-dns.c:459
 msgid "# DNS requests answered via TUN interface"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:603
+#: src/dns/gnunet-service-dns.c:606
 msgid "# DNS exit failed (failed to open socket)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:714
+#: src/dns/gnunet-service-dns.c:717
 msgid "# External DNS response discarded (no matching request)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:792
+#: src/dns/gnunet-service-dns.c:795
 msgid "# Client response discarded (no matching request)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:907
+#: src/dns/gnunet-service-dns.c:910
 msgid "Received malformed IPv4-UDP packet on TUN interface.\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:923
+#: src/dns/gnunet-service-dns.c:926
 msgid "Received malformed IPv6-UDP packet on TUN interface.\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:932
+#: src/dns/gnunet-service-dns.c:935
 #, c-format
 msgid "Got non-IP packet with %u bytes and protocol %u from TUN\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:942
+#: src/dns/gnunet-service-dns.c:945
 msgid "# Non-DNS UDP packet received via TUN interface"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:1009
+#: src/dns/gnunet-service-dns.c:1012
 #, fuzzy
 msgid "# DNS requests received via TUN interface"
 msgstr "# các đáp ứng lỗ hổng được gửi cho trình/máy khách"
 
-#: src/dns/gnunet-service-dns.c:1049
-#, c-format
-msgid "`%s' must be installed SUID, refusing to run\n"
-msgstr ""
-
-#: src/dns/gnunet-service-dns.c:1069 src/exit/gnunet-daemon-exit.c:3594
+#: src/dns/gnunet-service-dns.c:1064 src/exit/gnunet-daemon-exit.c:3594
 #, fuzzy
 msgid "need a valid IPv4 or IPv6 address\n"
 msgstr "Mức ưu tiên tiến trình không hợp lê « %s ».\n"
 
+#: src/dns/gnunet-service-dns.c:1082
+#, c-format
+msgid "`%s' must be installed SUID, will not run DNS interceptor\n"
+msgstr ""
+
 #: src/dv/gnunet-dv.c:169
 msgid "verbose output"
 msgstr ""
@@ -2865,58 +2881,58 @@
 msgid "Daemon to run to provide an IP exit node for the VPN"
 msgstr ""
 
-#: src/fragmentation/defragmentation.c:271
+#: src/fragmentation/defragmentation.c:277
 msgid "# acknowledgements sent for fragment"
 msgstr ""
 
-#: src/fragmentation/defragmentation.c:463
+#: src/fragmentation/defragmentation.c:470
 #: src/transport/plugin_transport_wlan.c:1515
 #, fuzzy
 msgid "# fragments received"
 msgstr "# các mảnh bị loại bỏ"
 
-#: src/fragmentation/defragmentation.c:533
+#: src/fragmentation/defragmentation.c:540
 #, fuzzy
 msgid "# duplicate fragments received"
 msgstr "# các kết quả dht được nhận"
 
-#: src/fragmentation/defragmentation.c:549
+#: src/fragmentation/defragmentation.c:558
 msgid "# messages defragmented"
 msgstr "# các thông báo được chắp liền"
 
-#: src/fragmentation/fragmentation.c:234
+#: src/fragmentation/fragmentation.c:235
 #, fuzzy
 msgid "# fragments transmitted"
 msgstr "# Các tự quảng cáo được truyền"
 
-#: src/fragmentation/fragmentation.c:237
+#: src/fragmentation/fragmentation.c:240
 #, fuzzy
 msgid "# fragments retransmitted"
 msgstr "# Các tự quảng cáo được truyền"
 
-#: src/fragmentation/fragmentation.c:263
+#: src/fragmentation/fragmentation.c:269
 #, fuzzy
 msgid "# fragments wrap arounds"
 msgstr "# Các tự quảng cáo được truyền"
 
-#: src/fragmentation/fragmentation.c:307
+#: src/fragmentation/fragmentation.c:315
 msgid "# messages fragmented"
 msgstr "# các thông báo bị tế phân"
 
-#: src/fragmentation/fragmentation.c:310
+#: src/fragmentation/fragmentation.c:321
 msgid "# total size of fragmented messages"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:431
+#: src/fragmentation/fragmentation.c:444
 #, fuzzy
 msgid "# fragment acknowledgements received"
 msgstr "# Các quảng cáo đồng đẳng được nhận"
 
-#: src/fragmentation/fragmentation.c:437
+#: src/fragmentation/fragmentation.c:451
 msgid "# bits removed from fragmentation ACKs"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:461
+#: src/fragmentation/fragmentation.c:475
 #, fuzzy
 msgid "# fragmentation transmissions completed"
 msgstr "# các sự truyền PONG bị lỗi"
@@ -3186,59 +3202,59 @@
 msgid "Got result with unknown block type `%d', ignoring"
 msgstr ""
 
-#: src/fs/fs_unindex.c:59
+#: src/fs/fs_unindex.c:63
 msgid "Failed to find given position in file"
 msgstr ""
 
-#: src/fs/fs_unindex.c:64
+#: src/fs/fs_unindex.c:68
 #, fuzzy
 msgid "Failed to read file"
 msgstr "Lỗi gửi tin nhẳn.\n"
 
-#: src/fs/fs_unindex.c:234
+#: src/fs/fs_unindex.c:245
 msgid "Unexpected time for a response from `fs' service."
 msgstr ""
 
-#: src/fs/fs_unindex.c:242
+#: src/fs/fs_unindex.c:253
 msgid "Timeout waiting for `fs' service."
 msgstr ""
 
-#: src/fs/fs_unindex.c:250
+#: src/fs/fs_unindex.c:261
 #, fuzzy
 msgid "Invalid response from `fs' service."
 msgstr "Đối số không hợp lệ cho « %s ».\n"
 
-#: src/fs/fs_unindex.c:291
+#: src/fs/fs_unindex.c:304
 #, fuzzy
 msgid "Failed to connect to FS service for unindexing."
 msgstr "Không kết nối được đến trình nền gnunetd."
 
-#: src/fs/fs_unindex.c:347 src/fs/fs_unindex.c:359
+#: src/fs/fs_unindex.c:360 src/fs/fs_unindex.c:372
 #, fuzzy
 msgid "Failed to get KSKs from directory scan."
 msgstr "Lỗi truy cập đến thư mục nhà GNUnet « %s »\n"
 
-#: src/fs/fs_unindex.c:355
+#: src/fs/fs_unindex.c:368
 #, fuzzy, c-format
 msgid "Internal error scanning `%s'.\n"
 msgstr "=\tLỗi đọc thư mục.\n"
 
-#: src/fs/fs_unindex.c:414
+#: src/fs/fs_unindex.c:427
 #, fuzzy, c-format
 msgid "Failed to remove UBlock: %s\n"
 msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
 
-#: src/fs/fs_unindex.c:562 src/fs/fs_unindex.c:626
+#: src/fs/fs_unindex.c:590 src/fs/fs_unindex.c:656
 #, fuzzy
 msgid "Failed to connect to `datastore' service."
 msgstr "Lỗi sơ khởi dịch vụ « %s ».\n"
 
-#: src/fs/fs_unindex.c:639
+#: src/fs/fs_unindex.c:669
 #, fuzzy
 msgid "Failed to open file for unindexing."
 msgstr "Không kết nối được đến trình nền gnunetd."
 
-#: src/fs/fs_unindex.c:673
+#: src/fs/fs_unindex.c:708
 #, fuzzy
 msgid "Failed to compute hash of file."
 msgstr "Không kết nối được đến trình nền gnunetd."
@@ -3837,101 +3853,101 @@
 msgid "# cadet connections active"
 msgstr "# các kết nối dht"
 
-#: src/fs/gnunet-service-fs_cp.c:726
+#: src/fs/gnunet-service-fs_cp.c:735
 #, fuzzy
 msgid "# migration stop messages received"
 msgstr "# các thông báo phát hiện dht được nhận"
 
-#: src/fs/gnunet-service-fs_cp.c:730
+#: src/fs/gnunet-service-fs_cp.c:739
 #, c-format
 msgid "Migration of content to peer `%s' blocked for %s\n"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:768
+#: src/fs/gnunet-service-fs_cp.c:776
 #, fuzzy
 msgid "# replies transmitted to other peers"
 msgstr "# các byte kiểu %d được gửi "
 
-#: src/fs/gnunet-service-fs_cp.c:774
+#: src/fs/gnunet-service-fs_cp.c:784
 #, fuzzy
 msgid "# replies dropped"
 msgstr "# các đáp ứng dht được định tuyến"
 
-#: src/fs/gnunet-service-fs_cp.c:799 src/fs/gnunet-service-fs_cp.c:1384
+#: src/fs/gnunet-service-fs_cp.c:810 src/fs/gnunet-service-fs_cp.c:1404
 msgid "# P2P searches active"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:904
+#: src/fs/gnunet-service-fs_cp.c:915
 msgid "# artificial delays introduced (ms)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:960
+#: src/fs/gnunet-service-fs_cp.c:971
 #, fuzzy
 msgid "# replies dropped due to type mismatch"
 msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
 
-#: src/fs/gnunet-service-fs_cp.c:968
+#: src/fs/gnunet-service-fs_cp.c:979
 #, fuzzy
 msgid "# replies received for other peers"
 msgstr "# các byte kiểu %d được nhận"
 
-#: src/fs/gnunet-service-fs_cp.c:982
+#: src/fs/gnunet-service-fs_cp.c:993
 msgid "# replies dropped due to insufficient cover traffic"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1030
+#: src/fs/gnunet-service-fs_cp.c:1041
 msgid "# P2P searches destroyed due to ultimate reply"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1098
+#: src/fs/gnunet-service-fs_cp.c:1109
 #, fuzzy
 msgid "# requests done for free (low load)"
 msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
 
-#: src/fs/gnunet-service-fs_cp.c:1123
+#: src/fs/gnunet-service-fs_cp.c:1134
 msgid "# request dropped, priority insufficient"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1133
+#: src/fs/gnunet-service-fs_cp.c:1144
 #, fuzzy
 msgid "# requests done for a price (normal load)"
 msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
 
-#: src/fs/gnunet-service-fs_cp.c:1210
+#: src/fs/gnunet-service-fs_cp.c:1221
 msgid "# GET requests received (from other peers)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1245
+#: src/fs/gnunet-service-fs_cp.c:1256
 #, fuzzy
 msgid "# requests dropped due to initiator not being connected"
 msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
 
-#: src/fs/gnunet-service-fs_cp.c:1266
+#: src/fs/gnunet-service-fs_cp.c:1277
 #, fuzzy
 msgid "# requests dropped due to missing reverse route"
 msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
 
-#: src/fs/gnunet-service-fs_cp.c:1277
+#: src/fs/gnunet-service-fs_cp.c:1288
 #, fuzzy
 msgid "# requests dropped due to full reply queue"
 msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
 
-#: src/fs/gnunet-service-fs_cp.c:1329
+#: src/fs/gnunet-service-fs_cp.c:1340
 #, fuzzy
 msgid "# requests dropped due TTL underflow"
 msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
 
-#: src/fs/gnunet-service-fs_cp.c:1353
+#: src/fs/gnunet-service-fs_cp.c:1365
 #, fuzzy
 msgid "# requests dropped due to higher-TTL request"
 msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
 
-#: src/fs/gnunet-service-fs_cp.c:1382
+#: src/fs/gnunet-service-fs_cp.c:1402
 #, fuzzy
 msgid "# P2P query messages received and processed"
 msgstr "# các thông báo phát hiện dht được nhận"
 
-#: src/fs/gnunet-service-fs_cp.c:1821
+#: src/fs/gnunet-service-fs_cp.c:1841
 #, fuzzy
 msgid "# migration stop messages sent"
 msgstr "# các thông báo phát hiện dht được nhận"
@@ -4280,7 +4296,7 @@
 msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:215
+#: src/gns/gnunet-gns.c:215 src/gns/plugin_rest_gns.c:334
 #, c-format
 msgid "Invalid typename specified, assuming `ANY'\n"
 msgstr ""
@@ -4296,6 +4312,7 @@
 msgstr ""
 
 #: src/gns/gnunet-gns.c:353 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/plugin_rest_gns.c:459
 #, c-format
 msgid ""
 "Ego for `gns-master' not found, cannot perform lookup.  Did you run gnunet-"
@@ -4437,7 +4454,7 @@
 msgid "Failed to start HTTPS server for `%s'\n"
 msgstr "Lỗi bắt đầu thu thập.\n"
 
-#: src/gns/gnunet-gns-proxy.c:2225
+#: src/gns/gnunet-gns-proxy.c:2225 src/rest/gnunet-rest-server.c:529
 #, fuzzy
 msgid "Failed to pass client to MHD\n"
 msgstr "Lỗi kết nối đến gnunetd.\n"
@@ -4542,21 +4559,21 @@
 msgid "GNS lookup resulted in DNS name that is too long (`%s')\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:1886
+#: src/gns/gnunet-service-gns_resolver.c:1891
 msgid "GNS lookup recursion failed (no delegation record found)\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:1910
+#: src/gns/gnunet-service-gns_resolver.c:1915
 #, fuzzy, c-format
 msgid "Failed to cache GNS resolution: %s\n"
 msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
 
-#: src/gns/gnunet-service-gns_resolver.c:2192
+#: src/gns/gnunet-service-gns_resolver.c:2197
 #, c-format
 msgid "Zone %s was revoked, resolution fails\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:2341
+#: src/gns/gnunet-service-gns_resolver.c:2346
 #, c-format
 msgid "Hostname `%s' is not well-formed, resolution fails\n"
 msgstr ""
@@ -4586,6 +4603,15 @@
 msgid "Unable to parse BOX record string `%s'\n"
 msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
 
+#: src/gns/plugin_rest_gns.c:422
+msgid "Ego for not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:652
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
 #: src/gnsrecord/plugin_gnsrecord_dns.c:291
 #, fuzzy, c-format
 msgid "Unable to parse IPv4 address `%s'\n"
@@ -5120,6 +5146,11 @@
 msgid "Failed to create directory `%s' for storing egos\n"
 msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
 
+#: src/identity/plugin_rest_identity.c:803
+#, fuzzy
+msgid "Identity REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
 #: src/mysql/mysql.c:174
 #, c-format
 msgid "Trying to use file `%s' for MySQL configuration.\n"
@@ -5145,9 +5176,9 @@
 msgid "You must specify which zone should be accessed\n"
 msgstr "chỉ ra TRUYỀN_TẢI nào cần được thử nghiệm"
 
-#: src/namecache/gnunet-namecache.c:195 src/namestore/gnunet-namestore.c:844
+#: src/namecache/gnunet-namecache.c:195
 #, fuzzy, c-format
-msgid "Invalid public key for reverse lookup `%s'\n"
+msgid "Invalid public key for zone `%s'\n"
 msgstr "Đối số không hợp lệ cho « %s ».\n"
 
 #: src/namecache/gnunet-namecache.c:203
@@ -5185,11 +5216,13 @@
 msgstr "Gặp lỗi khi tải lên tập tin: %s\n"
 
 #: src/namestore/gnunet-namestore.c:332
+#: src/namestore/plugin_rest_namestore.c:505
 #, fuzzy, c-format
 msgid "Deleting record failed, record does not exist%s%s\n"
 msgstr "Gặp lỗi khi tải lên tập tin: %s\n"
 
 #: src/namestore/gnunet-namestore.c:339
+#: src/namestore/plugin_rest_namestore.c:514
 #, fuzzy, c-format
 msgid "Deleting record failed%s%s\n"
 msgstr "Gặp lỗi khi tải lên tập tin: %s\n"
@@ -5207,6 +5240,7 @@
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:628
+#: src/namestore/plugin_rest_namestore.c:538
 #, c-format
 msgid "There are no records under label `%s' that could be deleted.\n"
 msgstr ""
@@ -5224,6 +5258,7 @@
 
 #: src/namestore/gnunet-namestore.c:719
 #: src/namestore/gnunet-namestore-fcfsd.c:984
+#: src/namestore/plugin_rest_namestore.c:821
 #, fuzzy
 msgid "Failed to connect to namestore\n"
 msgstr "Không kết nối được đến trình nền gnunetd."
@@ -5241,11 +5276,14 @@
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:745
+#: src/namestore/plugin_rest_namestore.c:608
 #, fuzzy, c-format
 msgid "Unsupported type `%s'\n"
 msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
 
 #: src/namestore/gnunet-namestore.c:765
+#: src/namestore/plugin_rest_namestore.c:626
+#: src/namestore/plugin_rest_namestore.c:666
 #, c-format
 msgid "Value `%s' invalid for record type `%s'\n"
 msgstr ""
@@ -5259,6 +5297,11 @@
 msgid "del"
 msgstr ""
 
+#: src/namestore/gnunet-namestore.c:844
+#, fuzzy, c-format
+msgid "Invalid public key for reverse lookup `%s'\n"
+msgstr "Đối số không hợp lệ cho « %s ».\n"
+
 #: src/namestore/gnunet-namestore.c:868
 #: src/peerinfo-tool/gnunet-peerinfo.c:817
 #, fuzzy, c-format
@@ -5271,21 +5314,25 @@
 msgstr "Dữ liệu nhập không hợp lệ.\n"
 
 #: src/namestore/gnunet-namestore.c:943
+#: src/namestore/plugin_rest_namestore.c:851
 #, c-format
 msgid "Ego `%s' not known to identity service\n"
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:970
+#: src/namestore/plugin_rest_namestore.c:878
 #, c-format
 msgid "No default ego configured in identity service\n"
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:1006
+#: src/namestore/plugin_rest_namestore.c:917
 #, fuzzy, c-format
 msgid "Identity service is not running\n"
 msgstr "« %s » không phải là một tập tin.\n"
 
 #: src/namestore/gnunet-namestore.c:1018
+#: src/namestore/plugin_rest_namestore.c:946
 #, fuzzy, c-format
 msgid "Cannot connect to identity service\n"
 msgstr "Không thể kết nối tới %s:%u: %s\n"
@@ -5417,6 +5464,11 @@
 msgid "Namestore failed to store record\n"
 msgstr ""
 
+#: src/namestore/plugin_rest_namestore.c:1023
+#, fuzzy
+msgid "Namestore REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
 #: src/nat/gnunet-nat-server.c:279
 #, c-format
 msgid "Please pass valid port number as the first argument! (got `%s')\n"
@@ -5665,7 +5717,7 @@
 msgstr "Không thể truy cập đến dịch vụ"
 
 #: src/nse/gnunet-service-nse.c:1537
-#: src/revocation/gnunet-service-revocation.c:815 src/util/gnunet-scrypt.c:260
+#: src/revocation/gnunet-service-revocation.c:827 src/util/gnunet-scrypt.c:260
 #, fuzzy
 msgid "Value is too large.\n"
 msgstr "Giá trị không nằm trong phạm vi được phép."
@@ -6214,6 +6266,15 @@
 msgid "Regex `%s' is too long!\n"
 msgstr "« %s » không phải là một tập tin.\n"
 
+#: src/rest/gnunet-rest-server.c:766
+msgid "listen on specified port (default: 7776)"
+msgstr ""
+
+#: src/rest/gnunet-rest-server.c:783
+#, fuzzy
+msgid "GNUnet REST server"
+msgstr "Bản ghi lỗi GNUnet"
+
 #: src/revocation/gnunet-revocation.c:126
 #, fuzzy, c-format
 msgid "Key `%s' is valid\n"
@@ -6344,11 +6405,11 @@
 msgstr "# các sự truyền PONG bị lỗi"
 
 #: src/revocation/gnunet-service-revocation.c:493
-#: src/revocation/gnunet-service-revocation.c:747
+#: src/revocation/gnunet-service-revocation.c:759
 msgid "SET service crashed, terminating revocation service\n"
 msgstr ""
 
-#: src/revocation/gnunet-service-revocation.c:839
+#: src/revocation/gnunet-service-revocation.c:851
 #, fuzzy
 msgid "Could not open revocation database file!"
 msgstr "« %s »: Không thể kết nối.\n"
@@ -8095,7 +8156,7 @@
 msgstr ""
 
 #: src/transport/plugin_transport_http_server.c:2825
-#: src/transport/plugin_transport_udp.c:3336
+#: src/transport/plugin_transport_udp.c:3335
 msgid "Disabling IPv6 since it is not supported on this system!\n"
 msgstr ""
 
@@ -8329,50 +8390,50 @@
 msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3082
+#: src/transport/plugin_transport_udp.c:3081
 #, c-format
 msgid ""
 "UDP could not transmit message to `%s': Network seems down, please check "
 "your network configuration\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3096
+#: src/transport/plugin_transport_udp.c:3095
 msgid ""
 "UDP could not transmit IPv6 message! Please check your network configuration "
 "and disable IPv6 if your connection does not have a global IPv6 address\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3412
-#: src/transport/plugin_transport_udp.c:3511
+#: src/transport/plugin_transport_udp.c:3411
+#: src/transport/plugin_transport_udp.c:3510
 #, fuzzy, c-format
 msgid "Failed to bind UDP socket to %s: %s\n"
 msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
 
-#: src/transport/plugin_transport_udp.c:3430
+#: src/transport/plugin_transport_udp.c:3429
 msgid "Disabling IPv4 since it is not supported on this system!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3521
+#: src/transport/plugin_transport_udp.c:3520
 #, fuzzy
 msgid "Failed to open UDP sockets\n"
 msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
 
-#: src/transport/plugin_transport_udp.c:3592
-#: src/transport/plugin_transport_udp.c:3606
+#: src/transport/plugin_transport_udp.c:3591
+#: src/transport/plugin_transport_udp.c:3605
 msgid "must be in [0,65535]"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3638
+#: src/transport/plugin_transport_udp.c:3637
 #, fuzzy
 msgid "must be valid IPv4 address"
 msgstr "« %s » không sẵn sàng.\n"
 
-#: src/transport/plugin_transport_udp.c:3665
+#: src/transport/plugin_transport_udp.c:3664
 #, fuzzy
 msgid "must be valid IPv6 address"
 msgstr "« %s » không sẵn sàng.\n"
 
-#: src/transport/plugin_transport_udp.c:3731
+#: src/transport/plugin_transport_udp.c:3730
 #, fuzzy
 msgid "Failed to create UDP network sockets\n"
 msgstr "Không thể tạo miền tên.\n"
@@ -8595,7 +8656,7 @@
 msgid "Syntax error while deserializing in line %u\n"
 msgstr "Gặp lỗi cú pháp trong tập tin cấu hình « %s » tại dòng %d.\n"
 
-#: src/util/configuration.c:1026
+#: src/util/configuration.c:1025
 #, c-format
 msgid ""
 "Configuration value '%s' for '%s' in section '%s' is not in set of legal "
@@ -8604,17 +8665,17 @@
 "Giá trị cấu hình « %s » cho « %s » trong phần « %s » không phải nằm trong "
 "tập hợp các sự chọn được phép\n"
 
-#: src/util/configuration.c:1145
+#: src/util/configuration.c:1144
 #, c-format
 msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
 msgstr ""
 
-#: src/util/configuration.c:1177
+#: src/util/configuration.c:1176
 #, fuzzy, c-format
 msgid "Missing closing `%s' in option `%s'\n"
 msgstr "Giá trị cấu hình « %s » cho « %s » trong phần « %s » nên là con số\n"
 
-#: src/util/configuration.c:1251
+#: src/util/configuration.c:1250
 #, c-format
 msgid ""
 "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8638,52 +8699,52 @@
 "%llu)\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:731 src/util/crypto_ecc.c:769
-#: src/util/crypto_ecc.c:887 src/util/crypto_ecc.c:925
+#: src/util/crypto_ecc.c:733 src/util/crypto_ecc.c:771
+#: src/util/crypto_ecc.c:889 src/util/crypto_ecc.c:927
 #, fuzzy, c-format
 msgid "Could not acquire lock on file `%s': %s...\n"
 msgstr "Lỗi mở tập tin theo dõi « %s »: %s\n"
 
-#: src/util/crypto_ecc.c:736 src/util/crypto_ecc.c:892
+#: src/util/crypto_ecc.c:738 src/util/crypto_ecc.c:894
 #, fuzzy
 msgid "Creating a new private key.  This may take a while.\n"
 msgstr "Đang tạo khoá máy mới (có thể hơi lâu).\n"
 
-#: src/util/crypto_ecc.c:773 src/util/crypto_ecc.c:929
+#: src/util/crypto_ecc.c:775 src/util/crypto_ecc.c:931
 msgid "This may be ok if someone is currently generating a private key.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:803 src/util/crypto_ecc.c:959
+#: src/util/crypto_ecc.c:805 src/util/crypto_ecc.c:961
 #, c-format
 msgid ""
 "When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:807 src/util/crypto_ecc.c:963
+#: src/util/crypto_ecc.c:809 src/util/crypto_ecc.c:965
 msgid "This may be ok if someone is currently generating a key.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:1045
+#: src/util/crypto_ecc.c:1047
 #, fuzzy
 msgid "Could not load peer's private key\n"
 msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
 
-#: src/util/crypto_ecc.c:1149
+#: src/util/crypto_ecc.c:1151
 #, fuzzy, c-format
 msgid "ECC signing failed at %s:%d: %s\n"
 msgstr "%s bị lỗi tại %s:%d: « %s »\n"
 
-#: src/util/crypto_ecc.c:1199
+#: src/util/crypto_ecc.c:1201
 #, fuzzy, c-format
 msgid "EdDSA signing failed at %s:%d: %s\n"
 msgstr "%s bị lỗi tại %s:%d: « %s »\n"
 
-#: src/util/crypto_ecc.c:1273
+#: src/util/crypto_ecc.c:1275
 #, fuzzy, c-format
 msgid "ECDSA signature verification failed at %s:%d: %s\n"
 msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n"
 
-#: src/util/crypto_ecc.c:1330
+#: src/util/crypto_ecc.c:1332
 #, fuzzy, c-format
 msgid "EdDSA signature verification failed at %s:%d: %s\n"
 msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n"
@@ -8693,17 +8754,17 @@
 msgid "libgcrypt has not the expected version (version %s is required).\n"
 msgstr "libgcrypt không có phiên bản mong đợi (yêu cầu phiên bản %s).\n"
 
-#: src/util/crypto_rsa.c:809
+#: src/util/crypto_rsa.c:825
 #, c-format
 msgid "RSA signature verification failed at %s:%d: %s\n"
 msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n"
 
-#: src/util/disk.c:1218
+#: src/util/disk.c:1222
 #, c-format
 msgid "Expected `%s' to be a directory!\n"
 msgstr "Mong đợi « %s » là một thư mục.\n"
 
-#: src/util/disk.c:1580 src/util/service.c:1328
+#: src/util/disk.c:1584 src/util/service.c:1328
 #, c-format
 msgid "Cannot obtain information about user `%s': %s\n"
 msgstr "Không thể lấy thông tin về người dùng « %s »: %s\n"
@@ -8769,7 +8830,7 @@
 msgstr ""
 "Hãy sử dụng câu lệnh trợ giúp « --help » để xem danh sách các tùy chọn.\n"
 
-#: src/util/getopt_helpers.c:84
+#: src/util/getopt_helpers.c:90
 #, c-format
 msgid ""
 "Arguments mandatory for long options are also mandatory for short options.\n"
@@ -8777,12 +8838,12 @@
 "Mọi đối số bắt buộc phải sử dụng với tùy chọn dài cũng bắt buộc với tùy chọn "
 "ngắn.\n"
 
-#: src/util/getopt_helpers.c:268 src/util/getopt_helpers.c:326
+#: src/util/getopt_helpers.c:274 src/util/getopt_helpers.c:332
 #, c-format
 msgid "You must pass a number to the `%s' option.\n"
 msgstr "Phải gửi một con số cho tùy chọn « %s ».\n"
 
-#: src/util/getopt_helpers.c:298
+#: src/util/getopt_helpers.c:304
 #, fuzzy, c-format
 msgid "You must pass relative time to the `%s' option.\n"
 msgstr "Phải gửi một con số cho tùy chọn « %s ».\n"
@@ -9025,22 +9086,22 @@
 msgid "GetExitCodeProcess failed for binary %s (%d).\n"
 msgstr ""
 
-#: src/util/plugin.c:87
+#: src/util/plugin.c:86
 #, c-format
 msgid "Initialization of plugin mechanism failed: %s!\n"
 msgstr "Lỗi sơ khởi cơ chế phần bổ sung: %s\n"
 
-#: src/util/plugin.c:148
+#: src/util/plugin.c:151
 #, c-format
 msgid "`%s' failed to resolve method '%s' with error: %s\n"
 msgstr "« %s » không giải quyết được phương pháp « %s », với lỗi: %s\n"
 
-#: src/util/plugin.c:223
+#: src/util/plugin.c:226
 #, c-format
 msgid "`%s' failed for library `%s' with error: %s\n"
 msgstr "« %s » thất bại cho thư viện « %s » với lỗi: %s\n"
 
-#: src/util/plugin.c:382
+#: src/util/plugin.c:385
 #, fuzzy
 msgid "Could not determine plugin installation path.\n"
 msgstr "Không thể truy cập đến thông tin về không gian tên.\n"
@@ -9694,10 +9755,6 @@
 #~ msgstr "« %.*s » được kết nối tới « %.*s ».\n"
 
 #, fuzzy
-#~ msgid "CADET initialized\n"
-#~ msgstr "Lỗi sơ khởi lõi.\n"
-
-#, fuzzy
 #~ msgid "Reloading sensor definitions from directory `%s'\n"
 #~ msgstr "Đang tải %d tập tin xuống thư mục « %s ».\n"
 

Modified: gnunet/po/zh_CN.po
===================================================================
--- gnunet/po/zh_CN.po  2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/zh_CN.po  2015-04-27 11:12:21 UTC (rev 35559)
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gnunet-0.8.1\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2015-03-14 18:00+0100\n"
+"POT-Creation-Date: 2015-04-27 13:05+0200\n"
 "PO-Revision-Date: 2011-07-09 12:12+0800\n"
 "Last-Translator: Wylmer Wang <address@hidden>\n"
 "Language-Team: Chinese (simplified) <address@hidden>\n"
@@ -496,16 +496,16 @@
 msgid "Could not connect master [%u] and slave [%u]\n"
 msgstr "无法连接到 %s:%u:%s\n"
 
-#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:662
+#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:634
 #, fuzzy
 msgid "Initialization failed, shutdown\n"
 msgstr "插件机构初始化失败:%s!\n"
 
-#: src/ats-tests/ats-testing-log.c:846
+#: src/ats-tests/ats-testing-log.c:834
 msgid "Stop logging\n"
 msgstr ""
 
-#: src/ats-tests/ats-testing-log.c:897
+#: src/ats-tests/ats-testing-log.c:885
 #, fuzzy, c-format
 msgid "Start logging `%s'\n"
 msgstr "未知的命令“%s”。\n"
@@ -553,6 +553,7 @@
 msgstr ""
 
 #: src/ats-tool/gnunet-ats.c:708 src/namestore/gnunet-namestore.c:700
+#: src/namestore/plugin_rest_namestore.c:812
 #: src/transport/gnunet-transport.c:1890
 #: src/transport/gnunet-transport-profiler.c:531
 #, fuzzy, c-format
@@ -1402,29 +1403,29 @@
 msgid "# PAYLOAD dropped (out of order)"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:168
+#: src/core/gnunet-service-core_neighbours.c:177
 msgid "# sessions terminated by transport disconnect"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:184
-#: src/core/gnunet-service-core_neighbours.c:342
+#: src/core/gnunet-service-core_neighbours.c:193
+#: src/core/gnunet-service-core_neighbours.c:355
 msgid "# neighbour entries allocated"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:252
+#: src/core/gnunet-service-core_neighbours.c:264
 msgid "# encrypted bytes given to transport"
 msgstr ""
 
-#: src/core/gnunet-service-core_neighbours.c:425
+#: src/core/gnunet-service-core_neighbours.c:438
 #, c-format
 msgid "Unsupported message of type %u (%u bytes) received from peer `%s'\n"
 msgstr ""
 
-#: src/core/gnunet-service-core_sessions.c:245
-#: src/core/gnunet-service-core_sessions.c:331
+#: src/core/gnunet-service-core_sessions.c:252
+#: src/core/gnunet-service-core_sessions.c:338
 #: src/dht/gnunet-service-dht_neighbours.c:661
 #: src/dht/gnunet-service-dht_neighbours.c:726
-#: src/fs/gnunet-service-fs_cp.c:645 src/fs/gnunet-service-fs_cp.c:1627
+#: src/fs/gnunet-service-fs_cp.c:654 src/fs/gnunet-service-fs_cp.c:1647
 #: src/topology/gnunet-daemon-topology.c:734
 #: src/topology/gnunet-daemon-topology.c:835
 #: src/transport/gnunet-service-transport_neighbours.c:755
@@ -1432,21 +1433,21 @@
 msgid "# peers connected"
 msgstr ""
 
-#: src/core/gnunet-service-core_sessions.c:278
+#: src/core/gnunet-service-core_sessions.c:285
 msgid "# type map refreshes sent"
 msgstr ""
 
-#: src/core/gnunet-service-core_sessions.c:397
+#: src/core/gnunet-service-core_sessions.c:404
 #, fuzzy
 msgid "# outdated typemap confirmations received"
 msgstr "保存配置失败。"
 
-#: src/core/gnunet-service-core_sessions.c:408
+#: src/core/gnunet-service-core_sessions.c:415
 #, fuzzy
 msgid "# valid typemap confirmations received"
 msgstr "保存配置失败。"
 
-#: src/core/gnunet-service-core_sessions.c:546
+#: src/core/gnunet-service-core_sessions.c:554
 msgid "# messages discarded (expired prior to transmission)"
 msgstr ""
 
@@ -1460,7 +1461,7 @@
 msgstr ""
 
 #: src/datacache/datacache.c:115 src/datacache/datacache.c:266
-#: src/datastore/gnunet-service-datastore.c:855
+#: src/datastore/gnunet-service-datastore.c:841
 msgid "# bytes stored"
 msgstr ""
 
@@ -1469,8 +1470,8 @@
 msgstr ""
 
 #: src/datacache/datacache.c:143 src/datacache/datacache.c:150
-#: src/datastore/gnunet-service-datastore.c:1557
-#: src/datastore/gnunet-service-datastore.c:1568
+#: src/datastore/gnunet-service-datastore.c:1598
+#: src/datastore/gnunet-service-datastore.c:1609
 #, c-format
 msgid "No `%s' specified for `%s' in configuration!\n"
 msgstr ""
@@ -1504,8 +1505,8 @@
 
 #: src/datacache/plugin_datacache_sqlite.c:69
 #: src/datacache/plugin_datacache_sqlite.c:72
-#: src/datastore/plugin_datastore_mysql.c:809
-#: src/datastore/plugin_datastore_mysql.c:823
+#: src/datastore/plugin_datastore_mysql.c:818
+#: src/datastore/plugin_datastore_mysql.c:834
 #: src/datastore/plugin_datastore_sqlite.c:57 src/mysql/mysql.c:41
 #: src/mysql/mysql.c:48 src/mysql/mysql.c:522 src/mysql/mysql.c:531
 #: src/mysql/mysql.c:591 src/mysql/mysql.c:607
@@ -1697,8 +1698,8 @@
 
 #: src/datastore/gnunet-service-datastore.c:712
 #: src/datastore/gnunet-service-datastore.c:767
-#: src/datastore/gnunet-service-datastore.c:982
-#: src/datastore/gnunet-service-datastore.c:1529
+#: src/datastore/gnunet-service-datastore.c:999
+#: src/datastore/gnunet-service-datastore.c:1570
 msgid "# reserved"
 msgstr ""
 
@@ -1706,130 +1707,145 @@
 msgid "Could not find matching reservation"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:867
+#: src/datastore/gnunet-service-datastore.c:853
 #, c-format
 msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1029
+#: src/datastore/gnunet-service-datastore.c:1046
 msgid "# GET requests received"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1041
+#: src/datastore/gnunet-service-datastore.c:1058
 msgid "# requests filtered by bloomfilter"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1069
+#: src/datastore/gnunet-service-datastore.c:1094
 msgid "# UPDATE requests received"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1099
+#: src/datastore/gnunet-service-datastore.c:1122
 msgid "# GET REPLICATION requests received"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1132
+#: src/datastore/gnunet-service-datastore.c:1155
 msgid "# GET ZERO ANONYMITY requests received"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1157
+#: src/datastore/gnunet-service-datastore.c:1180
 msgid "Content not found"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1165
+#: src/datastore/gnunet-service-datastore.c:1188
 msgid "# bytes removed (explicit request)"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1197
+#: src/datastore/gnunet-service-datastore.c:1220
 msgid "# REMOVE requests received"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1241
+#: src/datastore/gnunet-service-datastore.c:1264
 #, c-format
 msgid ""
 "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1269
 #, c-format
 msgid "New payload: %lld\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1299
+#: src/datastore/gnunet-service-datastore.c:1322
 #, c-format
 msgid "Loading `%s' datastore plugin\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1310
+#: src/datastore/gnunet-service-datastore.c:1333
 #, fuzzy, c-format
 msgid "Failed to load datastore plugin for `%s'\n"
 msgstr "解析配置文件“%s”失败\n"
 
-#: src/datastore/gnunet-service-datastore.c:1412
+#: src/datastore/gnunet-service-datastore.c:1402
+#: src/datastore/gnunet-service-datastore.c:1463
+msgid "Bloomfilter construction complete.\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1450
 msgid "Rebuilding bloomfilter.  Please be patient.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1419
+#: src/datastore/gnunet-service-datastore.c:1460
 msgid "Plugin does not support get_keys function. Please fix!\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1422
-msgid "Bloomfilter construction complete.\n"
-msgstr ""
-
-#: src/datastore/gnunet-service-datastore.c:1562
+#: src/datastore/gnunet-service-datastore.c:1603
 #, c-format
 msgid "# bytes used in file-sharing datastore `%s'"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1573
+#: src/datastore/gnunet-service-datastore.c:1614
 msgid "# quota"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1575
+#: src/datastore/gnunet-service-datastore.c:1616
 msgid "# cache size"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1588
+#: src/datastore/gnunet-service-datastore.c:1629
 #, c-format
 msgid "Could not use specified filename `%s' for bloomfilter.\n"
 msgstr ""
 
-#: src/datastore/gnunet-service-datastore.c:1606
-#: src/datastore/gnunet-service-datastore.c:1622
+#: src/datastore/gnunet-service-datastore.c:1647
+#: src/datastore/gnunet-service-datastore.c:1663
 #, fuzzy, c-format
 msgid "Failed to remove bogus bloomfilter file `%s'\n"
 msgstr "解析配置文件“%s”失败\n"
 
-#: src/datastore/gnunet-service-datastore.c:1652
+#: src/datastore/gnunet-service-datastore.c:1693
 #, fuzzy
 msgid "Failed to initialize bloomfilter.\n"
 msgstr "初始化“%s”服务失败。\n"
 
-#: src/datastore/plugin_datastore_heap.c:821
+#: src/datastore/plugin_datastore_heap.c:826
 #, fuzzy
 msgid "Heap database running\n"
 msgstr "sqlite 数据仓库"
 
-#: src/datastore/plugin_datastore_mysql.c:786
+#: src/datastore/plugin_datastore_mysql.c:309
+#: src/datastore/plugin_datastore_sqlite.c:499
+#, fuzzy
+msgid "Data too large"
+msgstr "迭代次数"
+
+#: src/datastore/plugin_datastore_mysql.c:328
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:793
 #, fuzzy, c-format
 msgid "Failed to prepare statement `%s'\n"
 msgstr "解析配置文件“%s”失败\n"
 
-#: src/datastore/plugin_datastore_mysql.c:794
+#: src/datastore/plugin_datastore_mysql.c:802
 #, fuzzy, c-format
 msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
 msgstr "“%s”于 %s:%d 处失败,错误为:%s\n"
 
-#: src/datastore/plugin_datastore_mysql.c:1025
+#: src/datastore/plugin_datastore_mysql.c:1036
 msgid "Mysql database running\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_postgres.c:837
+#: src/datastore/plugin_datastore_postgres.c:331
+msgid "Postgress exec failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_postgres.c:846
 #, fuzzy
 msgid "Failed to drop table from database.\n"
 msgstr "发送消息失败。\n"
 
-#: src/datastore/plugin_datastore_postgres.c:873
+#: src/datastore/plugin_datastore_postgres.c:882
 #: src/namecache/plugin_namecache_postgres.c:414
 #: src/namestore/plugin_namestore_postgres.c:569
 msgid "Postgres database running\n"
@@ -1852,30 +1868,30 @@
 msgid "Unable to initialize SQLite: %s.\n"
 msgstr "无法初始化 SQLite:%s。\n"
 
-#: src/datastore/plugin_datastore_sqlite.c:661
+#: src/datastore/plugin_datastore_sqlite.c:680
 #, fuzzy
 msgid "Invalid data in database.  Trying to fix (by deletion).\n"
 msgstr "%s 中有无效数据。请尝试修复(删除之)。\n"
 
-#: src/datastore/plugin_datastore_sqlite.c:1156
+#: src/datastore/plugin_datastore_sqlite.c:1177
 msgid "sqlite version to old to determine size, assuming zero\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_sqlite.c:1176
+#: src/datastore/plugin_datastore_sqlite.c:1197
 #, c-format
 msgid ""
 "Using sqlite page utilization to estimate payload (%llu pages of size %llu "
 "bytes)\n"
 msgstr ""
 
-#: src/datastore/plugin_datastore_sqlite.c:1216
+#: src/datastore/plugin_datastore_sqlite.c:1237
 #: src/namecache/plugin_namecache_sqlite.c:580
 #: src/namestore/plugin_namestore_sqlite.c:716
 #, fuzzy
 msgid "Sqlite database running\n"
 msgstr "sqlite 数据仓库"
 
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:260
 msgid "Template database running\n"
 msgstr ""
 
@@ -2476,53 +2492,53 @@
 msgid "Change DNS replies to point elsewhere."
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:456
+#: src/dns/gnunet-service-dns.c:459
 msgid "# DNS requests answered via TUN interface"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:603
+#: src/dns/gnunet-service-dns.c:606
 msgid "# DNS exit failed (failed to open socket)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:714
+#: src/dns/gnunet-service-dns.c:717
 msgid "# External DNS response discarded (no matching request)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:792
+#: src/dns/gnunet-service-dns.c:795
 msgid "# Client response discarded (no matching request)"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:907
+#: src/dns/gnunet-service-dns.c:910
 msgid "Received malformed IPv4-UDP packet on TUN interface.\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:923
+#: src/dns/gnunet-service-dns.c:926
 msgid "Received malformed IPv6-UDP packet on TUN interface.\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:932
+#: src/dns/gnunet-service-dns.c:935
 #, c-format
 msgid "Got non-IP packet with %u bytes and protocol %u from TUN\n"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:942
+#: src/dns/gnunet-service-dns.c:945
 msgid "# Non-DNS UDP packet received via TUN interface"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:1009
+#: src/dns/gnunet-service-dns.c:1012
 msgid "# DNS requests received via TUN interface"
 msgstr ""
 
-#: src/dns/gnunet-service-dns.c:1049
-#, c-format
-msgid "`%s' must be installed SUID, refusing to run\n"
-msgstr ""
-
-#: src/dns/gnunet-service-dns.c:1069 src/exit/gnunet-daemon-exit.c:3594
+#: src/dns/gnunet-service-dns.c:1064 src/exit/gnunet-daemon-exit.c:3594
 #, fuzzy
 msgid "need a valid IPv4 or IPv6 address\n"
 msgstr "无效的进程优先级“%s”\n"
 
+#: src/dns/gnunet-service-dns.c:1082
+#, c-format
+msgid "`%s' must be installed SUID, will not run DNS interceptor\n"
+msgstr ""
+
 #: src/dv/gnunet-dv.c:169
 msgid "verbose output"
 msgstr ""
@@ -2747,52 +2763,52 @@
 msgid "Daemon to run to provide an IP exit node for the VPN"
 msgstr ""
 
-#: src/fragmentation/defragmentation.c:271
+#: src/fragmentation/defragmentation.c:277
 msgid "# acknowledgements sent for fragment"
 msgstr ""
 
-#: src/fragmentation/defragmentation.c:463
+#: src/fragmentation/defragmentation.c:470
 #: src/transport/plugin_transport_wlan.c:1515
 msgid "# fragments received"
 msgstr ""
 
-#: src/fragmentation/defragmentation.c:533
+#: src/fragmentation/defragmentation.c:540
 msgid "# duplicate fragments received"
 msgstr ""
 
-#: src/fragmentation/defragmentation.c:549
+#: src/fragmentation/defragmentation.c:558
 msgid "# messages defragmented"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:234
+#: src/fragmentation/fragmentation.c:235
 msgid "# fragments transmitted"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:237
+#: src/fragmentation/fragmentation.c:240
 msgid "# fragments retransmitted"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:263
+#: src/fragmentation/fragmentation.c:269
 msgid "# fragments wrap arounds"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:307
+#: src/fragmentation/fragmentation.c:315
 msgid "# messages fragmented"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:310
+#: src/fragmentation/fragmentation.c:321
 msgid "# total size of fragmented messages"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:431
+#: src/fragmentation/fragmentation.c:444
 msgid "# fragment acknowledgements received"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:437
+#: src/fragmentation/fragmentation.c:451
 msgid "# bits removed from fragmentation ACKs"
 msgstr ""
 
-#: src/fragmentation/fragmentation.c:461
+#: src/fragmentation/fragmentation.c:475
 msgid "# fragmentation transmissions completed"
 msgstr ""
 
@@ -3055,58 +3071,58 @@
 msgid "Got result with unknown block type `%d', ignoring"
 msgstr ""
 
-#: src/fs/fs_unindex.c:59
+#: src/fs/fs_unindex.c:63
 msgid "Failed to find given position in file"
 msgstr ""
 
-#: src/fs/fs_unindex.c:64
+#: src/fs/fs_unindex.c:68
 #, fuzzy
 msgid "Failed to read file"
 msgstr "发送消息失败。\n"
 
-#: src/fs/fs_unindex.c:234
+#: src/fs/fs_unindex.c:245
 msgid "Unexpected time for a response from `fs' service."
 msgstr ""
 
-#: src/fs/fs_unindex.c:242
+#: src/fs/fs_unindex.c:253
 msgid "Timeout waiting for `fs' service."
 msgstr ""
 
-#: src/fs/fs_unindex.c:250
+#: src/fs/fs_unindex.c:261
 #, fuzzy
 msgid "Invalid response from `fs' service."
 msgstr "“%s”的参数无效。\n"
 
-#: src/fs/fs_unindex.c:291
+#: src/fs/fs_unindex.c:304
 msgid "Failed to connect to FS service for unindexing."
 msgstr ""
 
-#: src/fs/fs_unindex.c:347 src/fs/fs_unindex.c:359
+#: src/fs/fs_unindex.c:360 src/fs/fs_unindex.c:372
 #, fuzzy
 msgid "Failed to get KSKs from directory scan."
 msgstr "解析配置文件“%s”失败\n"
 
-#: src/fs/fs_unindex.c:355
+#: src/fs/fs_unindex.c:368
 #, fuzzy, c-format
 msgid "Internal error scanning `%s'.\n"
 msgstr "未知错误。\n"
 
-#: src/fs/fs_unindex.c:414
+#: src/fs/fs_unindex.c:427
 #, fuzzy, c-format
 msgid "Failed to remove UBlock: %s\n"
 msgstr "打开日志文件“%s”失败:%s\n"
 
-#: src/fs/fs_unindex.c:562 src/fs/fs_unindex.c:626
+#: src/fs/fs_unindex.c:590 src/fs/fs_unindex.c:656
 #, fuzzy
 msgid "Failed to connect to `datastore' service."
 msgstr "初始化“%s”服务失败。\n"
 
-#: src/fs/fs_unindex.c:639
+#: src/fs/fs_unindex.c:669
 #, fuzzy
 msgid "Failed to open file for unindexing."
 msgstr "打开日志文件“%s”失败:%s\n"
 
-#: src/fs/fs_unindex.c:673
+#: src/fs/fs_unindex.c:708
 msgid "Failed to compute hash of file."
 msgstr ""
 
@@ -3678,88 +3694,88 @@
 "\n"
 "按任意键继续\n"
 
-#: src/fs/gnunet-service-fs_cp.c:726
+#: src/fs/gnunet-service-fs_cp.c:735
 msgid "# migration stop messages received"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:730
+#: src/fs/gnunet-service-fs_cp.c:739
 #, c-format
 msgid "Migration of content to peer `%s' blocked for %s\n"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:768
+#: src/fs/gnunet-service-fs_cp.c:776
 msgid "# replies transmitted to other peers"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:774
+#: src/fs/gnunet-service-fs_cp.c:784
 msgid "# replies dropped"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:799 src/fs/gnunet-service-fs_cp.c:1384
+#: src/fs/gnunet-service-fs_cp.c:810 src/fs/gnunet-service-fs_cp.c:1404
 msgid "# P2P searches active"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:904
+#: src/fs/gnunet-service-fs_cp.c:915
 msgid "# artificial delays introduced (ms)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:960
+#: src/fs/gnunet-service-fs_cp.c:971
 msgid "# replies dropped due to type mismatch"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:968
+#: src/fs/gnunet-service-fs_cp.c:979
 msgid "# replies received for other peers"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:982
+#: src/fs/gnunet-service-fs_cp.c:993
 msgid "# replies dropped due to insufficient cover traffic"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1030
+#: src/fs/gnunet-service-fs_cp.c:1041
 msgid "# P2P searches destroyed due to ultimate reply"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1098
+#: src/fs/gnunet-service-fs_cp.c:1109
 msgid "# requests done for free (low load)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1123
+#: src/fs/gnunet-service-fs_cp.c:1134
 msgid "# request dropped, priority insufficient"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1133
+#: src/fs/gnunet-service-fs_cp.c:1144
 msgid "# requests done for a price (normal load)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1210
+#: src/fs/gnunet-service-fs_cp.c:1221
 msgid "# GET requests received (from other peers)"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1245
+#: src/fs/gnunet-service-fs_cp.c:1256
 msgid "# requests dropped due to initiator not being connected"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1266
+#: src/fs/gnunet-service-fs_cp.c:1277
 msgid "# requests dropped due to missing reverse route"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1277
+#: src/fs/gnunet-service-fs_cp.c:1288
 msgid "# requests dropped due to full reply queue"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1329
+#: src/fs/gnunet-service-fs_cp.c:1340
 msgid "# requests dropped due TTL underflow"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1353
+#: src/fs/gnunet-service-fs_cp.c:1365
 msgid "# requests dropped due to higher-TTL request"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1382
+#: src/fs/gnunet-service-fs_cp.c:1402
 msgid "# P2P query messages received and processed"
 msgstr ""
 
-#: src/fs/gnunet-service-fs_cp.c:1821
+#: src/fs/gnunet-service-fs_cp.c:1841
 msgid "# migration stop messages sent"
 msgstr ""
 
@@ -4082,7 +4098,7 @@
 msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
 msgstr ""
 
-#: src/gns/gnunet-gns.c:215
+#: src/gns/gnunet-gns.c:215 src/gns/plugin_rest_gns.c:334
 #, c-format
 msgid "Invalid typename specified, assuming `ANY'\n"
 msgstr ""
@@ -4098,6 +4114,7 @@
 msgstr ""
 
 #: src/gns/gnunet-gns.c:353 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/plugin_rest_gns.c:459
 #, c-format
 msgid ""
 "Ego for `gns-master' not found, cannot perform lookup.  Did you run gnunet-"
@@ -4235,7 +4252,7 @@
 msgid "Failed to start HTTPS server for `%s'\n"
 msgstr "初始化“%s”服务失败。\n"
 
-#: src/gns/gnunet-gns-proxy.c:2225
+#: src/gns/gnunet-gns-proxy.c:2225 src/rest/gnunet-rest-server.c:529
 #, fuzzy
 msgid "Failed to pass client to MHD\n"
 msgstr "初始化“%s”服务失败。\n"
@@ -4339,21 +4356,21 @@
 msgid "GNS lookup resulted in DNS name that is too long (`%s')\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:1886
+#: src/gns/gnunet-service-gns_resolver.c:1891
 msgid "GNS lookup recursion failed (no delegation record found)\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:1910
+#: src/gns/gnunet-service-gns_resolver.c:1915
 #, fuzzy, c-format
 msgid "Failed to cache GNS resolution: %s\n"
 msgstr "打开日志文件“%s”失败:%s\n"
 
-#: src/gns/gnunet-service-gns_resolver.c:2192
+#: src/gns/gnunet-service-gns_resolver.c:2197
 #, c-format
 msgid "Zone %s was revoked, resolution fails\n"
 msgstr ""
 
-#: src/gns/gnunet-service-gns_resolver.c:2341
+#: src/gns/gnunet-service-gns_resolver.c:2346
 #, c-format
 msgid "Hostname `%s' is not well-formed, resolution fails\n"
 msgstr ""
@@ -4383,6 +4400,14 @@
 msgid "Unable to parse BOX record string `%s'\n"
 msgstr "解析配置文件“%s”失败\n"
 
+#: src/gns/plugin_rest_gns.c:422
+msgid "Ego for not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:652
+msgid "GNS REST API initialized\n"
+msgstr ""
+
 #: src/gnsrecord/plugin_gnsrecord_dns.c:291
 #, fuzzy, c-format
 msgid "Unable to parse IPv4 address `%s'\n"
@@ -4899,6 +4924,10 @@
 msgid "Failed to create directory `%s' for storing egos\n"
 msgstr "解析配置文件“%s”失败\n"
 
+#: src/identity/plugin_rest_identity.c:803
+msgid "Identity REST API initialized\n"
+msgstr ""
+
 #: src/mysql/mysql.c:174
 #, c-format
 msgid "Trying to use file `%s' for MySQL configuration.\n"
@@ -4924,9 +4953,9 @@
 msgid "You must specify which zone should be accessed\n"
 msgstr "您必须指定一个昵称\n"
 
-#: src/namecache/gnunet-namecache.c:195 src/namestore/gnunet-namestore.c:844
+#: src/namecache/gnunet-namecache.c:195
 #, fuzzy, c-format
-msgid "Invalid public key for reverse lookup `%s'\n"
+msgid "Invalid public key for zone `%s'\n"
 msgstr "“%s”的参数无效。\n"
 
 #: src/namecache/gnunet-namecache.c:203
@@ -4963,11 +4992,13 @@
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:332
+#: src/namestore/plugin_rest_namestore.c:505
 #, c-format
 msgid "Deleting record failed, record does not exist%s%s\n"
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:339
+#: src/namestore/plugin_rest_namestore.c:514
 #, c-format
 msgid "Deleting record failed%s%s\n"
 msgstr ""
@@ -4985,6 +5016,7 @@
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:628
+#: src/namestore/plugin_rest_namestore.c:538
 #, c-format
 msgid "There are no records under label `%s' that could be deleted.\n"
 msgstr ""
@@ -5002,6 +5034,7 @@
 
 #: src/namestore/gnunet-namestore.c:719
 #: src/namestore/gnunet-namestore-fcfsd.c:984
+#: src/namestore/plugin_rest_namestore.c:821
 #, fuzzy
 msgid "Failed to connect to namestore\n"
 msgstr "初始化“%s”服务失败。\n"
@@ -5019,11 +5052,14 @@
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:745
+#: src/namestore/plugin_rest_namestore.c:608
 #, fuzzy, c-format
 msgid "Unsupported type `%s'\n"
 msgstr "未知的命令“%s”。\n"
 
 #: src/namestore/gnunet-namestore.c:765
+#: src/namestore/plugin_rest_namestore.c:626
+#: src/namestore/plugin_rest_namestore.c:666
 #, c-format
 msgid "Value `%s' invalid for record type `%s'\n"
 msgstr ""
@@ -5037,6 +5073,11 @@
 msgid "del"
 msgstr ""
 
+#: src/namestore/gnunet-namestore.c:844
+#, fuzzy, c-format
+msgid "Invalid public key for reverse lookup `%s'\n"
+msgstr "“%s”的参数无效。\n"
+
 #: src/namestore/gnunet-namestore.c:868
 #: src/peerinfo-tool/gnunet-peerinfo.c:817
 #, fuzzy, c-format
@@ -5049,21 +5090,25 @@
 msgstr "无效条目。\n"
 
 #: src/namestore/gnunet-namestore.c:943
+#: src/namestore/plugin_rest_namestore.c:851
 #, c-format
 msgid "Ego `%s' not known to identity service\n"
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:970
+#: src/namestore/plugin_rest_namestore.c:878
 #, c-format
 msgid "No default ego configured in identity service\n"
 msgstr ""
 
 #: src/namestore/gnunet-namestore.c:1006
+#: src/namestore/plugin_rest_namestore.c:917
 #, fuzzy, c-format
 msgid "Identity service is not running\n"
 msgstr "服务已删除。\n"
 
 #: src/namestore/gnunet-namestore.c:1018
+#: src/namestore/plugin_rest_namestore.c:946
 #, fuzzy, c-format
 msgid "Cannot connect to identity service\n"
 msgstr "无法连接到 %s:%u:%s\n"
@@ -5195,6 +5240,10 @@
 msgid "Namestore failed to store record\n"
 msgstr ""
 
+#: src/namestore/plugin_rest_namestore.c:1023
+msgid "Namestore REST API initialized\n"
+msgstr ""
+
 #: src/nat/gnunet-nat-server.c:279
 #, c-format
 msgid "Please pass valid port number as the first argument! (got `%s')\n"
@@ -5439,7 +5488,7 @@
 msgstr "无法访问该服务"
 
 #: src/nse/gnunet-service-nse.c:1537
-#: src/revocation/gnunet-service-revocation.c:815 src/util/gnunet-scrypt.c:260
+#: src/revocation/gnunet-service-revocation.c:827 src/util/gnunet-scrypt.c:260
 #, fuzzy
 msgid "Value is too large.\n"
 msgstr "值不在合法范围内。"
@@ -5970,6 +6019,15 @@
 msgid "Regex `%s' is too long!\n"
 msgstr "服务已删除。\n"
 
+#: src/rest/gnunet-rest-server.c:766
+msgid "listen on specified port (default: 7776)"
+msgstr ""
+
+#: src/rest/gnunet-rest-server.c:783
+#, fuzzy
+msgid "GNUnet REST server"
+msgstr "GNUnet 错误日志"
+
 #: src/revocation/gnunet-revocation.c:126
 #, c-format
 msgid "Key `%s' is valid\n"
@@ -6098,11 +6156,11 @@
 msgstr ""
 
 #: src/revocation/gnunet-service-revocation.c:493
-#: src/revocation/gnunet-service-revocation.c:747
+#: src/revocation/gnunet-service-revocation.c:759
 msgid "SET service crashed, terminating revocation service\n"
 msgstr ""
 
-#: src/revocation/gnunet-service-revocation.c:839
+#: src/revocation/gnunet-service-revocation.c:851
 #, fuzzy
 msgid "Could not open revocation database file!"
 msgstr "无法连接到 %s:%u:%s\n"
@@ -7795,7 +7853,7 @@
 msgstr ""
 
 #: src/transport/plugin_transport_http_server.c:2825
-#: src/transport/plugin_transport_udp.c:3336
+#: src/transport/plugin_transport_udp.c:3335
 msgid "Disabling IPv6 since it is not supported on this system!\n"
 msgstr ""
 
@@ -8026,50 +8084,50 @@
 msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3082
+#: src/transport/plugin_transport_udp.c:3081
 #, c-format
 msgid ""
 "UDP could not transmit message to `%s': Network seems down, please check "
 "your network configuration\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3096
+#: src/transport/plugin_transport_udp.c:3095
 msgid ""
 "UDP could not transmit IPv6 message! Please check your network configuration "
 "and disable IPv6 if your connection does not have a global IPv6 address\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3412
-#: src/transport/plugin_transport_udp.c:3511
+#: src/transport/plugin_transport_udp.c:3411
+#: src/transport/plugin_transport_udp.c:3510
 #, fuzzy, c-format
 msgid "Failed to bind UDP socket to %s: %s\n"
 msgstr "打开日志文件“%s”失败:%s\n"
 
-#: src/transport/plugin_transport_udp.c:3430
+#: src/transport/plugin_transport_udp.c:3429
 msgid "Disabling IPv4 since it is not supported on this system!\n"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3521
+#: src/transport/plugin_transport_udp.c:3520
 #, fuzzy
 msgid "Failed to open UDP sockets\n"
 msgstr "打开日志文件“%s”失败:%s\n"
 
-#: src/transport/plugin_transport_udp.c:3592
-#: src/transport/plugin_transport_udp.c:3606
+#: src/transport/plugin_transport_udp.c:3591
+#: src/transport/plugin_transport_udp.c:3605
 msgid "must be in [0,65535]"
 msgstr ""
 
-#: src/transport/plugin_transport_udp.c:3638
+#: src/transport/plugin_transport_udp.c:3637
 #, fuzzy
 msgid "must be valid IPv4 address"
 msgstr "“%s”不可用。\n"
 
-#: src/transport/plugin_transport_udp.c:3665
+#: src/transport/plugin_transport_udp.c:3664
 #, fuzzy
 msgid "must be valid IPv6 address"
 msgstr "“%s”不可用。\n"
 
-#: src/transport/plugin_transport_udp.c:3731
+#: src/transport/plugin_transport_udp.c:3730
 #, fuzzy
 msgid "Failed to create UDP network sockets\n"
 msgstr "发送消息失败。\n"
@@ -8280,24 +8338,24 @@
 msgid "Syntax error while deserializing in line %u\n"
 msgstr "配置文件“%s”第 %d 行有语法错误。\n"
 
-#: src/util/configuration.c:1026
+#: src/util/configuration.c:1025
 #, c-format
 msgid ""
 "Configuration value '%s' for '%s' in section '%s' is not in set of legal "
 "choices\n"
 msgstr ""
 
-#: src/util/configuration.c:1145
+#: src/util/configuration.c:1144
 #, c-format
 msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
 msgstr ""
 
-#: src/util/configuration.c:1177
+#: src/util/configuration.c:1176
 #, fuzzy, c-format
 msgid "Missing closing `%s' in option `%s'\n"
 msgstr "配置文件“%s”已写入。\n"
 
-#: src/util/configuration.c:1251
+#: src/util/configuration.c:1250
 #, c-format
 msgid ""
 "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8321,52 +8379,52 @@
 "%llu)\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:731 src/util/crypto_ecc.c:769
-#: src/util/crypto_ecc.c:887 src/util/crypto_ecc.c:925
+#: src/util/crypto_ecc.c:733 src/util/crypto_ecc.c:771
+#: src/util/crypto_ecc.c:889 src/util/crypto_ecc.c:927
 #, fuzzy, c-format
 msgid "Could not acquire lock on file `%s': %s...\n"
 msgstr "无法解析“%s”(%s):%s\n"
 
-#: src/util/crypto_ecc.c:736 src/util/crypto_ecc.c:892
+#: src/util/crypto_ecc.c:738 src/util/crypto_ecc.c:894
 #, fuzzy
 msgid "Creating a new private key.  This may take a while.\n"
 msgstr "正在启动数据仓库转换(可能需要一段时间)。\n"
 
-#: src/util/crypto_ecc.c:773 src/util/crypto_ecc.c:929
+#: src/util/crypto_ecc.c:775 src/util/crypto_ecc.c:931
 msgid "This may be ok if someone is currently generating a private key.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:803 src/util/crypto_ecc.c:959
+#: src/util/crypto_ecc.c:805 src/util/crypto_ecc.c:961
 #, c-format
 msgid ""
 "When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:807 src/util/crypto_ecc.c:963
+#: src/util/crypto_ecc.c:809 src/util/crypto_ecc.c:965
 msgid "This may be ok if someone is currently generating a key.\n"
 msgstr ""
 
-#: src/util/crypto_ecc.c:1045
+#: src/util/crypto_ecc.c:1047
 #, fuzzy
 msgid "Could not load peer's private key\n"
 msgstr "找不到接口“%s”的一个 IP 地址。\n"
 
-#: src/util/crypto_ecc.c:1149
+#: src/util/crypto_ecc.c:1151
 #, fuzzy, c-format
 msgid "ECC signing failed at %s:%d: %s\n"
 msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
 
-#: src/util/crypto_ecc.c:1199
+#: src/util/crypto_ecc.c:1201
 #, fuzzy, c-format
 msgid "EdDSA signing failed at %s:%d: %s\n"
 msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
 
-#: src/util/crypto_ecc.c:1273
+#: src/util/crypto_ecc.c:1275
 #, fuzzy, c-format
 msgid "ECDSA signature verification failed at %s:%d: %s\n"
 msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
 
-#: src/util/crypto_ecc.c:1330
+#: src/util/crypto_ecc.c:1332
 #, fuzzy, c-format
 msgid "EdDSA signature verification failed at %s:%d: %s\n"
 msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
@@ -8376,17 +8434,17 @@
 msgid "libgcrypt has not the expected version (version %s is required).\n"
 msgstr "libgcrypt 的版本不符合预期(要求版本 %s)。\n"
 
-#: src/util/crypto_rsa.c:809
+#: src/util/crypto_rsa.c:825
 #, fuzzy, c-format
 msgid "RSA signature verification failed at %s:%d: %s\n"
 msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
 
-#: src/util/disk.c:1218
+#: src/util/disk.c:1222
 #, c-format
 msgid "Expected `%s' to be a directory!\n"
 msgstr "“%s”应为目录!\n"
 
-#: src/util/disk.c:1580 src/util/service.c:1328
+#: src/util/disk.c:1584 src/util/service.c:1328
 #, c-format
 msgid "Cannot obtain information about user `%s': %s\n"
 msgstr "无法获取有关用户“%s”的信息:%s\n"
@@ -8451,18 +8509,18 @@
 msgid "Use %s to get a list of options.\n"
 msgstr "请使用 --help 获取选项列表。\n"
 
-#: src/util/getopt_helpers.c:84
+#: src/util/getopt_helpers.c:90
 #, c-format
 msgid ""
 "Arguments mandatory for long options are also mandatory for short options.\n"
 msgstr "长选项的必选参数对短选项也是必选的。\n"
 
-#: src/util/getopt_helpers.c:268 src/util/getopt_helpers.c:326
+#: src/util/getopt_helpers.c:274 src/util/getopt_helpers.c:332
 #, c-format
 msgid "You must pass a number to the `%s' option.\n"
 msgstr "您必须向“%s”选项传递一个数字。\n"
 
-#: src/util/getopt_helpers.c:298
+#: src/util/getopt_helpers.c:304
 #, fuzzy, c-format
 msgid "You must pass relative time to the `%s' option.\n"
 msgstr "您必须向“%s”选项传递一个数字。\n"
@@ -8705,22 +8763,22 @@
 msgid "GetExitCodeProcess failed for binary %s (%d).\n"
 msgstr ""
 
-#: src/util/plugin.c:87
+#: src/util/plugin.c:86
 #, c-format
 msgid "Initialization of plugin mechanism failed: %s!\n"
 msgstr "插件机构初始化失败:%s!\n"
 
-#: src/util/plugin.c:148
+#: src/util/plugin.c:151
 #, c-format
 msgid "`%s' failed to resolve method '%s' with error: %s\n"
 msgstr ""
 
-#: src/util/plugin.c:223
+#: src/util/plugin.c:226
 #, c-format
 msgid "`%s' failed for library `%s' with error: %s\n"
 msgstr ""
 
-#: src/util/plugin.c:382
+#: src/util/plugin.c:385
 #, fuzzy
 msgid "Could not determine plugin installation path.\n"
 msgstr "无法确定用户界面定义文件。"

Modified: gnunet/src/dht/Makefile.am
===================================================================
--- gnunet/src/dht/Makefile.am  2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/src/dht/Makefile.am  2015-04-27 11:12:21 UTC (rev 35559)
@@ -48,7 +48,8 @@
 
 libexec_PROGRAMS = \
  gnunet-service-dht \
- gnunet-service-dht-xvine
+ gnunet-service-dht-xvine\
+ gnunet-service-dht-whanau
 
 noinst_PROGRAMS = \
  gnunet-dht-monitor \
@@ -98,8 +99,27 @@
   $(top_builddir)/src/util/libgnunetutil.la \
   -lm
 
+gnunet_service_dht_whanau_SOURCES = \
+ gnunet-service-wdht.c gnunet-service-wdht.h \
+ gnunet-service-wdht_clients.c gnunet-service-wdht_clients.h \
+ gnunet-service-wdht_datacache.c gnunet-service-wdht_datacache.h \
+ gnunet-service-wdht_hello.c gnunet-service-wdht_hello.h \
+ gnunet-service-wdht_nse.c gnunet-service-wdht_nse.h \
+ gnunet-service-wdht_neighbours.c gnunet-service-wdht_neighbours.h \
+ gnunet-service-wdht_routing.c gnunet-service-wdht_routing.h
+gnunet_service_dht_whanau_LDADD = \
+  $(top_builddir)/src/statistics/libgnunetstatistics.la \
+  $(top_builddir)/src/core/libgnunetcore.la \
+  $(top_builddir)/src/nse/libgnunetnse.la \
+  $(top_builddir)/src/ats/libgnunetats.la \
+  $(top_builddir)/src/transport/libgnunettransport.la \
+  $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
+  $(top_builddir)/src/hello/libgnunethello.la \
+  $(top_builddir)/src/block/libgnunetblock.la \
+  $(top_builddir)/src/datacache/libgnunetdatacache.la \
+  $(top_builddir)/src/util/libgnunetutil.la \
+  -lm
 
-
 gnunet_dht_get_SOURCES = \
  gnunet-dht-get.c
 gnunet_dht_get_LDADD = \

Added: gnunet/src/dht/gnunet-service-wdht.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht.c                                (rev 0)
+++ gnunet/src/dht/gnunet-service-wdht.c        2015-04-27 11:12:21 UTC (rev 
35559)
@@ -0,0 +1,220 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2009, 2010, 2011 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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht.c
+ * @brief GNUnet DHT service
+ * @author Christian Grothoff
+ * @author Nathan Evans
+ */
+
+#include "platform.h"
+#include "gnunet_block_lib.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_transport_service.h"
+#include "gnunet_hello_lib.h"
+#include "gnunet_dht_service.h"
+#include "gnunet_statistics_service.h"
+#include "gnunet-service-wdht.h"
+#include "gnunet-service-wdht_clients.h"
+#include "gnunet-service-wdht_datacache.h"
+#include "gnunet-service-wdht_hello.h"
+#include "gnunet-service-wdht_neighbours.h"
+#include "gnunet-service-wdht_nse.h"
+#include "gnunet-service-wdht_routing.h"
+
+
+
+/**
+ * Handle for the statistics service.
+ */
+struct GNUNET_STATISTICS_Handle *GDS_stats;
+
+/**
+ * Our handle to the BLOCK library.
+ */
+struct GNUNET_BLOCK_Context *GDS_block_context;
+
+/**
+ * The configuration the DHT service is running with
+ */
+const struct GNUNET_CONFIGURATION_Handle *GDS_cfg;
+
+/**
+ * Our HELLO
+ */
+struct GNUNET_MessageHeader *GDS_my_hello;
+
+/**
+ * Handle to the transport service, for getting our hello
+ */
+struct GNUNET_TRANSPORT_Handle *GDS_transport_handle;
+
+/**
+ * Handle to get our current HELLO.
+ */
+static struct GNUNET_TRANSPORT_GetHelloHandle *ghh;
+
+/**
+ * Hello address expiration
+ */
+struct GNUNET_TIME_Relative hello_expiration;
+
+/**
+ * Should we store our topology predecessor and successor IDs into statistics?
+ */
+extern unsigned int track_topology;
+
+#if ENABLE_MALICIOUS
+/**
+ * Should this peer act malicious?
+ */
+unsigned int malicious;
+#endif
+
+
+/**
+ * Receive the HELLO from transport service, free current and replace
+ * if necessary.
+ *
+ * @param cls NULL
+ * @param message HELLO message of peer
+ */
+static void
+process_hello (void *cls, const struct GNUNET_MessageHeader *message)
+{
+  GNUNET_assert (message != NULL);
+  GNUNET_free_non_null (GDS_my_hello);
+  GDS_my_hello = GNUNET_malloc (ntohs (message->size));
+  memcpy (GDS_my_hello, message, ntohs (message->size));
+}
+
+
+/**
+ * Task run during shutdown.
+ *
+ * @param cls unused
+ * @param tc unused
+ */
+static void
+shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  if (NULL != ghh)
+  {
+    GNUNET_TRANSPORT_get_hello_cancel (ghh);
+    ghh = NULL;
+  }
+  if (GDS_transport_handle != NULL)
+  {
+    GNUNET_TRANSPORT_disconnect (GDS_transport_handle);
+    GDS_transport_handle = NULL;
+  }
+
+  GDS_NEIGHBOURS_done ();
+  GDS_DATACACHE_done ();
+  GDS_ROUTING_done ();
+  GDS_HELLO_done ();
+  GDS_NSE_done ();
+  if (GDS_block_context != NULL)
+  {
+    GNUNET_BLOCK_context_destroy (GDS_block_context);
+    GDS_block_context = NULL;
+  }
+  if (GDS_stats != NULL)
+  {
+    GNUNET_STATISTICS_destroy (GDS_stats, GNUNET_YES);
+    GDS_stats = NULL;
+  }
+  GNUNET_free_non_null (GDS_my_hello);
+  GDS_my_hello = NULL;
+}
+
+
+/**
+ * Process dht requests.
+ *
+ * @param cls closure
+ * @param server the initialized server
+ * @param c configuration to use
+ */
+static void
+run (void *cls, struct GNUNET_SERVER_Handle *server,
+     const struct GNUNET_CONFIGURATION_Handle *c)
+{
+  unsigned long long _track_topology;
+  GDS_cfg = c;
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_time (c, "transport", "HELLO_EXPIRATION", 
&hello_expiration))
+  {
+    hello_expiration = GNUNET_CONSTANTS_HELLO_ADDRESS_EXPIRATION;
+  }
+  GDS_block_context = GNUNET_BLOCK_context_create (GDS_cfg);
+  GDS_stats = GNUNET_STATISTICS_create ("dht", GDS_cfg);
+  GDS_ROUTING_init ();
+  GDS_NSE_init ();
+  GDS_DATACACHE_init ();
+  GDS_HELLO_init ();
+  GDS_CLIENTS_init (server);
+  if (GNUNET_OK ==
+      GNUNET_CONFIGURATION_get_value_number (c, "xdht", "track_toplogy",
+                                             &_track_topology))
+  {
+    track_topology = (unsigned int) _track_topology;
+  }
+  if (GNUNET_OK != GDS_NEIGHBOURS_init ())
+  {
+    shutdown_task (NULL, NULL);
+    return;
+  }
+  GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task,
+                                NULL);
+  GDS_transport_handle =
+      GNUNET_TRANSPORT_connect (GDS_cfg, NULL, NULL, NULL, NULL, NULL);
+  if (GDS_transport_handle == NULL)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                _("Failed to connect to transport service!\n"));
+    return;
+  }
+  ghh = GNUNET_TRANSPORT_get_hello (GDS_transport_handle, &process_hello, 
NULL);
+}
+
+
+/**
+ * The main function for the dht service.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc, char *const *argv)
+{
+  int ret;
+
+  ret =
+      (GNUNET_OK ==
+       GNUNET_SERVICE_run (argc, argv, "dht", GNUNET_SERVICE_OPTION_NONE, &run,
+                           NULL)) ? 0 : 1;
+  GDS_CLIENTS_done ();
+  return ret;
+}
+
+/* end of gnunet-service-dht.c */

Added: gnunet/src/dht/gnunet-service-wdht.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht.h                                (rev 0)
+++ gnunet/src/dht/gnunet-service-wdht.h        2015-04-27 11:12:21 UTC (rev 
35559)
@@ -0,0 +1,60 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2011 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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht.h
+ * @brief GNUnet DHT globals
+ * @author Christian Grothoff
+ */
+#ifndef GNUNET_SERVICE_XDHT_H
+#define GNUNET_SERVICE_XDHT_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_statistics_service.h"
+#include "gnunet_transport_service.h"
+
+#define DEBUG_DHT GNUNET_EXTRA_LOGGING
+
+/**
+ * Configuration we use.
+ */
+extern const struct GNUNET_CONFIGURATION_Handle *GDS_cfg;
+
+/**
+ * Our handle to the BLOCK library.
+ */
+extern struct GNUNET_BLOCK_Context *GDS_block_context;
+
+/**
+ * Handle for the statistics service.
+ */
+extern struct GNUNET_STATISTICS_Handle *GDS_stats;
+
+/**
+ * Our HELLO
+ */
+extern struct GNUNET_MessageHeader *GDS_my_hello;
+
+/**
+ * Handle to the transport service, for getting our hello
+ */
+extern struct GNUNET_TRANSPORT_Handle *GDS_transport_handle;
+
+#endif

Added: gnunet/src/dht/gnunet-service-wdht_clients.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_clients.c                                
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_clients.c        2015-04-27 11:12:21 UTC 
(rev 35559)
@@ -0,0 +1,1449 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2009, 2010, 2011 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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-dht_clients.c
+ * @brief GNUnet DHT service's client management code
+ * @author Christian Grothoff
+ * @author Nathan Evans
+ */
+
+#include "platform.h"
+#include "gnunet_constants.h"
+#include "gnunet_protocols.h"
+#include "gnunet_statistics_service.h"
+#include "gnunet-service-wdht.h"
+#include "gnunet-service-wdht_clients.h"
+#include "gnunet-service-wdht_datacache.h"
+#include "gnunet-service-wdht_neighbours.h"
+#include "dht.h"
+
+
+/**
+ * Should routing details be logged to stderr (for debugging)?
+ */
+#define LOG_TRAFFIC(kind,...) GNUNET_log_from (kind, "dht-traffic",__VA_ARGS__)
+
+#define LOG(kind,...) GNUNET_log_from (kind, "dht-clients",__VA_ARGS__)
+
+#define DEBUG(...)                                           \
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
+
+/**
+ * Linked list of messages to send to clients.
+ */
+struct PendingMessage
+{
+  /**
+   * Pointer to next item in the list
+   */
+  struct PendingMessage *next;
+
+  /**
+   * Pointer to previous item in the list
+   */
+  struct PendingMessage *prev;
+
+  /**
+   * Actual message to be sent, allocated at the end of the struct:
+   * // msg = (cast) &pm[1];
+   * // memcpy (&pm[1], data, len);
+   */
+  const struct GNUNET_MessageHeader *msg;
+
+};
+
+
+/**
+ * Struct containing information about a client,
+ * handle to connect to it, and any pending messages
+ * that need to be sent to it.
+ */
+struct ClientList
+{
+  /**
+   * Linked list of active clients
+   */
+  struct ClientList *next;
+
+  /**
+   * Linked list of active clients
+   */
+  struct ClientList *prev;
+
+  /**
+   * The handle to this client
+   */
+  struct GNUNET_SERVER_Client *client_handle;
+
+  /**
+   * Handle to the current transmission request, NULL
+   * if none pending.
+   */
+  struct GNUNET_SERVER_TransmitHandle *transmit_handle;
+
+  /**
+   * Linked list of pending messages for this client
+   */
+  struct PendingMessage *pending_head;
+
+  /**
+   * Tail of linked list of pending messages for this client
+   */
+  struct PendingMessage *pending_tail;
+
+};
+
+
+/**
+ * Entry in the local forwarding map for a client's GET request.
+ */
+struct ClientQueryRecord
+{
+
+  /**
+   * The key this request was about
+   */
+  struct GNUNET_HashCode key;
+
+  /**
+   * Client responsible for the request.
+   */
+  struct ClientList *client;
+
+  /**
+   * Extended query (see gnunet_block_lib.h), allocated at the end of this 
struct.
+   */
+  const void *xquery;
+
+  /**
+   * Replies we have already seen for this request.
+   */
+  struct GNUNET_HashCode *seen_replies;
+
+  /**
+   * Pointer to this nodes heap location in the retry-heap (for fast removal)
+   */
+  struct GNUNET_CONTAINER_HeapNode *hnode;
+
+  /**
+   * What's the delay between re-try operations that we currently use for this
+   * request?
+   */
+  struct GNUNET_TIME_Relative retry_frequency;
+
+  /**
+   * What's the next time we should re-try this request?
+   */
+  struct GNUNET_TIME_Absolute retry_time;
+
+  /**
+   * The unique identifier of this request
+   */
+  uint64_t unique_id;
+
+  /**
+   * Number of bytes in xquery.
+   */
+  size_t xquery_size;
+
+  /**
+   * Number of entries in 'seen_replies'.
+   */
+  unsigned int seen_replies_count;
+
+  /**
+   * Desired replication level
+   */
+  uint32_t replication;
+
+  /**
+   * Any message options for this request
+   */
+  uint32_t msg_options;
+
+  /**
+   * The type for the data for the GET request.
+   */
+  enum GNUNET_BLOCK_Type type;
+
+};
+
+
+/**
+ * Struct containing paremeters of monitoring requests.
+ */
+struct ClientMonitorRecord
+{
+
+  /**
+   * Next element in DLL.
+   */
+  struct ClientMonitorRecord    *next;
+
+  /**
+   * Previous element in DLL.
+   */
+  struct ClientMonitorRecord    *prev;
+
+  /**
+   * Type of blocks that are of interest
+   */
+  enum GNUNET_BLOCK_Type        type;
+
+  /**
+   * Key of data of interest, NULL for all.
+   */
+  struct GNUNET_HashCode         *key;
+
+  /**
+   * Flag whether to notify about GET messages.
+   */
+  int16_t get;
+
+  /**
+   * Flag whether to notify about GET_REPONSE messages.
+   */
+  int16_t get_resp;
+
+  /**
+   * Flag whether to notify about PUT messages.
+   */
+  uint16_t put;
+
+  /**
+   * Client to notify of these requests.
+   */
+  struct ClientList             *client;
+};
+
+
+/**
+ * List of active clients.
+ */
+static struct ClientList *client_head;
+
+/**
+ * List of active clients.
+ */
+static struct ClientList *client_tail;
+
+/**
+ * List of active monitoring requests.
+ */
+static struct ClientMonitorRecord *monitor_head;
+
+/**
+ * List of active monitoring requests.
+ */
+static struct ClientMonitorRecord *monitor_tail;
+
+/**
+ * Hashmap for fast key based lookup, maps keys to `struct ClientQueryRecord` 
entries.
+ */
+static struct GNUNET_CONTAINER_MultiHashMap *forward_map;
+
+/**
+ * Heap with all of our client's request, sorted by retry time (earliest on 
top).
+ */
+static struct GNUNET_CONTAINER_Heap *retry_heap;
+
+/**
+ * Task that re-transmits requests (using retry_heap).
+ */
+static struct GNUNET_SCHEDULER_Task * retry_task;
+
+
+/**
+ * Task run to check for messages that need to be sent to a client.
+ *
+ * @param client a ClientList, containing the client and any messages to be 
sent to it
+ */
+static void
+process_pending_messages (struct ClientList *client);
+
+
+/**
+ * Callback called as a result of issuing a GNUNET_SERVER_notify_transmit_ready
+ * request.  A ClientList is passed as closure, take the head of the list
+ * and copy it into buf, which has the result of sending the message to the
+ * client.
+ *
+ * @param cls closure to this call
+ * @param size maximum number of bytes available to send
+ * @param buf where to copy the actual message to
+ *
+ * @return the number of bytes actually copied, 0 indicates failure
+ */
+static size_t
+send_reply_to_client (void *cls, size_t size, void *buf)
+{
+  struct ClientList *client = cls;
+  char *cbuf = buf;
+  struct PendingMessage *reply;
+  size_t off;
+  size_t msize;
+
+  client->transmit_handle = NULL;
+  if (buf == NULL)
+  {
+    /* client disconnected */
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Client %p disconnected, pending messages will be discarded\n",
+                client->client_handle);
+    return 0;
+  }
+  off = 0;
+  while ((NULL != (reply = client->pending_head)) &&
+         (size >= off + (msize = ntohs (reply->msg->size))))
+  {
+    GNUNET_CONTAINER_DLL_remove (client->pending_head, client->pending_tail,
+                                 reply);
+    memcpy (&cbuf[off], reply->msg, msize);
+    GNUNET_free (reply);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmitting %u bytes to client 
%p\n",
+                msize, client->client_handle);
+    off += msize;
+  }
+  process_pending_messages (client);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmitted %u/%u bytes to client 
%p\n",
+              (unsigned int) off, (unsigned int) size, client->client_handle);
+  return off;
+}
+
+
+/**
+ * Task run to check for messages that need to be sent to a client.
+ *
+ * @param client a ClientList, containing the client and any messages to be 
sent to it
+ */
+static void
+process_pending_messages (struct ClientList *client)
+{
+  if ((client->pending_head == NULL) || (client->transmit_handle != NULL))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Not asking for transmission to %p now: %s\n",
+                client->client_handle,
+                client->pending_head ==
+                NULL ? "no more messages" : "request already pending");
+    return;
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Asking for transmission of %u bytes to client %p\n",
+              ntohs (client->pending_head->msg->size), client->client_handle);
+  client->transmit_handle =
+      GNUNET_SERVER_notify_transmit_ready (client->client_handle,
+                                           ntohs (client->pending_head->
+                                                  msg->size),
+                                           GNUNET_TIME_UNIT_FOREVER_REL,
+                                           &send_reply_to_client, client);
+}
+
+
+/**
+ * Add a PendingMessage to the clients list of messages to be sent
+ *
+ * @param client the active client to send the message to
+ * @param pending_message the actual message to send
+ */
+static void
+add_pending_message (struct ClientList *client,
+                     struct PendingMessage *pending_message)
+{
+  GNUNET_CONTAINER_DLL_insert_tail (client->pending_head, client->pending_tail,
+                                    pending_message);
+  process_pending_messages (client);
+}
+
+
+/**
+ * Closure for 'forward_reply'
+ */
+struct ForwardReplyContext
+{
+
+  /**
+   * Actual message to send to matching clients.
+   */
+  struct PendingMessage *pm;
+
+  /**
+   * Embedded payload.
+   */
+  const void *data;
+
+  /**
+   * Type of the data.
+   */
+  enum GNUNET_BLOCK_Type type;
+
+  /**
+   * Number of bytes in data.
+   */
+  size_t data_size;
+
+  /**
+   * Do we need to copy 'pm' because it was already used?
+   */
+  int do_copy;
+
+};
+
+
+/**
+ * Find a client if it exists, add it otherwise.
+ *
+ * @param client the server handle to the client
+ *
+ * @return the client if found, a new client otherwise
+ */
+static struct ClientList *
+find_active_client (struct GNUNET_SERVER_Client *client)
+{
+  struct ClientList *pos = client_head;
+  struct ClientList *ret;
+
+  while (pos != NULL)
+  {
+    if (pos->client_handle == client)
+      return pos;
+    pos = pos->next;
+  }
+  ret = GNUNET_new (struct ClientList);
+  ret->client_handle = client;
+  GNUNET_CONTAINER_DLL_insert (client_head, client_tail, ret);
+  return ret;
+}
+
+
+/**
+ * Iterator over hash map entries that frees all entries
+ * associated with the given client.
+ *
+ * @param cls client to search for in source routes
+ * @param key current key code (ignored)
+ * @param value value in the hash map, a ClientQueryRecord
+ * @return #GNUNET_YES (we should continue to iterate)
+ */
+static int
+remove_client_records (void *cls, const struct GNUNET_HashCode * key, void 
*value)
+{
+  struct ClientList *client = cls;
+  struct ClientQueryRecord *record = value;
+
+  if (record->client != client)
+    return GNUNET_YES;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Removing client %p's record for key %s\n", client,
+              GNUNET_h2s (key));
+  GNUNET_assert (GNUNET_YES ==
+                 GNUNET_CONTAINER_multihashmap_remove (forward_map, key,
+                                                       record));
+  if (NULL != record->hnode)
+    GNUNET_CONTAINER_heap_remove_node (record->hnode);
+  GNUNET_array_grow (record->seen_replies, record->seen_replies_count, 0);
+  GNUNET_free (record);
+  return GNUNET_YES;
+}
+
+
+/**
+ * Iterator over hash map entries that send a given reply to
+ * each of the matching clients.  With some tricky recycling
+ * of the buffer.
+ *
+ * @param cls the 'struct ForwardReplyContext'
+ * @param key current key
+ * @param value value in the hash map, a ClientQueryRecord
+ * @return GNUNET_YES (we should continue to iterate),
+ *         if the result is mal-formed, GNUNET_NO
+ */
+static int
+forward_reply (void *cls, const struct GNUNET_HashCode * key, void *value)
+{
+  struct ForwardReplyContext *frc = cls;
+  struct ClientQueryRecord *record = value;
+  struct PendingMessage *pm;
+  struct GNUNET_DHT_ClientResultMessage *reply;
+  enum GNUNET_BLOCK_EvaluationResult eval;
+  int do_free;
+  struct GNUNET_HashCode ch;
+  unsigned int i;
+
+  LOG_TRAFFIC (GNUNET_ERROR_TYPE_DEBUG,
+              "XVINE CLIENT-RESULT %s\n",
+               GNUNET_h2s_full (key));
+#if 0
+  if ((record->type != GNUNET_BLOCK_TYPE_ANY) && (record->type != frc->type))
+  {
+    LOG (GNUNET_ERROR_TYPE_DEBUG,
+         "Record type missmatch, not passing request for key %s to local 
client\n",
+         GNUNET_h2s (key));
+
+    GNUNET_STATISTICS_update (GDS_stats,
+                              gettext_noop
+                              ("# Key match, type mismatches in REPLY to 
CLIENT"),
+                              1, GNUNET_NO);
+    return GNUNET_YES;          /* type mismatch */
+  }
+#endif
+  GNUNET_CRYPTO_hash (frc->data, frc->data_size, &ch);
+  for (i = 0; i < record->seen_replies_count; i++)
+    if (0 == memcmp (&record->seen_replies[i], &ch, sizeof (struct 
GNUNET_HashCode)))
+    {
+      LOG (GNUNET_ERROR_TYPE_DEBUG,
+           "Duplicate reply, not passing request for key %s to local client\n",
+           GNUNET_h2s (key));
+      GNUNET_STATISTICS_update (GDS_stats,
+                                gettext_noop
+                                ("# Duplicate REPLIES to CLIENT request 
dropped"),
+                                1, GNUNET_NO);
+      return GNUNET_YES;        /* duplicate */
+    }
+  eval =
+      GNUNET_BLOCK_evaluate (GDS_block_context,
+                             record->type,
+                             GNUNET_BLOCK_EO_NONE,
+                             key, NULL, 0,
+                             record->xquery,
+                             record->xquery_size,
+                             frc->data,
+                             frc->data_size);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Evaluation result is %d for key %s for local client's query\n",
+       (int) eval, GNUNET_h2s (key));
+  switch (eval)
+  {
+  case GNUNET_BLOCK_EVALUATION_OK_LAST:
+    do_free = GNUNET_YES;
+    break;
+  case GNUNET_BLOCK_EVALUATION_OK_MORE:
+    GNUNET_array_append (record->seen_replies, record->seen_replies_count, ch);
+    do_free = GNUNET_NO;
+    break;
+  case GNUNET_BLOCK_EVALUATION_OK_DUPLICATE:
+    /* should be impossible to encounter here */
+    GNUNET_break (0);
+    return GNUNET_YES;
+  case GNUNET_BLOCK_EVALUATION_RESULT_INVALID:
+    GNUNET_break_op (0);
+    return GNUNET_NO;
+  case GNUNET_BLOCK_EVALUATION_REQUEST_VALID:
+    GNUNET_break (0);
+    return GNUNET_NO;
+  case GNUNET_BLOCK_EVALUATION_REQUEST_INVALID:
+    GNUNET_break (0);
+    return GNUNET_NO;
+  case GNUNET_BLOCK_EVALUATION_RESULT_IRRELEVANT:
+    return GNUNET_YES;
+  case GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED:
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                _("Unsupported block type (%u) in request!\n"), record->type);
+    return GNUNET_NO;
+  default:
+    GNUNET_break (0);
+    return GNUNET_NO;
+  }
+  if (GNUNET_NO == frc->do_copy)
+  {
+    /* first time, we can use the original data */
+    pm = frc->pm;
+    frc->do_copy = GNUNET_YES;
+  }
+  else
+  {
+    /* two clients waiting for same reply, must copy for queueing */
+    pm = GNUNET_malloc (sizeof (struct PendingMessage) +
+                        ntohs (frc->pm->msg->size));
+    memcpy (pm, frc->pm,
+            sizeof (struct PendingMessage) + ntohs (frc->pm->msg->size));
+    pm->next = pm->prev = NULL;
+    pm->msg = (struct GNUNET_MessageHeader *) &pm[1];
+  }
+  GNUNET_STATISTICS_update (GDS_stats,
+                            gettext_noop ("# RESULTS queued for clients"), 1,
+                            GNUNET_NO);
+  reply = (struct GNUNET_DHT_ClientResultMessage *) &pm[1];
+  reply->unique_id = record->unique_id;
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Queueing reply to query %s for client %p\n",
+       GNUNET_h2s (key),
+       record->client->client_handle);
+  add_pending_message (record->client, pm);
+  if (GNUNET_YES == do_free)
+    remove_client_records (record->client, key, record);
+  return GNUNET_YES;
+}
+
+
+/**
+ * Handle a reply we've received from another peer.  If the reply
+ * matches any of our pending queries, forward it to the respective
+ * client(s).
+ *
+ * @param expiration when will the reply expire
+ * @param key the query this reply is for
+ * @param get_path_length number of peers in @a get_path
+ * @param get_path path the reply took on get
+ * @param put_path_length number of peers in @a put_path
+ * @param put_path path the reply took on put
+ * @param type type of the reply
+ * @param data_size number of bytes in @a data
+ * @param data application payload data
+ */
+void
+GDS_CLIENTS_handle_reply (struct GNUNET_TIME_Absolute expiration,
+                          const struct GNUNET_HashCode *key,
+                          unsigned int get_path_length,
+                          const struct GNUNET_PeerIdentity *get_path,
+                          unsigned int put_path_length,
+                          const struct GNUNET_PeerIdentity *put_path,
+                          enum GNUNET_BLOCK_Type type, size_t data_size,
+                          const void *data)
+{
+  struct ForwardReplyContext frc;
+  struct PendingMessage *pm;
+  struct GNUNET_DHT_ClientResultMessage *reply;
+  struct GNUNET_PeerIdentity *paths;
+  size_t msize;
+
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "reply for key %s\n",
+       GNUNET_h2s (key));
+
+  if (NULL == GNUNET_CONTAINER_multihashmap_get (forward_map, key))
+  {
+    GNUNET_STATISTICS_update (GDS_stats,
+                              gettext_noop
+                              ("# REPLIES ignored for CLIENTS (no match)"), 1,
+                              GNUNET_NO);
+    return;                     /* no matching request, fast exit! */
+  }
+  msize =
+      sizeof (struct GNUNET_DHT_ClientResultMessage) + data_size +
+      (get_path_length + put_path_length) * sizeof (struct 
GNUNET_PeerIdentity);
+  if (msize >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                _("Could not pass reply to client, message too big!\n"));
+    return;
+  }
+  DEBUG("reply FOR DATA_SIZE = %lu\n",msize);
+  pm = GNUNET_malloc (msize + sizeof (struct PendingMessage));
+  reply = (struct GNUNET_DHT_ClientResultMessage *) &pm[1];
+  pm->msg = &reply->header;
+  reply->header.size = htons ((uint16_t) msize);
+  reply->header.type = htons (GNUNET_MESSAGE_TYPE_DHT_CLIENT_RESULT);
+  reply->type = htonl (type);
+  reply->get_path_length = htonl (get_path_length);
+  reply->put_path_length = htonl (put_path_length);
+  reply->unique_id = 0;         /* filled in later */
+  reply->expiration = GNUNET_TIME_absolute_hton (expiration);
+  reply->key = *key;
+  paths = (struct GNUNET_PeerIdentity *) &reply[1];
+  memcpy (paths, put_path,
+          sizeof (struct GNUNET_PeerIdentity) * put_path_length);
+  memcpy (&paths[put_path_length], get_path,
+          sizeof (struct GNUNET_PeerIdentity) * get_path_length);
+  memcpy (&paths[get_path_length + put_path_length], data, data_size);
+  frc.do_copy = GNUNET_NO;
+  frc.pm = pm;
+  frc.data = data;
+  frc.data_size = data_size;
+  frc.type = type;
+  GNUNET_CONTAINER_multihashmap_get_multiple (forward_map, key, &forward_reply,
+                                              &frc);
+  if (GNUNET_NO == frc.do_copy)
+  {
+    /* did not match any of the requests, free! */
+    GNUNET_STATISTICS_update (GDS_stats,
+                              gettext_noop
+                              ("# REPLIES ignored for CLIENTS (no match)"), 1,
+                              GNUNET_NO);
+    GNUNET_free (pm);
+  }
+}
+
+/**
+ * Check if some client is monitoring GET messages and notify
+ * them in that case.
+ *
+ * @param options Options, for instance RecordRoute, DemultiplexEverywhere.
+ * @param type The type of data in the request.
+ * @param hop_count Hop count so far.
+ * @param path_length number of entries in path (or 0 if not recorded).
+ * @param path peers on the GET path (or NULL if not recorded).
+ * @param desired_replication_level Desired replication level.
+ * @param key Key of the requested data.
+ */
+void
+GDS_CLIENTS_process_get (uint32_t options,
+                         enum GNUNET_BLOCK_Type type,
+                         uint32_t hop_count,
+                         uint32_t desired_replication_level,
+                         unsigned int path_length,
+                         const struct GNUNET_PeerIdentity *path,
+                         const struct GNUNET_HashCode * key)
+{
+  struct ClientMonitorRecord *m;
+  struct ClientList **cl;
+  unsigned int cl_size;
+
+  cl = NULL;
+  cl_size = 0;
+  for (m = monitor_head; NULL != m; m = m->next)
+  {
+    if ((GNUNET_BLOCK_TYPE_ANY == m->type || m->type == type) &&
+        (NULL == m->key ||
+         memcmp (key, m->key, sizeof(struct GNUNET_HashCode)) == 0))
+    {
+      struct PendingMessage *pm;
+      struct GNUNET_DHT_MonitorGetMessage *mmsg;
+      struct GNUNET_PeerIdentity *msg_path;
+      size_t msize;
+      unsigned int i;
+
+      /* Don't send duplicates */
+      for (i = 0; i < cl_size; i++)
+        if (cl[i] == m->client)
+          break;
+      if (i < cl_size)
+        continue;
+      GNUNET_array_append (cl, cl_size, m->client);
+
+      msize = path_length * sizeof (struct GNUNET_PeerIdentity);
+      msize += sizeof (struct GNUNET_DHT_MonitorGetMessage);
+      msize += sizeof (struct PendingMessage);
+      pm = GNUNET_malloc (msize);
+      mmsg = (struct GNUNET_DHT_MonitorGetMessage *) &pm[1];
+      pm->msg = &mmsg->header;
+      mmsg->header.size = htons (msize - sizeof (struct PendingMessage));
+      mmsg->header.type = htons (GNUNET_MESSAGE_TYPE_DHT_MONITOR_GET);
+      mmsg->options = htonl(options);
+      mmsg->type = htonl(type);
+      mmsg->hop_count = htonl(hop_count);
+      mmsg->desired_replication_level = htonl(desired_replication_level);
+      mmsg->get_path_length = htonl(path_length);
+      memcpy (&mmsg->key, key, sizeof (struct GNUNET_HashCode));
+      msg_path = (struct GNUNET_PeerIdentity *) &mmsg[1];
+      if (path_length > 0)
+        memcpy (msg_path, path,
+                path_length * sizeof (struct GNUNET_PeerIdentity));
+      add_pending_message (m->client, pm);
+    }
+  }
+  GNUNET_free_non_null (cl);
+}
+
+
+/**
+ * Check if some client is monitoring PUT messages and notify
+ * them in that case.
+ *
+ * @param options Options, for instance RecordRoute, DemultiplexEverywhere.
+ * @param type The type of data in the request.
+ * @param hop_count Hop count so far.
+ * @param path_length number of entries in path (or 0 if not recorded).
+ * @param path peers on the PUT path (or NULL if not recorded).
+ * @param desired_replication_level Desired replication level.
+ * @param exp Expiration time of the data.
+ * @param key Key under which data is to be stored.
+ * @param data Pointer to the data carried.
+ * @param size Number of bytes in data.
+ */
+void
+GDS_CLIENTS_process_put (uint32_t options,
+                         enum GNUNET_BLOCK_Type type,
+                         uint32_t hop_count,
+                         uint32_t desired_replication_level,
+                         unsigned int path_length,
+                         const struct GNUNET_PeerIdentity *path,
+                         struct GNUNET_TIME_Absolute exp,
+                         const struct GNUNET_HashCode * key,
+                         const void *data,
+                         size_t size)
+{
+  struct ClientMonitorRecord *m;
+  struct ClientList **cl;
+  unsigned int cl_size;
+
+  cl = NULL;
+  cl_size = 0;
+  for (m = monitor_head; NULL != m; m = m->next)
+  {
+    if ((GNUNET_BLOCK_TYPE_ANY == m->type || m->type == type) &&
+        (NULL == m->key ||
+         memcmp (key, m->key, sizeof(struct GNUNET_HashCode)) == 0))
+    {
+      struct PendingMessage *pm;
+      struct GNUNET_DHT_MonitorPutMessage *mmsg;
+      struct GNUNET_PeerIdentity *msg_path;
+      size_t msize;
+      unsigned int i;
+
+      /* Don't send duplicates */
+      for (i = 0; i < cl_size; i++)
+        if (cl[i] == m->client)
+          break;
+      if (i < cl_size)
+        continue;
+      GNUNET_array_append (cl, cl_size, m->client);
+
+      msize = size;
+      msize += path_length * sizeof (struct GNUNET_PeerIdentity);
+      msize += sizeof (struct GNUNET_DHT_MonitorPutMessage);
+      msize += sizeof (struct PendingMessage);
+      pm = GNUNET_malloc (msize);
+      mmsg = (struct GNUNET_DHT_MonitorPutMessage *) &pm[1];
+      pm->msg = (struct GNUNET_MessageHeader *) mmsg;
+      mmsg->header.size = htons (msize - sizeof (struct PendingMessage));
+      mmsg->header.type = htons (GNUNET_MESSAGE_TYPE_DHT_MONITOR_PUT);
+      mmsg->options = htonl(options);
+      mmsg->type = htonl(type);
+      mmsg->hop_count = htonl(hop_count);
+      mmsg->desired_replication_level = htonl(desired_replication_level);
+      mmsg->put_path_length = htonl(path_length);
+      msg_path = (struct GNUNET_PeerIdentity *) &mmsg[1];
+      if (path_length > 0)
+      {
+        memcpy (msg_path, path,
+                path_length * sizeof (struct GNUNET_PeerIdentity));
+      }
+      mmsg->expiration_time = GNUNET_TIME_absolute_hton(exp);
+      memcpy (&mmsg->key, key, sizeof (struct GNUNET_HashCode));
+      if (size > 0)
+        memcpy (&msg_path[path_length], data, size);
+      add_pending_message (m->client, pm);
+    }
+  }
+  GNUNET_free_non_null (cl);
+}
+
+
+/**
+ * Route the given request via the DHT.
+ */
+static void
+transmit_request (struct ClientQueryRecord *cqr)
+{
+  GNUNET_STATISTICS_update (GDS_stats,
+                            gettext_noop
+                            ("# GET requests from clients injected"), 1,
+                            GNUNET_NO);
+
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Initiating GET for %s, replication %u, already have %u replies\n",
+       GNUNET_h2s (&cqr->key),
+       cqr->replication,
+       cqr->seen_replies_count);
+
+  GDS_NEIGHBOURS_handle_get (&cqr->key, cqr->type, cqr->msg_options,
+                              cqr->replication);
+
+  /* exponential back-off for retries.
+   * max GNUNET_TIME_STD_EXPONENTIAL_BACKOFF_THRESHOLD (15 min) */
+  cqr->retry_frequency = GNUNET_TIME_STD_BACKOFF (cqr->retry_frequency);
+  cqr->retry_time = GNUNET_TIME_relative_to_absolute (cqr->retry_frequency);
+}
+
+
+/**
+ * Task that looks at the 'retry_heap' and transmits all of the requests
+ * on the heap that are ready for transmission.  Then re-schedules
+ * itself (unless the heap is empty).
+ *
+ * @param cls unused
+ * @param tc scheduler context
+ */
+static void
+transmit_next_request_task (void *cls,
+                            const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  struct ClientQueryRecord *cqr;
+  struct GNUNET_TIME_Relative delay;
+
+  retry_task = NULL;
+  if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
+    return;
+  while (NULL != (cqr = GNUNET_CONTAINER_heap_remove_root (retry_heap)))
+  {
+    cqr->hnode = NULL;
+    delay = GNUNET_TIME_absolute_get_remaining (cqr->retry_time);
+    if (delay.rel_value_us > 0)
+    {
+      cqr->hnode =
+          GNUNET_CONTAINER_heap_insert (retry_heap, cqr,
+                                        cqr->retry_time.abs_value_us);
+      retry_task =
+          GNUNET_SCHEDULER_add_delayed (delay, &transmit_next_request_task,
+                                        NULL);
+      return;
+    }
+    transmit_request (cqr);
+    cqr->hnode =
+        GNUNET_CONTAINER_heap_insert (retry_heap, cqr,
+                                      cqr->retry_time.abs_value_us);
+  }
+}
+
+
+/**
+ * Handler for PUT messages.
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ */
+static void
+handle_dht_local_put (void *cls, struct GNUNET_SERVER_Client *client,
+                      const struct GNUNET_MessageHeader *message)
+{
+  const struct GNUNET_DHT_ClientPutMessage *put_msg;
+  struct PendingMessage *pm;
+  struct GNUNET_DHT_ClientPutConfirmationMessage *conf;
+  uint16_t size;
+
+  size = ntohs (message->size);
+  if (size < sizeof (struct GNUNET_DHT_ClientPutMessage))
+  {
+    GNUNET_break (0);
+    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    return;
+  }
+  GNUNET_STATISTICS_update (GDS_stats,
+                            gettext_noop
+                            ("# PUT requests received from clients"), 1,
+                            GNUNET_NO);
+  put_msg = (const struct GNUNET_DHT_ClientPutMessage *) message;
+  LOG_TRAFFIC (GNUNET_ERROR_TYPE_DEBUG, "X-VINE DHT CLIENT-PUT %s\n",
+               GNUNET_h2s_full (&put_msg->key));
+  /* give to local clients */
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Handling local PUT of %u-bytes for query %s\n",
+       size - sizeof (struct GNUNET_DHT_ClientPutMessage),
+       GNUNET_h2s (&put_msg->key));
+  DEBUG("PUT doing put i = %s\n",GNUNET_h2s(&(put_msg->key)));
+  GDS_CLIENTS_handle_reply (GNUNET_TIME_absolute_ntoh (put_msg->expiration),
+                            &put_msg->key, 0, NULL, 0, NULL,
+                            ntohl (put_msg->type),
+                            size - sizeof (struct GNUNET_DHT_ClientPutMessage),
+                            &put_msg[1]);
+
+  GDS_NEIGHBOURS_handle_put (&put_msg->key,
+                              ntohl (put_msg->type), ntohl (put_msg->options),
+                              ntohl (put_msg->desired_replication_level),
+                              GNUNET_TIME_absolute_ntoh (put_msg->expiration),
+                              &put_msg[1],
+                              size - sizeof (struct 
GNUNET_DHT_ClientPutMessage));
+  pm = GNUNET_malloc (sizeof (struct PendingMessage) +
+                     sizeof (struct GNUNET_DHT_ClientPutConfirmationMessage));
+  conf = (struct GNUNET_DHT_ClientPutConfirmationMessage *) &pm[1];
+  conf->header.size = htons (sizeof (struct 
GNUNET_DHT_ClientPutConfirmationMessage));
+  conf->header.type = htons (GNUNET_MESSAGE_TYPE_DHT_CLIENT_PUT_OK);
+  conf->reserved = htonl (0);
+  conf->unique_id = put_msg->unique_id;
+  pm->msg = &conf->header;
+  add_pending_message (find_active_client (client), pm);
+  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+}
+
+
+/**
+ * Handler for DHT GET messages from the client.
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ */
+static void
+handle_dht_local_get (void *cls, struct GNUNET_SERVER_Client *client,
+                      const struct GNUNET_MessageHeader *message)
+{
+  const struct GNUNET_DHT_ClientGetMessage *get;
+  struct ClientQueryRecord *cqr;
+  size_t xquery_size;
+  const char *xquery;
+  uint16_t size;
+
+  size = ntohs (message->size);
+  if (size < sizeof (struct GNUNET_DHT_ClientGetMessage))
+  {
+    GNUNET_break (0);
+    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    return;
+  }
+  xquery_size = size - sizeof (struct GNUNET_DHT_ClientGetMessage);
+  get = (const struct GNUNET_DHT_ClientGetMessage *) message;
+  xquery = (const char *) &get[1];
+  GNUNET_STATISTICS_update (GDS_stats,
+                            gettext_noop
+                            ("# GET requests received from clients"), 1,
+                            GNUNET_NO);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Received GET request for %s from local client %p, xq: %.*s\n",
+       GNUNET_h2s (&get->key), client, xquery_size, xquery);
+
+  LOG_TRAFFIC (GNUNET_ERROR_TYPE_DEBUG, "X-VINE CLIENT-GET %s\n",
+               GNUNET_h2s_full (&get->key));
+
+
+  cqr = GNUNET_malloc (sizeof (struct ClientQueryRecord) + xquery_size);
+  cqr->key = get->key;
+  cqr->client = find_active_client (client);
+  cqr->xquery = (void *) &cqr[1];
+  memcpy (&cqr[1], xquery, xquery_size);
+  cqr->hnode = GNUNET_CONTAINER_heap_insert (retry_heap, cqr, 0);
+  cqr->retry_frequency = GNUNET_TIME_UNIT_SECONDS;
+  cqr->retry_time = GNUNET_TIME_absolute_get ();
+  cqr->unique_id = get->unique_id;
+  cqr->xquery_size = xquery_size;
+  cqr->replication = ntohl (get->desired_replication_level);
+  cqr->msg_options = ntohl (get->options);
+  cqr->type = ntohl (get->type);
+
+  // FIXME use cqr->key, set multihashmap create to GNUNET_YES
+  GNUNET_CONTAINER_multihashmap_put (forward_map, &get->key, cqr,
+                                     
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+
+  struct GNUNET_PeerIdentity my_identity;
+  my_identity = GDS_NEIGHBOURS_get_my_id();
+  GDS_CLIENTS_process_get (ntohl (get->options),
+                           ntohl (get->type),
+                           0,
+                           ntohl (get->desired_replication_level),
+                           1,
+                           &my_identity,
+                           &get->key);
+  /* start remote requests */
+  if (NULL != retry_task)
+    GNUNET_SCHEDULER_cancel (retry_task);
+  retry_task = GNUNET_SCHEDULER_add_now (&transmit_next_request_task, NULL);
+  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+}
+
+
+/**
+ * Closure for 'find_by_unique_id'.
+ */
+struct FindByUniqueIdContext
+{
+  /**
+   * Where to store the result, if found.
+   */
+  struct ClientQueryRecord *cqr;
+
+  uint64_t unique_id;
+};
+
+
+/**
+ * Function called for each existing DHT record for the given
+ * query.  Checks if it matches the UID given in the closure
+ * and if so returns the entry as a result.
+ *
+ * @param cls the search context
+ * @param key query for the lookup (not used)
+ * @param value the 'struct ClientQueryRecord'
+ * @return GNUNET_YES to continue iteration (result not yet found)
+ */
+static int
+find_by_unique_id (void *cls,
+                  const struct GNUNET_HashCode *key,
+                  void *value)
+{
+  struct FindByUniqueIdContext *fui_ctx = cls;
+  struct ClientQueryRecord *cqr = value;
+
+  if (cqr->unique_id != fui_ctx->unique_id)
+    return GNUNET_YES;
+  fui_ctx->cqr = cqr;
+  return GNUNET_NO;
+}
+
+
+/**
+ * Handler for "GET result seen" messages from the client.
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ */
+static void
+handle_dht_local_get_result_seen (void *cls, struct GNUNET_SERVER_Client 
*client,
+                                 const struct GNUNET_MessageHeader *message)
+{
+  const struct GNUNET_DHT_ClientGetResultSeenMessage *seen;
+  uint16_t size;
+  unsigned int hash_count;
+  unsigned int old_count;
+  const struct GNUNET_HashCode *hc;
+  struct FindByUniqueIdContext fui_ctx;
+  struct ClientQueryRecord *cqr;
+
+  size = ntohs (message->size);
+  if (size < sizeof (struct GNUNET_DHT_ClientGetResultSeenMessage))
+  {
+    GNUNET_break (0);
+    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    return;
+  }
+  seen = (const struct GNUNET_DHT_ClientGetResultSeenMessage *) message;
+  hash_count = (size - sizeof (struct GNUNET_DHT_ClientGetResultSeenMessage)) 
/ sizeof (struct GNUNET_HashCode);
+  if (size != sizeof (struct GNUNET_DHT_ClientGetResultSeenMessage) + 
hash_count * sizeof (struct GNUNET_HashCode))
+  {
+    GNUNET_break (0);
+    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    return;
+  }
+  hc = (const struct GNUNET_HashCode*) &seen[1];
+  fui_ctx.unique_id = seen->unique_id;
+  fui_ctx.cqr = NULL;
+  GNUNET_CONTAINER_multihashmap_get_multiple (forward_map,
+                                             &seen->key,
+                                             &find_by_unique_id,
+                                             &fui_ctx);
+  if (NULL == (cqr = fui_ctx.cqr))
+  {
+    GNUNET_break (0);
+    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    return;
+  }
+  /* finally, update 'seen' list */
+  old_count = cqr->seen_replies_count;
+  GNUNET_array_grow (cqr->seen_replies,
+                    cqr->seen_replies_count,
+                    cqr->seen_replies_count + hash_count);
+  memcpy (&cqr->seen_replies[old_count],
+         hc,
+         sizeof (struct GNUNET_HashCode) * hash_count);
+}
+
+
+/**
+ * Closure for 'remove_by_unique_id'.
+ */
+struct RemoveByUniqueIdContext
+{
+  /**
+   * Client that issued the removal request.
+   */
+  struct ClientList *client;
+
+  /**
+   * Unique ID of the request.
+   */
+  uint64_t unique_id;
+};
+
+
+/**
+ * Iterator over hash map entries that frees all entries
+ * that match the given client and unique ID.
+ *
+ * @param cls unique ID and client to search for in source routes
+ * @param key current key code
+ * @param value value in the hash map, a ClientQueryRecord
+ * @return GNUNET_YES (we should continue to iterate)
+ */
+static int
+remove_by_unique_id (void *cls, const struct GNUNET_HashCode * key, void 
*value)
+{
+  const struct RemoveByUniqueIdContext *ctx = cls;
+  struct ClientQueryRecord *record = value;
+
+  if (record->unique_id != ctx->unique_id)
+    return GNUNET_YES;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Removing client %p's record for key %s (by unique id)\n",
+              ctx->client->client_handle, GNUNET_h2s (key));
+  return remove_client_records (ctx->client, key, record);
+}
+
+
+/**
+ * Handler for any generic DHT stop messages, calls the appropriate handler
+ * depending on message type (if processed locally)
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ *
+ */
+static void
+handle_dht_local_get_stop (void *cls, struct GNUNET_SERVER_Client *client,
+                           const struct GNUNET_MessageHeader *message)
+{
+  const struct GNUNET_DHT_ClientGetStopMessage *dht_stop_msg =
+      (const struct GNUNET_DHT_ClientGetStopMessage *) message;
+  struct RemoveByUniqueIdContext ctx;
+
+  GNUNET_STATISTICS_update (GDS_stats,
+                            gettext_noop
+                            ("# GET STOP requests received from clients"), 1,
+                            GNUNET_NO);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Received GET STOP request for %s from local client %p\n",
+       client, GNUNET_h2s (&dht_stop_msg->key));
+  ctx.client = find_active_client (client);
+  ctx.unique_id = dht_stop_msg->unique_id;
+  GNUNET_CONTAINER_multihashmap_get_multiple (forward_map, &dht_stop_msg->key,
+                                              &remove_by_unique_id, &ctx);
+  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+}
+
+
+/**
+ * Handler for monitor start messages
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ *
+ */
+static void
+handle_dht_local_monitor (void *cls, struct GNUNET_SERVER_Client *client,
+                          const struct GNUNET_MessageHeader *message)
+{
+  struct ClientMonitorRecord *r;
+  const struct GNUNET_DHT_MonitorStartStopMessage *msg;
+
+  msg = (struct GNUNET_DHT_MonitorStartStopMessage *) message;
+  r = GNUNET_new (struct ClientMonitorRecord);
+
+  r->client = find_active_client(client);
+  r->type = ntohl(msg->type);
+  r->get = ntohs(msg->get);
+  r->get_resp = ntohs(msg->get_resp);
+  r->put = ntohs(msg->put);
+  if (0 == ntohs(msg->filter_key))
+      r->key = NULL;
+  else
+  {
+    r->key = GNUNET_new (struct GNUNET_HashCode);
+    memcpy (r->key, &msg->key, sizeof (struct GNUNET_HashCode));
+  }
+  GNUNET_CONTAINER_DLL_insert (monitor_head, monitor_tail, r);
+  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+}
+
+
+/**
+ * Handler for monitor stop messages
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ *
+ */
+static void
+handle_dht_local_monitor_stop (void *cls, struct GNUNET_SERVER_Client *client,
+                               const struct GNUNET_MessageHeader *message)
+{
+  struct ClientMonitorRecord *r;
+  const struct GNUNET_DHT_MonitorStartStopMessage *msg;
+  int keys_match;
+
+  msg = (struct GNUNET_DHT_MonitorStartStopMessage *) message;
+  r = monitor_head;
+
+  while (NULL != r)
+  {
+    if (NULL == r->key)
+        keys_match = (0 == ntohs(msg->filter_key));
+    else
+    {
+        keys_match = (0 != ntohs(msg->filter_key)
+                      && !memcmp(r->key, &msg->key, sizeof(struct 
GNUNET_HashCode)));
+    }
+    if (find_active_client(client) == r->client
+        && ntohl(msg->type) == r->type
+        && r->get == msg->get
+        && r->get_resp == msg->get_resp
+        && r->put == msg->put
+        && keys_match
+        )
+    {
+        GNUNET_CONTAINER_DLL_remove (monitor_head, monitor_tail, r);
+        GNUNET_free_non_null (r->key);
+        GNUNET_free (r);
+        GNUNET_SERVER_receive_done (client, GNUNET_OK);
+        return; /* Delete only ONE entry */
+    }
+    r = r->next;
+  }
+
+  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+}
+
+
+#if ENABLE_MALICIOUS
+/**
+ * Handler for act malicious message.
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ *
+ */
+static void
+handle_dht_act_malicious (void *cls, struct GNUNET_SERVER_Client *client,
+                          const struct GNUNET_MessageHeader *message)
+{
+  const struct GNUNET_DHT_ActMaliciousMessage *msg;
+  struct PendingMessage *pm;
+  struct GNUNET_DHT_ClientActMaliciousConfirmationMessage *conf;
+  unsigned int malicious_action;
+
+  msg = (const struct GNUNET_DHT_ActMaliciousMessage *)message;
+  malicious_action = msg->action;
+
+  if(GNUNET_OK == GDS_NEIGHBOURS_act_malicious (malicious_action))
+  {
+    pm = GNUNET_malloc (sizeof (struct PendingMessage) +
+                     sizeof (struct 
GNUNET_DHT_ClientActMaliciousConfirmationMessage));
+    conf = (struct GNUNET_DHT_ClientActMaliciousConfirmationMessage *) &pm[1];
+    conf->header.size = htons (sizeof (struct 
GNUNET_DHT_ClientActMaliciousConfirmationMessage));
+    conf->header.type = htons 
(GNUNET_MESSAGE_TYPE_DHT_CLIENT_ACT_MALICIOUS_OK);
+    pm->msg = &conf->header;
+    add_pending_message (find_active_client (client), pm);
+    GNUNET_SERVER_receive_done (client, GNUNET_OK);
+  }
+}
+#endif
+
+
+/**
+ * Functions with this signature are called whenever a client
+ * is disconnected on the network level.
+ *
+ * @param cls closure (NULL for dht)
+ * @param client identification of the client; NULL
+ *        for the last call when the server is destroyed
+ */
+static void
+handle_client_disconnect (void *cls,
+                         struct GNUNET_SERVER_Client *client)
+{
+  struct ClientList *pos;
+  struct PendingMessage *reply;
+  struct ClientMonitorRecord *monitor;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+             "Local client %p disconnects\n",
+             client);
+  pos = find_active_client (client);
+  GNUNET_CONTAINER_DLL_remove (client_head, client_tail, pos);
+  if (pos->transmit_handle != NULL)
+    GNUNET_SERVER_notify_transmit_ready_cancel (pos->transmit_handle);
+  while (NULL != (reply = pos->pending_head))
+  {
+    GNUNET_CONTAINER_DLL_remove (pos->pending_head, pos->pending_tail, reply);
+    GNUNET_free (reply);
+  }
+  monitor = monitor_head;
+  while (NULL != monitor)
+  {
+    if (monitor->client == pos)
+    {
+      struct ClientMonitorRecord *next;
+
+      GNUNET_free_non_null (monitor->key);
+      next = monitor->next;
+      GNUNET_CONTAINER_DLL_remove (monitor_head, monitor_tail, monitor);
+      GNUNET_free (monitor);
+      monitor = next;
+    }
+    else
+      monitor = monitor->next;
+  }
+  GNUNET_CONTAINER_multihashmap_iterate (forward_map, &remove_client_records,
+                                         pos);
+  GNUNET_free (pos);
+}
+
+
+
+/**
+ * Initialize client subsystem.
+ *
+ * @param server the initialized server
+ */
+void
+GDS_CLIENTS_init (struct GNUNET_SERVER_Handle *server)
+{
+  static struct GNUNET_SERVER_MessageHandler plugin_handlers[] = {
+    {&handle_dht_local_put, NULL,
+     GNUNET_MESSAGE_TYPE_DHT_CLIENT_PUT, 0},
+    {&handle_dht_local_get, NULL,
+     GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET, 0},
+    {&handle_dht_local_get_stop, NULL,
+     GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET_STOP,
+     sizeof (struct GNUNET_DHT_ClientGetStopMessage)},
+    {&handle_dht_local_monitor, NULL,
+     GNUNET_MESSAGE_TYPE_DHT_MONITOR_START,
+     sizeof (struct GNUNET_DHT_MonitorStartStopMessage)},
+    {&handle_dht_local_monitor_stop, NULL,
+     GNUNET_MESSAGE_TYPE_DHT_MONITOR_STOP,
+     sizeof (struct GNUNET_DHT_MonitorStartStopMessage)},
+    {&handle_dht_local_get_result_seen, NULL,
+     GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET_RESULTS_KNOWN, 0},
+    #if ENABLE_MALICIOUS
+    {&handle_dht_act_malicious, NULL,
+     GNUNET_MESSAGE_TYPE_DHT_ACT_MALICIOUS,
+     sizeof (struct GNUNET_DHT_ActMaliciousMessage)},
+    #endif
+    {NULL, NULL, 0, 0}
+  };
+  forward_map = GNUNET_CONTAINER_multihashmap_create (1024, GNUNET_NO);
+  retry_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
+  GNUNET_SERVER_add_handlers (server, plugin_handlers);
+  GNUNET_SERVER_disconnect_notify (server, &handle_client_disconnect, NULL);
+}
+
+
+/**
+ * Shutdown client subsystem.
+ */
+void
+GDS_CLIENTS_done ()
+{
+  GNUNET_assert (client_head == NULL);
+  GNUNET_assert (client_tail == NULL);
+  if (NULL != retry_task)
+  {
+    GNUNET_SCHEDULER_cancel (retry_task);
+    retry_task = NULL;
+  }
+  if (NULL != retry_heap)
+  {
+    GNUNET_assert (0 == GNUNET_CONTAINER_heap_get_size (retry_heap));
+    GNUNET_CONTAINER_heap_destroy (retry_heap);
+    retry_heap = NULL;
+  }
+  if (NULL != forward_map)
+  {
+    GNUNET_assert (0 == GNUNET_CONTAINER_multihashmap_size (forward_map));
+    GNUNET_CONTAINER_multihashmap_destroy (forward_map);
+    forward_map = NULL;
+  }
+}
+
+/* end of gnunet-service-dht_clients.c */

Added: gnunet/src/dht/gnunet-service-wdht_clients.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_clients.h                                
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_clients.h        2015-04-27 11:12:21 UTC 
(rev 35559)
@@ -0,0 +1,149 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2009, 2010, 2011 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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_clients.h
+ * @brief GNUnet DHT service's client management code
+ * @author Christian Grothoff
+ * @author Nathan Evans
+ */
+#ifndef GNUNET_SERVICE_DHT_CLIENT_H
+#define GNUNET_SERVICE_DHT_CLIENT_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_block_lib.h"
+
+/**
+ * Handle a reply we've received from another peer.  If the reply
+ * matches any of our pending queries, forward it to the respective
+ * client(s).
+ *
+ * @param expiration when will the reply expire
+ * @param key the query this reply is for
+ * @param get_path_length number of peers in @a get_path
+ * @param get_path path the reply took on get
+ * @param put_path_length number of peers in @a put_path
+ * @param put_path path the reply took on put
+ * @param type type of the reply
+ * @param data_size number of bytes in @a data
+ * @param data application payload data
+ */
+void
+GDS_CLIENTS_handle_reply (struct GNUNET_TIME_Absolute expiration,
+                          const struct GNUNET_HashCode *key,
+                          unsigned int get_path_length,
+                          const struct GNUNET_PeerIdentity *get_path,
+                          unsigned int put_path_length,
+                          const struct GNUNET_PeerIdentity *put_path,
+                          enum GNUNET_BLOCK_Type type, size_t data_size,
+                          const void *data);
+
+
+/**
+ * Check if some client is monitoring GET messages and notify
+ * them in that case.
+ *
+ * @param options Options, for instance RecordRoute, DemultiplexEverywhere.
+ * @param type The type of data in the request.
+ * @param hop_count Hop count so far.
+ * @param path_length number of entries in path (or 0 if not recorded).
+ * @param path peers on the GET path (or NULL if not recorded).
+ * @param desired_replication_level Desired replication level.
+ * @param key Key of the requested data.
+ */
+void
+GDS_CLIENTS_process_get (uint32_t options,
+                         enum GNUNET_BLOCK_Type type,
+                         uint32_t hop_count,
+                         uint32_t desired_replication_level,
+                         unsigned int path_length,
+                         const struct GNUNET_PeerIdentity *path,
+                         const struct GNUNET_HashCode *key);
+
+
+/**
+ * Check if some client is monitoring GET RESP messages and notify
+ * them in that case.
+ *
+ * @param type The type of data in the result.
+ * @param get_path Peers on GET path (or NULL if not recorded).
+ * @param get_path_length number of entries in @a get_path.
+ * @param put_path peers on the PUT path (or NULL if not recorded).
+ * @param put_path_length number of entries in @a get_path.
+ * @param exp Expiration time of the data.
+ * @param key Key of the @a data.
+ * @param data Pointer to the result data.
+ * @param size Number of bytes in @a data.
+ */
+void
+GDS_CLIENTS_process_get_resp (enum GNUNET_BLOCK_Type type,
+                              const struct GNUNET_PeerIdentity *get_path,
+                              unsigned int get_path_length,
+                              const struct GNUNET_PeerIdentity *put_path,
+                              unsigned int put_path_length,
+                              struct GNUNET_TIME_Absolute exp,
+                              const struct GNUNET_HashCode * key,
+                              const void *data,
+                              size_t size);
+
+
+/**
+ * Check if some client is monitoring PUT messages and notify
+ * them in that case.
+ *
+ * @param options Options, for instance RecordRoute, DemultiplexEverywhere.
+ * @param type The type of data in the request.
+ * @param hop_count Hop count so far.
+ * @param path_length number of entries in path (or 0 if not recorded).
+ * @param path peers on the PUT path (or NULL if not recorded).
+ * @param desired_replication_level Desired replication level.
+ * @param exp Expiration time of the data.
+ * @param key Key under which data is to be stored.
+ * @param data Pointer to the data carried.
+ * @param size Number of bytes in data.
+ */
+void
+GDS_CLIENTS_process_put (uint32_t options,
+                         enum GNUNET_BLOCK_Type type,
+                         uint32_t hop_count,
+                         uint32_t desired_replication_level,
+                         unsigned int path_length,
+                         const struct GNUNET_PeerIdentity *path,
+                         struct GNUNET_TIME_Absolute exp,
+                         const struct GNUNET_HashCode * key,
+                         const void *data,
+                         size_t size);
+
+/**
+ * Initialize client subsystem.
+ *
+ * @param server the initialized server
+ */
+void
+GDS_CLIENTS_init (struct GNUNET_SERVER_Handle *server);
+
+
+/**
+ * Shutdown client subsystem.
+ */
+void
+GDS_CLIENTS_done (void);
+
+#endif

Added: gnunet/src/dht/gnunet-service-wdht_datacache.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_datacache.c                              
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_datacache.c      2015-04-27 11:12:21 UTC 
(rev 35559)
@@ -0,0 +1,381 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2009, 2010, 2011 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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-dht_datacache.c
+ * @brief GNUnet DHT service's datacache integration
+ * @author Christian Grothoff
+ * @author Nathan Evans
+ */
+#include "platform.h"
+#include "gnunet_datacache_lib.h"
+#include "gnunet-service-wdht_clients.h"
+#include "gnunet-service-wdht_datacache.h"
+#include "gnunet-service-wdht_routing.h"
+#include "gnunet-service-wdht_neighbours.h"
+#include "gnunet-service-dht.h"
+
+#define LOG(kind,...) GNUNET_log_from (kind, "dht-dtcache",__VA_ARGS__)
+
+#define DEBUG(...)                                           \
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
+
+/**
+ * Handle to the datacache service (for inserting/retrieving data)
+ */
+static struct GNUNET_DATACACHE_Handle *datacache;
+
+
+/**
+ * Handle a datum we've received from another peer.  Cache if
+ * possible.
+ *
+ * @param expiration when will the reply expire
+ * @param key the query this reply is for
+ * @param put_path_length number of peers in 'put_path'
+ * @param put_path path the reply took on put
+ * @param type type of the reply
+ * @param data_size number of bytes in 'data'
+ * @param data application payload data
+ */
+void
+GDS_DATACACHE_handle_put (struct GNUNET_TIME_Absolute expiration,
+                          const struct GNUNET_HashCode * key,
+                          unsigned int put_path_length,
+                          const struct GNUNET_PeerIdentity *put_path,
+                          enum GNUNET_BLOCK_Type type, size_t data_size,
+                          const void *data)
+{
+  int r;
+
+  if (NULL == datacache)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                _("%s request received, but have no datacache!\n"), "PUT");
+    return;
+  }
+  if (data_size >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
+  {
+    GNUNET_break (0);
+    return;
+  }
+
+  /* Put size is actual data size plus struct overhead plus path length (if 
any) */
+  GNUNET_STATISTICS_update (GDS_stats,
+                            gettext_noop ("# ITEMS stored in datacache"), 1,
+                            GNUNET_NO);
+
+  struct GNUNET_PeerIdentity peer = GDS_NEIGHBOURS_get_my_id();
+  DEBUG("DATACACHE_PUT KEY = %s, peer = 
%s\n",GNUNET_h2s(key),GNUNET_i2s(&peer));
+  r = GNUNET_DATACACHE_put (datacache, key, data_size, data, type, expiration,
+                            put_path_length, put_path);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "DATACACHE PUT for key %s [%u] completed (%d) after %u hops\n",
+       GNUNET_h2s (key), data_size, r, put_path_length);
+}
+
+/**
+ * List of peers in the get path.
+ */
+struct GetPath
+{
+  /**
+   * Pointer to next item in the list
+   */
+  struct GetPath *next;
+
+  /**
+   * Pointer to previous item in the list
+   */
+  struct GetPath *prev;
+
+  /**
+   *  An element in the get path.
+   */
+  struct GNUNET_PeerIdentity peer;
+};
+
+
+/**
+ * Context containing information about a GET request.
+ */
+struct GetRequestContext
+{
+  /**
+   * extended query (see gnunet_block_lib.h).
+   */
+  const void *xquery;
+
+  /**
+   * Bloomfilter to filter out duplicate replies (updated)
+   */
+  struct GNUNET_CONTAINER_BloomFilter **reply_bf;
+
+  /**
+   * The key this request was about
+   */
+  struct GNUNET_HashCode key;
+
+  /**
+   * Number of bytes in xquery.
+   */
+  size_t xquery_size;
+
+  /**
+   * Mutator value for the reply_bf, see gnunet_block_lib.h
+   */
+  uint32_t reply_bf_mutator;
+
+  /**
+   * Total number of peers in get path.
+   */
+  unsigned int get_path_length;
+
+  /**
+   * Return value to give back.
+   */
+  enum GNUNET_BLOCK_EvaluationResult eval;
+
+  /**
+   * Peeer which has the data for the key.
+   */
+  struct GNUNET_PeerIdentity source_peer;
+
+  /**
+   * Next hop to forward the get result to.
+   */
+  struct GNUNET_PeerIdentity next_hop;
+
+  /**
+   * Head of get path.
+   */
+  struct GetPath *head;
+
+  /**
+   * Tail of get path.
+   */
+  struct GetPath *tail;
+
+  /* get_path */
+};
+
+
+/**
+ * Iterator for local get request results,
+ *
+ * @param cls closure for iterator, a `struct GetRequestContext`
+ * @param key the key this data is stored under
+ * @param size the size of the data identified by key
+ * @param data the actual data
+ * @param type the type of the data
+ * @param exp when does this value expire?
+ * @param put_path_length number of peers in @a put_path
+ * @param put_path path the reply took on put
+ * @return #GNUNET_OK to continue iteration, anything else
+ * to stop iteration.
+ */
+static int
+datacache_get_iterator (void *cls,
+                        const struct GNUNET_HashCode *key,
+                        size_t size,
+                        const char *data,
+                        enum GNUNET_BLOCK_Type type,
+                        struct GNUNET_TIME_Absolute exp,
+                        unsigned int put_path_length,
+                        const struct GNUNET_PeerIdentity *put_path)
+{
+  struct GetRequestContext *ctx = cls;
+  enum GNUNET_BLOCK_EvaluationResult eval;
+
+  eval =
+      GNUNET_BLOCK_evaluate (GDS_block_context,
+                             type,
+                             GNUNET_BLOCK_EO_NONE,
+                             key,
+                             ctx->reply_bf,
+                             ctx->reply_bf_mutator,
+                             ctx->xquery,
+                             ctx->xquery_size,
+                             data,
+                             size);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Found reply for query %s in datacache, evaluation result is %d\n",
+       GNUNET_h2s (key), (int) eval);
+  ctx->eval = eval;
+
+  switch (eval)
+  {
+  case GNUNET_BLOCK_EVALUATION_OK_MORE:
+  case GNUNET_BLOCK_EVALUATION_OK_LAST:
+    /* forward to local clients */
+    GNUNET_STATISTICS_update (GDS_stats,
+                              gettext_noop
+                              ("# Good RESULTS found in datacache"), 1,
+                              GNUNET_NO);
+    struct GNUNET_PeerIdentity *get_path;
+    get_path = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity) *
+                              ctx->get_path_length);
+    struct GetPath *iterator;
+    iterator = ctx->head;
+    int i = 0;
+    while (i < ctx->get_path_length)
+    {
+      get_path[i] = iterator->peer;
+      i++;
+      iterator = iterator->next;
+    }
+    GDS_NEIGHBOURS_send_get_result (key,type, 
&(ctx->next_hop),&(ctx->source_peer),
+                                    put_path_length, put_path, 
ctx->get_path_length,
+                                    get_path, exp, data, size );
+    GNUNET_free_non_null (get_path);
+
+    break;
+  case GNUNET_BLOCK_EVALUATION_OK_DUPLICATE:
+    GNUNET_STATISTICS_update (GDS_stats,
+                              gettext_noop
+                              ("# Duplicate RESULTS found in datacache"), 1,
+                              GNUNET_NO);
+    break;
+  case GNUNET_BLOCK_EVALUATION_RESULT_INVALID:
+    GNUNET_STATISTICS_update (GDS_stats,
+                              gettext_noop
+                              ("# Invalid RESULTS found in datacache"), 1,
+                              GNUNET_NO);
+    break;
+  case GNUNET_BLOCK_EVALUATION_RESULT_IRRELEVANT:
+    GNUNET_STATISTICS_update (GDS_stats,
+                              gettext_noop
+                              ("# Irrelevant RESULTS found in datacache"), 1,
+                              GNUNET_NO);
+    break;
+  case GNUNET_BLOCK_EVALUATION_REQUEST_VALID:
+    GNUNET_break (0);
+    break;
+  case GNUNET_BLOCK_EVALUATION_REQUEST_INVALID:
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  case GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED:
+    GNUNET_STATISTICS_update (GDS_stats,
+                              gettext_noop
+                              ("# Unsupported RESULTS found in datacache"), 1,
+                              GNUNET_NO);
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                _("Unsupported block type (%u) in local response!\n"), type);
+    break;
+  }
+
+  return (eval == GNUNET_BLOCK_EVALUATION_OK_LAST) ? GNUNET_NO : GNUNET_OK;
+}
+
+
+/**
+ * Handle a GET request we've received from another peer.
+ *
+ * @param key the query
+ * @param type requested data type
+ * @param xquery extended query
+ * @param xquery_size number of bytes in xquery
+ * @param reply_bf where the reply bf is (to be) stored, possibly updated, can 
be NULL
+ * @param reply_bf_mutator mutation value for reply_bf
+ * @return evaluation result for the local replies
+ * @get_path_length Total number of peers in get path
+ * @get_path Peers in get path.
+ */
+enum GNUNET_BLOCK_EvaluationResult
+GDS_DATACACHE_handle_get (const struct GNUNET_HashCode * key,
+                          enum GNUNET_BLOCK_Type type, const void *xquery,
+                          size_t xquery_size,
+                          struct GNUNET_CONTAINER_BloomFilter **reply_bf,
+                          uint32_t reply_bf_mutator,
+                          uint32_t get_path_length,
+                          struct GNUNET_PeerIdentity *get_path,
+                          struct GNUNET_PeerIdentity *next_hop,
+                          struct GNUNET_PeerIdentity *source_peer)
+{
+  struct GetRequestContext ctx;
+  unsigned int r;
+
+  if (datacache == NULL)
+    return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+  GNUNET_STATISTICS_update (GDS_stats,
+                            gettext_noop ("# GET requests given to datacache"),
+                            1, GNUNET_NO);
+  ctx.eval = GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+  ctx.key = *key;
+  ctx.xquery = xquery;
+  ctx.xquery_size = xquery_size;
+  ctx.reply_bf = reply_bf;
+  ctx.reply_bf_mutator = reply_bf_mutator;
+  ctx.get_path_length = get_path_length;
+
+  if (next_hop != NULL)
+  {
+    memcpy (&(ctx.next_hop), next_hop, sizeof (struct GNUNET_PeerIdentity));
+  }
+  unsigned int i = 0;
+
+  ctx.head = NULL;
+  ctx.tail = NULL;
+  if (get_path != NULL)
+  {
+    while (i < get_path_length)
+    {
+      struct GetPath *element;
+      element = GNUNET_new (struct GetPath);
+      element->next = NULL;
+      element->prev = NULL;
+      element->peer = get_path[i];
+      GNUNET_CONTAINER_DLL_insert_tail (ctx.head, ctx.tail, element);
+      i++;
+    }
+  }
+
+  r = GNUNET_DATACACHE_get (datacache, key, type, &datacache_get_iterator,
+                            &ctx);
+  DEBUG ("DATACACHE_GET for key %s completed (%d). %u results 
found.\n",GNUNET_h2s (key), ctx.eval, r);
+  return ctx.eval;
+}
+
+
+/**
+ * Initialize datacache subsystem.
+ */
+void
+GDS_DATACACHE_init ()
+{
+  datacache = GNUNET_DATACACHE_create (GDS_cfg, "dhtcache");
+}
+
+
+/**
+ * Shutdown datacache subsystem.
+ */
+void
+GDS_DATACACHE_done ()
+{
+  if (datacache != NULL)
+  {
+    GNUNET_DATACACHE_destroy (datacache);
+    datacache = NULL;
+  }
+}
+
+
+/* end of gnunet-service-dht_datacache.c */

Added: gnunet/src/dht/gnunet-service-wdht_datacache.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_datacache.h                              
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_datacache.h      2015-04-27 11:12:21 UTC 
(rev 35559)
@@ -0,0 +1,90 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2009, 2010, 2011 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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-dht_datacache.h
+ * @brief GNUnet DHT service's datacache integration
+ * @author Christian Grothoff
+ * @author Nathan Evans
+ */
+#ifndef GNUNET_SERVICE_DHT_DATACACHE_H
+#define GNUNET_SERVICE_DHT_DATACACHE_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_block_lib.h"
+
+/**
+ * Handle a datum we've received from another peer.  Cache if
+ * possible.
+ *
+ * @param expiration when will the reply expire
+ * @param key the query this reply is for
+ * @param put_path_length number of peers in 'put_path'
+ * @param put_path path the reply took on put
+ * @param type type of the reply
+ * @param data_size number of bytes in 'data'
+ * @param data application payload data
+ */
+void
+GDS_DATACACHE_handle_put (struct GNUNET_TIME_Absolute expiration,
+                          const struct GNUNET_HashCode * key,
+                          unsigned int put_path_length,
+                          const struct GNUNET_PeerIdentity *put_path,
+                          enum GNUNET_BLOCK_Type type, size_t data_size,
+                          const void *data);
+
+
+/**
+ * Handle a GET request we've received from another peer.
+ *
+ * @param key the query
+ * @param type requested data type
+ * @param xquery extended query
+ * @param xquery_size number of bytes in xquery
+ * @param reply_bf where the reply bf is (to be) stored, possibly updated!, 
can be NULL
+ * @param reply_bf_mutator mutation value for reply_bf
+ * @return evaluation result for the local replies
+ */
+enum GNUNET_BLOCK_EvaluationResult
+GDS_DATACACHE_handle_get (const struct GNUNET_HashCode * key,
+                          enum GNUNET_BLOCK_Type type, const void *xquery,
+                          size_t xquery_size,
+                          struct GNUNET_CONTAINER_BloomFilter **reply_bf,
+                          uint32_t reply_bf_mutator,
+                          uint32_t get_path_length,
+                          struct GNUNET_PeerIdentity *get_path,
+                          struct GNUNET_PeerIdentity *next_hop,
+                          struct GNUNET_PeerIdentity *source_peer);
+
+
+/**
+ * Initialize datacache subsystem.
+ */
+void
+GDS_DATACACHE_init (void);
+
+
+/**
+ * Shutdown datacache subsystem.
+ */
+void
+GDS_DATACACHE_done (void);
+
+#endif

Added: gnunet/src/dht/gnunet-service-wdht_hello.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_hello.c                          (rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_hello.c  2015-04-27 11:12:21 UTC (rev 
35559)
@@ -0,0 +1,137 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2011 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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_hello.c
+ * @brief GNUnet DHT integration with peerinfo
+ * @author Christian Grothoff
+ *
+ * TODO:
+ * - consider adding mechanism to remove expired HELLOs
+ */
+#include "platform.h"
+#include "gnunet-service-wdht.h"
+#include "gnunet-service-wdht_hello.h"
+#include "gnunet_peerinfo_service.h"
+
+
+/**
+ * Handle for peerinfo notifications.
+ */
+static struct GNUNET_PEERINFO_NotifyContext *pnc;
+
+/**
+ * Hash map of peers to HELLOs.
+ */
+static struct GNUNET_CONTAINER_MultiPeerMap *peer_to_hello;
+
+
+/**
+ * Obtain a peer's HELLO if available
+ *
+ * @param peer peer to look for a HELLO from
+ * @return HELLO for the given peer
+ */
+const struct GNUNET_HELLO_Message *
+GDS_HELLO_get (const struct GNUNET_PeerIdentity *peer)
+{
+  if (NULL == peer_to_hello)
+    return NULL;
+  return GNUNET_CONTAINER_multipeermap_get (peer_to_hello, peer);
+}
+
+
+/**
+ * Function called for each HELLO known to PEERINFO.
+ *
+ * @param cls closure
+ * @param peer id of the peer, NULL for last call
+ * @param hello hello message for the peer (can be NULL)
+ * @param err_msg error message (not used)
+ */
+static void
+process_hello (void *cls, const struct GNUNET_PeerIdentity *peer,
+               const struct GNUNET_HELLO_Message *hello, const char *err_msg)
+{
+  struct GNUNET_TIME_Absolute ex;
+  struct GNUNET_HELLO_Message *hm;
+
+  if (hello == NULL)
+    return;
+  ex = GNUNET_HELLO_get_last_expiration (hello);
+  if (0 == GNUNET_TIME_absolute_get_remaining (ex).rel_value_us)
+    return;
+  GNUNET_STATISTICS_update (GDS_stats,
+                            gettext_noop ("# HELLOs obtained from peerinfo"), 
1,
+                            GNUNET_NO);
+  hm = GNUNET_CONTAINER_multipeermap_get (peer_to_hello, peer);
+  GNUNET_free_non_null (hm);
+  hm = GNUNET_malloc (GNUNET_HELLO_size (hello));
+  memcpy (hm, hello, GNUNET_HELLO_size (hello));
+  GNUNET_assert (GNUNET_SYSERR !=
+                 GNUNET_CONTAINER_multipeermap_put (peer_to_hello,
+                                                    peer, hm,
+                                                    
GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE));
+}
+
+
+/**
+ * Initialize HELLO subsystem.
+ */
+void
+GDS_HELLO_init ()
+{
+  pnc = GNUNET_PEERINFO_notify (GDS_cfg, GNUNET_NO, &process_hello, NULL);
+  peer_to_hello = GNUNET_CONTAINER_multipeermap_create (256, GNUNET_NO);
+}
+
+
+/**
+ * Free memory occopied by the HELLO.
+ */
+static int
+free_hello (void *cls,
+           const struct GNUNET_PeerIdentity *key,
+           void *hello)
+{
+  GNUNET_free (hello);
+  return GNUNET_OK;
+}
+
+
+/**
+ * Shutdown HELLO subsystem.
+ */
+void
+GDS_HELLO_done ()
+{
+  if (NULL != pnc)
+  {
+    GNUNET_PEERINFO_notify_cancel (pnc);
+    pnc = NULL;
+  }
+  if (NULL != peer_to_hello)
+  {
+    GNUNET_CONTAINER_multipeermap_iterate (peer_to_hello, &free_hello, NULL);
+    GNUNET_CONTAINER_multipeermap_destroy (peer_to_hello);
+  }
+}
+
+/* end of gnunet-service-dht_hello.c */

Added: gnunet/src/dht/gnunet-service-wdht_hello.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_hello.h                          (rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_hello.h  2015-04-27 11:12:21 UTC (rev 
35559)
@@ -0,0 +1,55 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2011 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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_hello.h
+ * @brief GNUnet DHT integration with peerinfo
+ * @author Christian Grothoff
+ */
+#ifndef GNUNET_SERVICE_XDHT_HELLO_H
+#define GNUNET_SERVICE_XDHT_HELLO_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_hello_lib.h"
+
+/**
+ * Obtain a peer's HELLO if available
+ *
+ * @param peer peer to look for a HELLO from
+ * @return HELLO for the given peer
+ */
+const struct GNUNET_HELLO_Message *
+GDS_HELLO_get (const struct GNUNET_PeerIdentity *peer);
+
+
+/**
+ * Initialize HELLO subsystem.
+ */
+void
+GDS_HELLO_init (void);
+
+
+/**
+ * Shutdown HELLO subsystem.
+ */
+void
+GDS_HELLO_done (void);
+
+#endif

Added: gnunet/src/dht/gnunet-service-wdht_neighbours.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_neighbours.c                             
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_neighbours.c     2015-04-27 11:12:21 UTC 
(rev 35559)
@@ -0,0 +1,6290 @@
+/*
+     This file is part of GNUnet.
+     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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_neighbours.c
+ * @brief GNUnet DHT service's finger and friend table management code
+ * @author Supriti Singh
+ */
+
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_block_lib.h"
+#include "gnunet_hello_lib.h"
+#include "gnunet_constants.h"
+#include "gnunet_protocols.h"
+#include "gnunet_ats_service.h"
+#include "gnunet_core_service.h"
+#include "gnunet_datacache_lib.h"
+#include "gnunet_transport_service.h"
+#include "gnunet_dht_service.h"
+#include "gnunet_statistics_service.h"
+#include "gnunet-service-xdht.h"
+#include "gnunet-service-wdht_clients.h"
+#include "gnunet-service-wdht_datacache.h"
+#include "gnunet-service-wdht_neighbours.h"
+#include "gnunet-service-wdht_routing.h"
+#include <fenv.h>
+#include "dht.h"
+
+/**
+ * TODO:
+ * 1. In X-Vine paper, there is no policy defined for replicating the data to
+ * recover in case of peer failure. We can do it in Chord way. In R5N, the key
+ * is hashed and then data is stored according to the key value generated after
+ * hashing.
+ */
+
+#define DEBUG(...)                                           \
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
+
+/**
+ * Maximum possible fingers (including predecessor) of a peer
+ */
+#define MAX_FINGERS 65
+
+/**
+ * Maximum allowed number of pending messages per friend peer.
+ */
+#define MAXIMUM_PENDING_PER_FRIEND 64
+
+/**
+ * How long to wait before sending another find finger trail request
+ */
+#define DHT_FIND_FINGER_TRAIL_INTERVAL GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 2)
+
+/**
+ * How long to wait before sending another verify successor message.
+ */
+#define DHT_SEND_VERIFY_SUCCESSOR_INTERVAL GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 2)
+
+/**
+ * How long to wait before sending another verify successor message.
+ */
+#define DHT_SEND_VERIFY_SUCCESSOR_RETRY_INTERVAL GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 30)
+
+/**
+ * How long to wait before retrying notify successor.
+ */
+#define DHT_SEND_NOTIFY_SUCCESSOR_RETRY_INTERVAL GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 30)
+
+/**
+ * How long at most to wait for transmission of a request to a friend ?
+ */
+#define PENDING_MESSAGE_TIMEOUT GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_MINUTES, 2)
+
+/**
+ * Duration for which I may remain congested.
+ * Note: Its a static value. In future, a peer may do some analysis and 
calculate
+ * congestion_timeout based on 'some' parameters.
+ */
+#define CONGESTION_TIMEOUT GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_MINUTES, 2)
+
+/**
+ * In case we don't hear back from the current successor, then we can start
+ * verify successor.
+ */
+#define WAIT_NOTIFY_CONFIRMATION GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_MILLISECONDS, 200)
+
+/**
+ * Maximum number of trails allowed to go through a friend.
+ */
+#define TRAILS_THROUGH_FRIEND_THRESHOLD 64
+
+/**
+ * Maximum number of trails stored per finger.
+ */
+#define MAXIMUM_TRAILS_PER_FINGER 4
+
+/**
+ * Finger map index for predecessor entry in finger table.
+ */
+#define PREDECESSOR_FINGER_ID 64
+
+/**
+ * FIXME: Its use only at 3 places check if you can remove it.
+ * To check if a finger is predecessor or not.
+ */
+enum GDS_NEIGHBOURS_finger_type
+{
+  GDS_FINGER_TYPE_PREDECESSOR = 1,
+  GDS_FINGER_TYPE_NON_PREDECESSOR = 0
+};
+
+GNUNET_NETWORK_STRUCT_BEGIN
+
+/**
+ * P2P PUT message
+ */
+struct PeerPutMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_PUT
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Processing options
+   */
+  uint32_t options GNUNET_PACKED;
+
+  /**
+   * Content type.
+   */
+  uint32_t block_type GNUNET_PACKED;
+
+  /**
+   * Hop count
+   */
+  uint32_t hop_count GNUNET_PACKED;
+
+  /**
+   * Replication level for this message
+   * In the current implementation, this value is not used.
+   */
+  uint32_t desired_replication_level GNUNET_PACKED;
+
+  /**
+   * Length of the PUT path that follows (if tracked).
+   */
+  uint32_t put_path_length GNUNET_PACKED;
+
+  /**
+   * Best known destination (could be my friend or finger) which should
+   * get this message next.
+   */
+  struct GNUNET_PeerIdentity best_known_destination;
+
+  /**
+   * In case best_known_destination is a finger, then trail to reach
+   * to that finger. Else its default value is 0.
+   */
+  struct GNUNET_HashCode intermediate_trail_id;
+
+  /**
+   * When does the content expire?
+   */
+  struct GNUNET_TIME_AbsoluteNBO expiration_time;
+
+  /**
+   * The key to store the value under.
+   */
+  struct GNUNET_HashCode key GNUNET_PACKED;
+
+  /* put path (if tracked) */
+
+  /* Payload */
+
+};
+
+/**
+ * P2P GET message
+ */
+struct PeerGetMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_GET
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Processing options
+   */
+  uint32_t options GNUNET_PACKED;
+
+  /**
+   * Desired content type.
+   */
+  uint32_t block_type GNUNET_PACKED;
+
+  /**
+   * Hop count
+   */
+  uint32_t hop_count GNUNET_PACKED;
+
+  /**
+   * Desired replication level for this request.
+   * In the current implementation, this value is not used.
+   */
+  uint32_t desired_replication_level GNUNET_PACKED;
+
+  /**
+   * Total number of peers in get path.
+   */
+  unsigned int get_path_length;
+
+  /**
+   * Best known destination (could be my friend or finger) which should
+   * get this message next.
+   */
+  struct GNUNET_PeerIdentity best_known_destination;
+
+  /**
+   * In case best_known_destination is a finger, then trail to reach
+   * to that finger. Else its default value is 0.
+   */
+  struct GNUNET_HashCode intermediate_trail_id;
+
+  /**
+   * The key we are looking for.
+   */
+  struct GNUNET_HashCode key;
+
+  /* Get path. */
+  /* struct GNUNET_PeerIdentity[]*/
+};
+
+/**
+ * P2P Result message
+ */
+struct PeerGetResultMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_GET_RESULT
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * The type for the data.
+   */
+  uint32_t type GNUNET_PACKED;
+
+  /**
+   * Number of peers recorded in the outgoing path from source to the
+   * stored location of this message.
+   */
+  uint32_t put_path_length GNUNET_PACKED;
+
+  /**
+   * Length of the GET path that follows (if tracked).
+   */
+  uint32_t get_path_length GNUNET_PACKED;
+
+  /**
+   * Peer which queried for get and should get the result.
+   */
+  struct GNUNET_PeerIdentity querying_peer;
+
+  /**
+   * When does the content expire?
+   */
+  struct GNUNET_TIME_Absolute expiration_time;
+
+  /**
+   * The key of the corresponding GET request.
+   */
+  struct GNUNET_HashCode key;
+
+  /* put path (if tracked) */
+
+  /* get path (if tracked) */
+
+  /* Payload */
+
+};
+
+/**
+ * P2P Trail setup message
+ */
+struct PeerTrailSetupMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Is source_peer trying to setup the trail to a predecessor or any finger.
+   */
+  uint32_t is_predecessor;
+
+  /**
+   * Peer closest to this value will be our finger.
+   */
+  uint64_t final_destination_finger_value;
+
+  /**
+   * Source peer which wants to setup the trail to one of its finger.
+   */
+  struct GNUNET_PeerIdentity source_peer;
+
+  /**
+   * Best known destination (could be my friend or finger) which should
+   * get this message next.
+   *
+   * FIXME: this could be removed if we include trail_source / trail_dest
+   * in the routing table. This way we save 32 bytes of bandwidth by using
+   * extra 8 bytes of memory (2 * sizeof (GNUNET_PEER_ID))
+   */
+  struct GNUNET_PeerIdentity best_known_destination;
+
+  /**
+   * In case best_known_destination is a finger, then trail id of trail to
+   * reach to this finger.
+   */
+  struct GNUNET_HashCode intermediate_trail_id;
+
+  /**
+   * Trail id for trail which we are trying to setup.
+   */
+  struct GNUNET_HashCode trail_id;
+
+  /* List of peers which are part of trail setup so far.
+   * Trail does NOT include source_peer and peer which will be closest to
+   * ultimate_destination_finger_value.
+   * struct GNUNET_PeerIdentity trail[]
+   */
+};
+
+/**
+  * P2P Trail Setup Result message
+ */
+struct PeerTrailSetupResultMessage
+{
+
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_RESULT
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Finger to which we have found the path.
+   */
+  struct GNUNET_PeerIdentity finger_identity;
+
+  /**
+   * Peer which started trail_setup to find trail to finger_identity
+   */
+  struct GNUNET_PeerIdentity querying_peer;
+
+  /**
+   * Is the trail setup to querying_peer's predecessor or finger?
+   */
+  uint32_t is_predecessor;
+
+  /**
+   * Value to which finger_identity is the closest peer.
+   */
+  uint64_t ulitmate_destination_finger_value;
+
+  /**
+   * Identifier of the trail from querying peer to finger_identity, NOT
+   * including both endpoints.
+   */
+  struct GNUNET_HashCode trail_id;
+
+  /* List of peers which are part of the trail from querying peer to
+   * finger_identity, NOT including both endpoints.
+   * struct GNUNET_PeerIdentity trail[]
+   */
+};
+
+/**
+ * P2P Verify Successor Message.
+ */
+struct PeerVerifySuccessorMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Peer which wants to verify its successor.
+   */
+  struct GNUNET_PeerIdentity source_peer;
+
+  /**
+   * Source Peer's current successor.
+   */
+  struct GNUNET_PeerIdentity successor;
+
+  /**
+   * Identifier of trail to reach from source_peer to successor.
+   */
+  struct GNUNET_HashCode trail_id;
+
+  /* List of the peers which are part of trail to reach  from source_peer
+   * to successor, NOT including them
+   * struct GNUNET_PeerIdentity trail[]
+   */
+};
+
+/**
+ * P2P Verify Successor Result Message
+ */
+struct PeerVerifySuccessorResultMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR_RESULT
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Peer which sent the request to verify its successor.
+   */
+  struct GNUNET_PeerIdentity querying_peer;
+
+  /**
+   * Successor to which PeerVerifySuccessorMessage was sent.
+   */
+  struct GNUNET_PeerIdentity current_successor;
+
+  /**
+   * Current Predecessor of source_successor. It can be same as querying peer
+   * or different. In case it is different then it can be querying_peer's
+   * probable successor.
+   */
+  struct GNUNET_PeerIdentity probable_successor;
+
+  /**
+   * Trail identifier of trail from querying_peer to current_successor.
+   */
+  struct GNUNET_HashCode trail_id;
+
+  /**
+   * Direction in which we are looking at the trail.
+   */
+  uint32_t trail_direction;
+
+  /* In case probable_successor != querying_peer, then trail to reach from
+   * querying_peer to probable_successor, NOT including end points.
+   * struct GNUNET_PeerIdentity trail[]
+   */
+};
+
+/**
+ * P2P Notify New Successor Message.
+ */
+struct PeerNotifyNewSuccessorMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_NEW_SUCCESSOR
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Peer which wants to notify its new successor.
+   */
+  struct GNUNET_PeerIdentity source_peer;
+
+  /**
+   * New successor of source_peer.
+   */
+  struct GNUNET_PeerIdentity new_successor;
+
+  /**
+   * Unique identifier of the trail from source_peer to new_successor,
+   * NOT including the endpoints.
+   */
+  struct GNUNET_HashCode trail_id;
+
+  /* List of peers in trail from source_peer to new_successor,
+   * NOT including the endpoints.
+   * struct GNUNET_PeerIdentity trail[]
+   */
+};
+
+/**
+ * P2P Notify Successor Confirmation message.
+ */
+struct PeerNotifyConfirmationMessage
+{
+   /**
+   * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_TEARDOWN
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Unique identifier of the trail.
+   */
+  struct GNUNET_HashCode trail_id;
+
+  /**
+   * Direction of trail.
+   */
+  uint32_t trail_direction;
+};
+
+
+/**
+ * P2P Trail Tear Down message.
+ */
+struct PeerTrailTearDownMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_TEARDOWN
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Unique identifier of the trail.
+   */
+  struct GNUNET_HashCode trail_id;
+
+  /**
+   * Direction of trail.
+   */
+  uint32_t trail_direction;
+};
+
+
+/**
+ * P2P Trail Rejection Message.
+ */
+struct PeerTrailRejectionMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_REJECTION
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Peer which wants to set up the trail.
+   */
+  struct GNUNET_PeerIdentity source_peer;
+
+  /**
+   * Peer which sent trail rejection message as it it congested.
+   */
+  struct GNUNET_PeerIdentity congested_peer;
+
+  /**
+   * Peer identity closest to this value will be finger of
+   * source_peer.
+   */
+  uint64_t ultimate_destination_finger_value;
+
+  /**
+   * Is source_peer trying to setup the trail to its predecessor or finger.
+   */
+  uint32_t is_predecessor;
+
+  /**
+   * Identifier for the trail that source peer is trying to setup.
+   */
+  struct GNUNET_HashCode trail_id;
+
+  /**
+   * Relative time for which congested_peer will remain congested.
+   */
+  struct GNUNET_TIME_Relative congestion_time;
+
+  /* Trail_list from source_peer to peer which sent the message for trail setup
+   * to congested peer. This trail does NOT include source_peer.
+   struct GNUNET_PeerIdnetity trail[]*/
+};
+
+/**
+ * P2P Add Trail Message.
+ */
+struct PeerAddTrailMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_ADD_TRAIL
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Source of the routing trail.
+   */
+  struct GNUNET_PeerIdentity source_peer;
+
+  /**
+   * Destination of the routing trail.
+   */
+  struct GNUNET_PeerIdentity destination_peer;
+
+  /**
+   * Unique identifier of the trail from source_peer to destination_peer,
+   * NOT including the endpoints.
+   */
+  struct GNUNET_HashCode trail_id;
+
+  /* Trail from source peer to destination peer, NOT including them.
+   * struct GNUNET_PeerIdentity trail[]
+   */
+};
+
+
+GNUNET_NETWORK_STRUCT_END
+
+/**
+ * Linked list of messages to send to a particular other peer.
+ */
+struct P2PPendingMessage
+{
+  /**
+   * Pointer to next item in the list
+   */
+  struct P2PPendingMessage *next;
+
+  /**
+   * Pointer to previous item in the list
+   */
+  struct P2PPendingMessage *prev;
+
+  /**
+   * Message importance level.  FIXME: used? useful?
+   */
+  unsigned int importance;
+
+  /**
+   * When does this message time out?
+   */
+  struct GNUNET_TIME_Absolute timeout;
+
+  /**
+   * Actual message to be sent, allocated at the end of the struct:
+   * // msg = (cast) &pm[1];
+   * // memcpy (&pm[1], data, len);
+   */
+  const struct GNUNET_MessageHeader *msg;
+
+};
+
+/**
+ *  Entry in friend_peermap.
+ */
+struct FriendInfo
+{
+  /**
+   * Friend Identity
+   */
+  struct GNUNET_PeerIdentity id;
+
+  /**
+   * Number of trails for which this friend is the first hop or if the friend
+   * is finger.
+   */
+  unsigned int trails_count;
+
+  /**
+   * Count of outstanding messages for this friend.
+   */
+  unsigned int pending_count;
+
+  /**
+   * In case not 0, then amount of time for which this friend is congested.
+   */
+  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.
+   */
+  struct P2PPendingMessage *head;
+
+  /**
+   * Tail of pending messages to be sent to this friend.
+   */
+  struct P2PPendingMessage *tail;
+
+  /**
+   * Core handle for sending messages to this friend.
+   */
+  struct GNUNET_CORE_TransmitHandle *th;
+
+};
+
+/**
+ * An individual element of the trail to reach to a finger.
+ */
+struct Trail_Element
+{
+  /**
+    * Pointer to next item in the list
+    */
+  struct Trail_Element *next;
+
+  /**
+    * Pointer to prev item in the list
+    */
+  struct Trail_Element *prev;
+
+  /**
+   * An element in this trail.
+   */
+  struct GNUNET_PeerIdentity peer;
+};
+
+/**
+ * Information about an individual trail.
+ */
+struct Trail
+{
+  /**
+   * Head of trail.
+   */
+  struct Trail_Element *trail_head;
+
+  /**
+   * Tail of trail.
+   */
+  struct Trail_Element *trail_tail;
+
+  /**
+   * Unique identifier of this trail.
+   */
+  struct GNUNET_HashCode trail_id;
+
+  /**
+   * Length of trail pointed
+   */
+  unsigned int trail_length;
+
+  /**
+   * Is there a valid trail entry.
+   */
+  unsigned int is_present;
+};
+
+/**
+ * An entry in finger_table
+ */
+struct FingerInfo
+{
+  /**
+   * Finger identity.
+   */
+  struct GNUNET_PeerIdentity finger_identity;
+
+  /**
+   * In case not 0, this amount is time to wait for notify successor message.
+   * Used ONLY for successor. NOT for any other finger.
+   */
+  struct GNUNET_TIME_Absolute wait_notify_confirmation;
+
+  /**
+   * Is any finger stored at this finger index.
+   */
+  unsigned int is_present;
+
+  /**
+   * Index in finger peer map
+   */
+  uint32_t finger_table_index;
+
+  /**
+   * Number of trails setup so far for this finger.
+   * Should not cross MAXIMUM_TRAILS_PER_FINGER.
+   */
+  uint32_t trails_count;
+
+  /**
+   * Array of trails to reach to this finger.
+   */
+  struct Trail trail_list[MAXIMUM_TRAILS_PER_FINGER];
+};
+
+
+/**
+ * Stores information about the peer which is closest to 
destination_finger_value.
+ * 'closest' can be either successor or predecessor depending on is_predecessor
+ * flag.
+ */
+struct Closest_Peer
+{
+  /**
+   * Destination finger value.
+   */
+  uint64_t destination_finger_value;
+
+  /**
+   * Is finger_value a predecessor or any other finger.
+   */
+  unsigned int is_predecessor;
+
+  /**
+   * Trail id to reach to peer.
+   * In case peer is my identity or friend, it is set to 0.
+   */
+  struct GNUNET_HashCode trail_id;
+
+  /**
+   * Next destination. In case of friend and my_identity , it is same as 
next_hop
+   * In case of finger it is finger identity.
+   */
+  struct GNUNET_PeerIdentity best_known_destination;
+
+  /**
+   * In case best_known_destination is a finger, then first friend in the trail
+   * 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.
+   */
+  unsigned int finger_table_index;
+};
+
+/**
+ * Context for send_verify_successor_task.
+ */
+struct VerifySuccessorContext
+{
+  /**
+   * Number of times this has been scheduled.
+   */
+  unsigned int num_retries_scheduled;
+};
+
+/**
+ * Task that sends FIND FINGER TRAIL requests. This task is started when we 
have
+ * get our first friend.
+ */
+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 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 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 struct GNUNET_SCHEDULER_Task * send_notify_new_successor_retry_task;
+
+/**
+ * Identity of this peer.
+ */
+static struct GNUNET_PeerIdentity my_identity;
+
+/**
+ * Peer map of all the friends of a peer
+ */
+static struct GNUNET_CONTAINER_MultiPeerMap *friend_peermap;
+
+/**
+ * Array of all the fingers.
+ */
+static struct FingerInfo finger_table [MAX_FINGERS];
+
+/**
+ * Handle to CORE.
+ */
+static struct GNUNET_CORE_Handle *core_api;
+
+/**
+ * Handle for the statistics service.
+ */
+//extern struct GNUNET_STATISTICS_Handle *GDS_stats;
+
+/**
+ * The current finger index that we have want to find trail to. We start the
+ * search with value = 0, i.e. successor  and then go to PREDCESSOR_FINGER_ID
+ * and decrement it. For any index 63 <= index < 0, if finger is same as 
successor,
+ * we reset this index to 0.
+ */
+static unsigned int current_search_finger_index;
+
+/**
+ * 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.
+ */
+static struct GNUNET_TIME_Relative verify_successor_next_send_time;
+
+/**
+ * Time duration to send verify successor again, if result was not received in 
time.
+ */
+static struct GNUNET_TIME_Relative verify_successor_retry_time;
+
+/**
+ * Time duration to retry send_notify_successor.
+ */
+static struct GNUNET_TIME_Relative notify_successor_retry_time;
+
+/**
+ * Are we waiting for confirmation from our new successor that it got the
+ * message
+ */
+//static unsigned int waiting_for_notify_confirmation;
+
+/* Below variables are used only for testing, and statistics collection. */
+/**
+ * Should we store our topology predecessor and successor IDs into statistics?
+ */
+unsigned int track_topology;
+
+/**
+ * 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.
+ */
+static unsigned int total_fingers_found;
+
+/**
+ * Number of times we found the same successor.
+ */
+static unsigned int successor_times;
+
+/**
+ * Number of rounds for which we should search for finger.
+ */
+static unsigned int fingers_round_count;
+/**
+ * Called when core is ready to send a message we asked for
+ * out to the destination.
+ *
+ * @param cls the 'struct FriendInfo' of the target friend
+ * @param size number of bytes available in buf
+ * @param buf where the callee should write the message
+ * @return number of bytes written to buf
+ */
+static size_t
+core_transmit_notify (void *cls, size_t size, void *buf)
+{
+  struct FriendInfo *peer = cls;
+  char *cbuf = buf;
+  struct P2PPendingMessage *pending;
+  size_t off;
+  size_t msize;
+
+  peer->th = NULL;
+  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_free (pending);
+  }
+  if (NULL == pending)
+  {
+    /* no messages pending */
+    return 0;
+  }
+  if (NULL == buf)
+  {
+    peer->th =
+        GNUNET_CORE_notify_transmit_ready (core_api, GNUNET_NO,
+                                           GNUNET_CORE_PRIO_BEST_EFFORT,
+                                           GNUNET_TIME_absolute_get_remaining
+                                           (pending->timeout), &peer->id,
+                                           ntohs (pending->msg->size),
+                                           &core_transmit_notify, peer);
+    GNUNET_break (NULL != peer->th);
+    return 0;
+  }
+  off = 0;
+  while ((NULL != (pending = peer->head)) &&
+         (size - off >= (msize = ntohs (pending->msg->size))))
+  {
+    GNUNET_STATISTICS_update (GDS_stats,
+                              gettext_noop
+                              ("# Bytes transmitted to other peers"),
+                              msize,
+                              GNUNET_NO);
+    memcpy (&cbuf[off], pending->msg, msize);
+    off += msize;
+    peer->pending_count--;
+    GNUNET_CONTAINER_DLL_remove (peer->head, peer->tail, pending);
+    GNUNET_free (pending);
+  }
+  if (peer->head != NULL)
+  {
+    peer->th =
+        GNUNET_CORE_notify_transmit_ready (core_api, GNUNET_NO,
+                                           GNUNET_CORE_PRIO_BEST_EFFORT,
+                                           GNUNET_TIME_absolute_get_remaining
+                                           (pending->timeout), &peer->id, 
msize,
+                                           &core_transmit_notify, peer);
+    GNUNET_break (NULL != peer->th);
+  }
+  return off;
+}
+
+
+/**
+ * Transmit all messages in the friend's message queue.
+ *
+ * @param peer message queue to process
+ */
+static void
+process_friend_queue (struct FriendInfo *peer)
+{
+  struct P2PPendingMessage *pending;
+
+  if (NULL == (pending = peer->head))
+  {
+    return;
+  }
+  if (NULL != peer->th)
+  {
+    return;
+  }
+
+  peer->th =
+      GNUNET_CORE_notify_transmit_ready (core_api, GNUNET_NO,
+                                         pending->importance,
+                                         GNUNET_TIME_absolute_get_remaining
+                                         (pending->timeout), &peer->id,
+                                         ntohs (pending->msg->size),
+                                         &core_transmit_notify, peer);
+  GNUNET_break (NULL != peer->th);
+}
+
+
+#if ENABLE_MALICIOUS
+/**
+ * Set the ENABLE_MALICIOUS value to malicious.
+ * @param malicious
+ */
+int
+GDS_NEIGHBOURS_act_malicious (unsigned int malicious)
+{
+  act_malicious = malicious;
+  return GNUNET_OK;
+}
+#endif
+
+/**
+ * Construct a trail setup message and forward it to target_friend
+ * @param source_peer Peer which wants to setup the trail
+ * @param ultimate_destination_finger_value Peer identity closest to this value
+ *                                          will be finger to @a source_peer
+ * @param best_known_destination Best known destination (could be finger or 
friend)
+ *                               which should get this message. In case it is
+ *                               friend, then it is same as target_friend
+ * @param target_friend Friend to which message is forwarded now.
+ * @param trail_length Total number of peers in trail setup so far.
+ * @param trail_peer_list Trail setup so far
+ * @param is_predecessor Is @a source_peer looking for trail to a predecessor 
or not.
+ * @param trail_id Unique identifier for the trail we are trying to setup.
+ * @param intermediate_trail_id Trail id of intermediate trail to reach to
+ *                              best_known_destination when its a finger. If 
not
+ *                              used then set to 0.
+ */
+void
+GDS_NEIGHBOURS_send_trail_setup (struct GNUNET_PeerIdentity source_peer,
+                                 uint64_t ultimate_destination_finger_value,
+                                 struct GNUNET_PeerIdentity 
best_known_destination,
+                                 struct FriendInfo *target_friend,
+                                 unsigned int trail_length,
+                                 const struct GNUNET_PeerIdentity 
*trail_peer_list,
+                                 unsigned int is_predecessor,
+                                 struct GNUNET_HashCode trail_id,
+                                 struct GNUNET_HashCode intermediate_trail_id)
+{
+  struct P2PPendingMessage *pending;
+  struct PeerTrailSetupMessage *tsm;
+  struct GNUNET_PeerIdentity *peer_list;
+  size_t msize;
+
+  msize = sizeof (struct PeerTrailSetupMessage) +
+          (trail_length * sizeof (struct GNUNET_PeerIdentity));
+
+  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->timeout = GNUNET_TIME_relative_to_absolute 
(PENDING_MESSAGE_TIMEOUT);
+  tsm = (struct PeerTrailSetupMessage *) &pending[1];
+  pending->msg = &(tsm->header);
+  tsm->header.size = htons (msize);
+  tsm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP);
+  tsm->final_destination_finger_value = GNUNET_htonll 
(ultimate_destination_finger_value);
+  tsm->source_peer = source_peer;
+  tsm->best_known_destination = best_known_destination;
+  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];
+    memcpy (peer_list, trail_peer_list, trail_length * sizeof(struct 
GNUNET_PeerIdentity));
+  }
+
+  GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, 
pending);
+  target_friend->pending_count++;
+  process_friend_queue (target_friend);
+}
+
+
+/**
+ * Construct a trail setup result message and forward it to target friend.
+ * @param querying_peer Peer which sent the trail setup request and should get
+ *                      the result back.
+ * @param Finger Peer to which the trail has been setup to.
+ * @param target_friend Friend to which this message should be forwarded.
+ * @param trail_length Numbers of peers in the trail.
+ * @param trail_peer_list Peers which are part of the trail from
+ *                        querying_peer to Finger, NOT including them.
+ * @param is_predecessor Is @a Finger predecessor to @a querying_peer ?
+ * @param ultimate_destination_finger_value Value to which @a finger is the 
closest
+ *                                          peer.
+ * @param trail_id Unique identifier of the trail.
+ */
+void
+GDS_NEIGHBOURS_send_trail_setup_result (struct GNUNET_PeerIdentity 
querying_peer,
+                                        struct GNUNET_PeerIdentity finger,
+                                        struct FriendInfo *target_friend,
+                                        unsigned int trail_length,
+                                        const struct GNUNET_PeerIdentity 
*trail_peer_list,
+                                        unsigned int is_predecessor,
+                                        uint64_t 
ultimate_destination_finger_value,
+                                        struct GNUNET_HashCode trail_id)
+{
+  struct P2PPendingMessage *pending;
+  struct PeerTrailSetupResultMessage *tsrm;
+  struct GNUNET_PeerIdentity *peer_list;
+  size_t msize;
+
+  msize = sizeof (struct PeerTrailSetupResultMessage) +
+          (trail_length * sizeof (struct GNUNET_PeerIdentity));
+
+  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;
+  pending->timeout = GNUNET_TIME_relative_to_absolute 
(PENDING_MESSAGE_TIMEOUT);
+  tsrm = (struct PeerTrailSetupResultMessage *) &pending[1];
+  pending->msg = &tsrm->header;
+  tsrm->header.size = htons (msize);
+  tsrm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_RESULT);
+  tsrm->querying_peer = querying_peer;
+  tsrm->finger_identity = finger;
+  tsrm->is_predecessor = htonl (is_predecessor);
+  tsrm->trail_id = trail_id;
+  tsrm->ulitmate_destination_finger_value =
+          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++;
+  process_friend_queue (target_friend);
+}
+
+/**
+ * Send notify successor confirmation message.
+ * @param trail_id Unique Identifier of the trail.
+ * @param trail_direction Destination to Source.
+ * @param target_friend Friend to get this message next.
+ */
+void
+GDS_NEIGHBOURS_send_notify_succcessor_confirmation (struct GNUNET_HashCode 
trail_id,
+                                                    unsigned int 
trail_direction,
+                                                     struct FriendInfo 
*target_friend)
+{
+  struct PeerNotifyConfirmationMessage *ncm;
+  struct P2PPendingMessage *pending;
+  size_t msize;
+
+  msize = sizeof (struct PeerNotifyConfirmationMessage);
+  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);
+  ncm = (struct PeerNotifyConfirmationMessage *) &pending[1];
+  pending->msg = &ncm->header;
+  ncm->header.size = htons (msize);
+  ncm->header.type = htons 
(GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_SUCCESSOR_CONFIRMATION);
+  ncm->trail_id = trail_id;
+  ncm->trail_direction = htonl (trail_direction);
+
+  /* Send the message to chosen friend. */
+  GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, 
pending);
+  target_friend->pending_count++;
+  process_friend_queue (target_friend);
+}
+
+
+/**
+ * Send trail rejection message to target friend
+ * @param source_peer Peer which is trying to setup the trail.
+ * @param ultimate_destination_finger_value Peer closest to this value will be
+ *                                          @a source_peer's finger
+ * @param congested_peer Peer which sent this message as it is congested.
+ * @param is_predecessor Is source_peer looking for trail to a predecessor or 
not.
+ * @param trail_peer_list Trails seen so far in trail setup before getting 
rejected
+ *                        by congested_peer. This does NOT include @a 
source_peer
+ *                        and congested_peer.
+ * @param trail_length Total number of peers in trail_peer_list, NOT including
+ *                     @a source_peer and @a congested_peer
+ * @param trail_id Unique identifier of this trail.
+ * @param congestion_timeout Duration given by congested peer as an estimate of
+ *                           how long it may remain congested.
+ */
+void
+GDS_NEIGHBOURS_send_trail_rejection (struct GNUNET_PeerIdentity source_peer,
+                                     uint64_t 
ultimate_destination_finger_value,
+                                     struct GNUNET_PeerIdentity congested_peer,
+                                     unsigned int is_predecessor,
+                                     const struct GNUNET_PeerIdentity 
*trail_peer_list,
+                                     unsigned int trail_length,
+                                     struct GNUNET_HashCode trail_id,
+                                     struct FriendInfo *target_friend,
+                                     const struct GNUNET_TIME_Relative 
congestion_timeout)
+{
+  struct PeerTrailRejectionMessage *trm;
+  struct P2PPendingMessage *pending;
+  struct GNUNET_PeerIdentity *peer_list;
+  size_t msize;
+
+  msize = sizeof (struct PeerTrailRejectionMessage) +
+          (trail_length * sizeof (struct GNUNET_PeerIdentity));
+
+  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;
+  pending->timeout = GNUNET_TIME_relative_to_absolute 
(PENDING_MESSAGE_TIMEOUT);
+  trm = (struct PeerTrailRejectionMessage *)&pending[1];
+  pending->msg = &trm->header;
+  trm->header.size = htons (msize);
+  trm->header.type = htons 
(GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_REJECTION);
+  trm->source_peer = source_peer;
+  trm->congested_peer = congested_peer;
+  trm->congestion_time = congestion_timeout;
+  trm->is_predecessor = htonl (is_predecessor);
+  trm->trail_id = trail_id;
+  trm->ultimate_destination_finger_value =
+          GNUNET_htonll (ultimate_destination_finger_value);
+
+  peer_list = (struct GNUNET_PeerIdentity *) &trm[1];
+  if (trail_length > 0)
+  {
+    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++;
+  process_friend_queue (target_friend);
+}
+
+
+/**
+ * Construct a verify successor message and forward it to target_friend.
+ * @param source_peer Peer which wants to verify its successor.
+ * @param successor Peer which is @a source_peer's current successor.
+ * @param trail_id Unique Identifier of trail from @a source_peer to @a 
successor,
+ *                 NOT including them.
+ * @param trail List of peers which are part of trail to reach from @a 
source_peer
+ *              to @a successor, NOT including them.
+ * @param trail_length Total number of peers in @a trail.
+ * @param target_friend Next friend to get this message.
+ */
+void
+GDS_NEIGHBOURS_send_verify_successor_message (struct GNUNET_PeerIdentity 
source_peer,
+                                              struct GNUNET_PeerIdentity 
successor,
+                                              struct GNUNET_HashCode trail_id,
+                                              struct GNUNET_PeerIdentity 
*trail,
+                                              unsigned int trail_length,
+                                              struct FriendInfo *target_friend)
+{
+  struct PeerVerifySuccessorMessage *vsm;
+  struct P2PPendingMessage *pending;
+  struct GNUNET_PeerIdentity *peer_list;
+  size_t msize;
+
+  msize = sizeof (struct PeerVerifySuccessorMessage) +
+         (trail_length * sizeof (struct GNUNET_PeerIdentity));
+
+  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);
+  vsm = (struct PeerVerifySuccessorMessage *) &pending[1];
+  pending->msg = &vsm->header;
+  vsm->header.size = htons (msize);
+  vsm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR);
+  vsm->source_peer = source_peer;
+  vsm->successor = successor;
+  vsm->trail_id = trail_id;
+  peer_list = (struct GNUNET_PeerIdentity *) &vsm[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++;
+  process_friend_queue (target_friend);
+}
+
+
+/**
+ * FIXME: In every function we pass target friend except for this one.
+ * so, either change everything or this one. also, should se just store
+ * 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 (const struct GNUNET_HashCode *trail_id,
+                                    unsigned int trail_direction,
+                                    const struct GNUNET_PeerIdentity *peer)
+{
+  struct PeerTrailTearDownMessage *ttdm;
+  struct P2PPendingMessage *pending;
+  struct FriendInfo *target_friend;
+  size_t msize;
+
+  msize = sizeof (struct PeerTrailTearDownMessage);
+  if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+  {
+    GNUNET_break (0);
+    return;
+  }
+
+  if (NULL == (target_friend =
+               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)
+  {
+    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);
+  ttdm = (struct PeerTrailTearDownMessage *) &pending[1];
+  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_direction = htonl (trail_direction);
+
+  /* Send the message to chosen friend. */
+  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
+ * @param querying_peer Peer which sent the verify successor message.
+ * @param source_successor Current_successor of @a querying_peer.
+ * @param current_predecessor Current predecessor of @a successor. Could be 
same
+ *                            or different from @a querying_peer.
+ * @param trail_id Unique identifier of the trail from @a querying_peer to
+ *                 @a successor, NOT including them.
+ * @param trail List of peers which are part of trail from @a querying_peer to
+ *                 @a successor, NOT including them.
+ * @param trail_length Total number of peers in @a trail
+ * @param trail_direction Direction in which we are sending the message. In 
this
+ *                        case we are sending result from @a successor to @a 
querying_peer.
+ * @param target_friend Next friend to get this message.
+ */
+void
+GDS_NEIGHBOURS_send_verify_successor_result (struct GNUNET_PeerIdentity 
querying_peer,
+                                             struct GNUNET_PeerIdentity 
current_successor,
+                                             struct GNUNET_PeerIdentity 
probable_successor,
+                                             struct GNUNET_HashCode trail_id,
+                                             const struct GNUNET_PeerIdentity 
*trail,
+                                             unsigned int trail_length,
+                                             enum GDS_ROUTING_trail_direction 
trail_direction,
+                                             struct FriendInfo *target_friend)
+{
+  struct PeerVerifySuccessorResultMessage *vsmr;
+  struct P2PPendingMessage *pending;
+  struct GNUNET_PeerIdentity *peer_list;
+  size_t msize;
+
+  msize = sizeof (struct PeerVerifySuccessorResultMessage) +
+          (trail_length * sizeof(struct GNUNET_PeerIdentity));
+
+  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);
+  vsmr = (struct PeerVerifySuccessorResultMessage *) &pending[1];
+  pending->msg = &vsmr->header;
+  vsmr->header.size = htons (msize);
+  vsmr->header.type = htons 
(GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR_RESULT);
+  vsmr->querying_peer = querying_peer;
+  vsmr->current_successor = current_successor;
+  vsmr->probable_successor = probable_successor;
+  vsmr->trail_direction = htonl (trail_direction);
+  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++;
+  process_friend_queue (target_friend);
+}
+
+
+/**
+ * Construct a notify new successor message and send it to target_friend
+ * @param source_peer Peer which wants to notify to its new successor that it
+ *                    could be its predecessor.
+ * @param successor New successor of @a source_peer
+ * @param successor_trail List of peers in Trail to reach from
+ *                            @a source_peer to @a new_successor, NOT including
+ *                            the endpoints.
+ * @param successor_trail_length Total number of peers in @a 
new_successor_trail.
+ * @param successor_trail_id Unique identifier of @a new_successor_trail.
+ * @param target_friend Next friend to get this message.
+ */
+void
+GDS_NEIGHBOURS_send_notify_new_successor (struct GNUNET_PeerIdentity 
source_peer,
+                                          struct GNUNET_PeerIdentity successor,
+                                          const struct GNUNET_PeerIdentity 
*successor_trail,
+                                          unsigned int successor_trail_length,
+                                          struct GNUNET_HashCode 
succesor_trail_id,
+                                          struct FriendInfo *target_friend)
+{
+  struct PeerNotifyNewSuccessorMessage *nsm;
+  struct P2PPendingMessage *pending;
+  struct GNUNET_PeerIdentity *peer_list;
+  size_t msize;
+
+  msize = sizeof (struct PeerNotifyNewSuccessorMessage) +
+          (successor_trail_length * sizeof(struct GNUNET_PeerIdentity));
+
+  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);
+  nsm = (struct PeerNotifyNewSuccessorMessage *) &pending[1];
+  pending->msg = &nsm->header;
+  nsm->header.size = htons (msize);
+  nsm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_NEW_SUCCESSOR);
+  nsm->new_successor = successor;
+  nsm->source_peer = source_peer;
+  nsm->trail_id = succesor_trail_id;
+  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++;
+  process_friend_queue (target_friend);
+}
+
+
+/**
+ * Construct an add_trail message and send it to target_friend
+ * @param source_peer Source of the trail.
+ * @param destination_peer Destination of the trail.
+ * @param trail_id Unique identifier of the trail from
+ *                 @a source_peer to @a destination_peer, NOT including the 
endpoints.
+ * @param trail List of peers in Trail from @a source_peer to @a 
destination_peer,
+ *              NOT including the endpoints.
+ * @param trail_length Total number of peers in @a trail.
+ * @param target_friend Next friend to get this message.
+ */
+void
+GDS_NEIGHBOURS_send_add_trail (struct GNUNET_PeerIdentity source_peer,
+                               struct GNUNET_PeerIdentity destination_peer,
+                               struct GNUNET_HashCode trail_id,
+                               const struct GNUNET_PeerIdentity *trail,
+                               unsigned int trail_length,
+                               struct FriendInfo *target_friend)
+{
+  struct PeerAddTrailMessage *adm;
+  struct GNUNET_PeerIdentity *peer_list;
+  struct P2PPendingMessage *pending;
+  size_t msize;
+
+  msize = sizeof (struct PeerAddTrailMessage) +
+          (trail_length * sizeof(struct GNUNET_PeerIdentity));
+
+  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);
+  adm = (struct PeerAddTrailMessage *) &pending[1];
+  pending->msg = &adm->header;
+  adm->header.size = htons (msize);
+  adm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_ADD_TRAIL);
+  adm->source_peer = source_peer;
+  adm->destination_peer = destination_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++;
+  process_friend_queue (target_friend);
+
+}
+
+
+/**
+ * Search my location in trail. In case I am present more than once in the
+ * trail (can happen during trail setup), then return my lowest index.
+ * @param trail List of peers
+ * @return my_index if found
+ *         trail_length + 1 if an entry is present twice, It is an error.
+ *         -1 if no entry found.
+ */
+static int
+search_my_index (const struct GNUNET_PeerIdentity *trail,
+                 int trail_length)
+{
+  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]))
+    {
+      flag = 1;
+      if(index_seen == (trail_length + 1))
+        index_seen = i;
+      else
+      {
+        DEBUG("Entry is present twice in trail. Its not allowed\n");
+      }
+      break;
+    }
+  }
+
+  if (1 == flag)
+    return index_seen;
+  else
+    return -1;
+}
+
+
+/**
+ * Check if the friend is congested or have reached maximum number of trails
+ * it can be part of of.
+ * @param friend Friend to be checked.
+ * @return #GNUNET_NO if friend is not congested or have not crossed threshold.
+ *         #GNUNET_YES if friend is either congested or have crossed threshold
+ */
+static int
+is_friend_congested (struct FriendInfo *friend)
+{
+  if (( friend->trails_count < TRAILS_THROUGH_FRIEND_THRESHOLD) &&
+      ((0 == GNUNET_TIME_absolute_get_remaining
+             (friend->congestion_timestamp).rel_value_us)))
+    return GNUNET_NO;
+  else
+    return GNUNET_YES;
+}
+
+
+/**
+ * Select closest finger to value.
+ * @param peer1 First peer
+ * @param peer2 Second peer
+ * @param value Value to be compare
+ * @return Closest peer
+ */
+static struct GNUNET_PeerIdentity
+select_closest_finger (const struct GNUNET_PeerIdentity *peer1,
+                       const struct GNUNET_PeerIdentity *peer2,
+                       uint64_t value)
+{
+  uint64_t peer1_value;
+  uint64_t peer2_value;
+
+  memcpy (&peer1_value, peer1, sizeof (uint64_t));
+  memcpy (&peer2_value, peer2, sizeof (uint64_t));
+  peer1_value = GNUNET_ntohll (peer1_value);
+  peer2_value = GNUNET_ntohll (peer2_value);
+
+  if (peer1_value == value)
+  {
+    return *peer1;
+  }
+
+  if (peer2_value == value)
+  {
+    return *peer2;
+  }
+
+  if (value < peer1_value && peer1_value < peer2_value)
+  {
+    return *peer1;
+  }
+  else if (value < peer2_value && peer2_value < peer1_value)
+  {
+    return *peer2;
+  }
+  else if (peer1_value < value && value < peer2_value)
+  {
+    return *peer2;
+  }
+  else if (peer2_value < value && value < peer1_value)
+  {
+    return *peer1;
+  }
+  else if (peer1_value < peer2_value && peer2_value < value)
+  {
+    return *peer1;
+  }
+  else  // if (peer2_value < peer1_value && peer1_value < value)
+  {
+    return *peer2;
+  }
+}
+
+
+/**
+ * Select closest predecessor to value.
+ * @param peer1 First peer
+ * @param peer2 Second peer
+ * @param value Value to be compare
+ * @return Peer which precedes value in the network.
+ */
+static struct GNUNET_PeerIdentity
+select_closest_predecessor (const struct GNUNET_PeerIdentity *peer1,
+                            const struct GNUNET_PeerIdentity *peer2,
+                            uint64_t value)
+{
+  uint64_t peer1_value;
+  uint64_t peer2_value;
+
+  memcpy (&peer1_value, peer1, sizeof (uint64_t));
+  memcpy (&peer2_value, peer2, sizeof (uint64_t));
+  peer1_value = GNUNET_ntohll (peer1_value);
+  peer2_value = GNUNET_ntohll (peer2_value);
+
+   if (peer1_value == value)
+  {
+    return *peer1;
+  }
+
+  if (peer2_value == value)
+  {
+    return *peer2;
+  }
+
+  if (value < peer1_value && peer1_value < peer2_value)
+  {
+    return *peer2;
+  }
+  else if (value < peer2_value && peer2_value < peer1_value)
+  {
+    return *peer1;
+  }
+  else if (peer1_value < value && value < peer2_value)
+  {
+    return *peer1;
+  }
+  else if (peer2_value < value && value < peer1_value)
+  {
+    return *peer2;
+  }
+  else if (peer1_value < peer2_value && peer2_value < value)
+  {
+    return *peer2;
+  }
+  else  // if (peer2_value < peer1_value && peer1_value < value)
+  {
+    return *peer1;
+  }
+}
+
+#if 0
+/**
+ *
+ *
+ */
+void
+test_print_trail (struct GNUNET_PeerIdentity *trail,
+                  unsigned int trail_length)
+{
+  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++)
+  {
+    print_peer = trail[i];
+    FPRINTF (stderr,_("\nSUPU %s, %s, %d,trail[%d]=%s"),
+            __FILE__, __func__,__LINE__,i,GNUNET_i2s(&print_peer));
+  }
+}
+#endif
+
+#if 0
+/**
+ * This is a test function to print all the entries of friend table.
+ */
+static void
+test_friend_peermap_print ()
+{
+  struct FriendInfo *friend;
+  struct GNUNET_CONTAINER_MultiPeerMapIterator *friend_iter;
+  struct GNUNET_PeerIdentity print_peer;
+  struct GNUNET_PeerIdentity key_ret;
+  int i;
+
+  print_peer = my_identity;
+  FPRINTF (stderr,_("\nSUPU************  FRIEND_PEERMAP of 
%s"),GNUNET_i2s(&print_peer));
+  friend_iter = GNUNET_CONTAINER_multipeermap_iterator_create (friend_peermap);
+
+  for (i = 0; i < GNUNET_CONTAINER_multipeermap_size (friend_peermap); i++)
+  {
+    if(GNUNET_YES == GNUNET_CONTAINER_multipeermap_iterator_next (friend_iter,
+                                                                  &key_ret,
+                                                                  (const void 
**)&friend))
+    {
+      memcpy (&print_peer, &key_ret, sizeof (struct GNUNET_PeerIdentity));
+      FPRINTF (stderr,_("\nSUPU %s, %s, %d, friend = %s, friend->trails_count 
= %d"),
+              __FILE__, __func__,__LINE__, GNUNET_i2s(&print_peer), 
friend->trails_count);
+    }
+  }
+}
+#endif
+
+#if 0
+/**
+ * This is a test function, to print all the entries of finger table.
+ */
+static void
+test_finger_table_print()
+{
+  struct FingerInfo *finger;
+  struct GNUNET_PeerIdentity print_peer;
+  //struct Trail *trail;
+  int i;
+  //int j;
+  //int k;
+  print_peer = my_identity;
+  FPRINTF (stderr,_("\nSUPU************  FINGER_TABLE of 
%s"),GNUNET_i2s(&print_peer));
+  for (i = 0; i < MAX_FINGERS; i++)
+  {
+    finger = &finger_table[i];
+
+    if (GNUNET_NO == finger->is_present)
+      continue;
+
+    print_peer = finger->finger_identity;
+    FPRINTF (stderr,_("\nSUPU %s, %s, %d, finger_table[%d] = %s, trails_count 
= %d"),
+            __FILE__, __func__,__LINE__,i,GNUNET_i2s (&print_peer), 
finger->trails_count);
+
+#if 0
+    for (j = 0; j < finger->trails_count; j++)
+    {
+      trail = &finger->trail_list[j];
+      FPRINTF (stderr,_("\nSUPU %s, %s, %d, trail_id[%d]=%s"),__FILE__, 
__func__,__LINE__,j, GNUNET_h2s(&trail->trail_id));
+      struct Trail_Element *element;
+      element = trail->trail_head;
+      for (k = 0; k < trail->trail_length; k++)
+      {
+        print_peer = element->peer;
+        FPRINTF (stderr,_("\nSUPU %s, %s, %d,trail[%d] = %s "),__FILE__, 
__func__,__LINE__,k, GNUNET_i2s(&print_peer));
+        element = element->next;
+      }
+    }
+    #endif
+  }
+}
+#endif
+
+/**
+ * Select the closest peer among two peers (which should not be same)
+ * with respect to value and finger_table_index
+ * NOTE: peer1 != peer2
+ * @param peer1 First peer
+ * @param peer2 Second peer
+ * @param value Value relative to which we find the closest
+ * @param is_predecessor Is value a predecessor or any other finger.
+ * @return Closest peer among two peers.
+ */
+static struct GNUNET_PeerIdentity
+select_closest_peer (const struct GNUNET_PeerIdentity *peer1,
+                     const struct GNUNET_PeerIdentity *peer2,
+                     uint64_t value,
+                     unsigned int is_predecessor)
+{
+  /* This check is here to ensure that calling function never sends
+      same peer value in peer1 and peer2. Remove it later. */
+  GNUNET_assert(0 != GNUNET_CRYPTO_cmp_peer_identity (peer1, peer2));
+  if (1 == is_predecessor)
+    return select_closest_predecessor (peer1, peer2, value);
+
+  // TODO: Change name to something like select_closest_successor!!
+  return select_closest_finger (peer1, peer2, value);
+}
+
+
+/**
+ * Iterate over the list of all the trails of a finger. In case the first
+ * friend to reach the finger has reached trail threshold or is congested,
+ * then don't select it. In case there multiple available good trails to reach
+ * to Finger, choose the one with shortest trail length.
+ * 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.
+ */
+static struct Trail *
+select_finger_trail (struct FingerInfo *finger)
+{
+  struct FriendInfo *friend;
+  struct Trail *current_finger_trail;
+  struct Trail *best_trail = NULL;
+  unsigned int i;
+
+  GNUNET_assert (finger->trails_count > 0);
+  for (i = 0; i < finger->trails_count; i++)
+  {
+    current_finger_trail = &finger->trail_list[i];
+
+    /* No trail stored at this index. */
+    if (GNUNET_NO == current_finger_trail->is_present)
+      continue;
+
+    GNUNET_assert (NULL !=
+                  (friend =
+                   GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                      
&current_finger_trail->trail_head->peer)));
+
+    /* First friend to reach trail is not free. */
+    if (GNUNET_YES == is_friend_congested (friend))
+      continue;
+
+    if (NULL == best_trail ||
+        best_trail->trail_length > current_finger_trail->trail_length)
+    {
+      best_trail = current_finger_trail;
+    }
+  }
+
+  return best_trail;
+}
+
+
+/**
+ * Compare FINGER entry with current successor. If finger's first friend of all
+ * its trail is not congested and  has not crossed trail threshold, then check
+ * if finger peer identity is closer to final_destination_finger_value than
+ * current_successor. If yes then update current_successor.
+ * @param current_successor[in/out]
+ * @return
+ */
+static void
+compare_finger_and_current_closest_peer (struct Closest_Peer 
*current_closest_peer)
+{
+  struct FingerInfo *finger;
+  struct GNUNET_PeerIdentity closest_peer;
+  struct Trail *finger_trail;
+  int i;
+
+  /* Iterate over finger table. */
+  for (i = 0; i < MAX_FINGERS; i++)
+  {
+    finger = &finger_table[i];
+
+    if (GNUNET_NO == finger->is_present)
+      continue;
+
+    if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger->finger_identity,
+                                              
&current_closest_peer->best_known_destination))
+      continue;
+
+    /* If I am my own finger, then ignore this finger. */
+    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)))
+    {
+      continue;
+    }
+
+    closest_peer = select_closest_peer (&finger->finger_identity,
+                                        
&current_closest_peer->best_known_destination,
+                                        
current_closest_peer->destination_finger_value,
+                                        current_closest_peer->is_predecessor);
+
+    if (0 == GNUNET_CRYPTO_cmp_peer_identity(&finger->finger_identity, 
&closest_peer))
+    {
+      /* Choose one of the trail to reach to finger. */
+      finger_trail = select_finger_trail (finger);
+
+      /* In case no trail found, ignore this finger. */
+      if (NULL == finger_trail)
+        continue;
+
+      current_closest_peer->best_known_destination = closest_peer;
+      current_closest_peer->next_hop = finger_trail->trail_head->peer;
+      current_closest_peer->trail_id = finger_trail->trail_id;
+      current_closest_peer->finger_table_index = i;
+    }
+    continue;
+  }
+}
+
+
+/**
+ * Compare friend entry with current successor.
+ * If friend identity and current_successor is same, then do nothing.
+ * If friend is not congested and has not crossed trail threshold, then check
+ * if friend peer identity is closer to final_destination_finger_value than
+ * current_successor. If yes then update current_successor.
+ * @param cls closure
+ * @param key current public key
+ * @param value struct Closest_Peer
+ * @return #GNUNET_YES if we should continue to iterate,
+ *         #GNUNET_NO if not.
+ */
+static int
+compare_friend_and_current_closest_peer (void *cls,
+                                         const struct GNUNET_PeerIdentity *key,
+                                         void *value)
+{
+  struct FriendInfo *friend = value;
+  struct Closest_Peer *current_closest_peer = cls;
+  struct GNUNET_PeerIdentity closest_peer;
+
+  /* Friend is either congested or has crossed threshold. */
+  if (GNUNET_YES == is_friend_congested (friend))
+    return GNUNET_YES;
+
+  /* If current_closest_peer and friend identity are same, then do nothing.*/
+  if (0 == GNUNET_CRYPTO_cmp_peer_identity (&friend->id,
+                                            
&current_closest_peer->best_known_destination))
+  {
+    GNUNET_break (0);
+    return GNUNET_YES;
+  }
+
+  closest_peer = select_closest_peer (&friend->id,
+                                      
&current_closest_peer->best_known_destination,
+                                      
current_closest_peer->destination_finger_value,
+                                      current_closest_peer->is_predecessor);
+
+  /* Is friend the closest successor? */
+  if (0 == GNUNET_CRYPTO_cmp_peer_identity(&friend->id, &closest_peer))
+  {
+    current_closest_peer->best_known_destination = friend->id;
+    current_closest_peer->next_hop = friend->id;
+  }
+
+  return GNUNET_YES;
+}
+
+
+/**
+ * Initialize current_successor to my_identity.
+ * @param my_identity My peer identity
+ * @return Updated closest_peer
+ */
+static struct Closest_Peer
+init_closest_peer (struct GNUNET_PeerIdentity my_identity,
+                        uint64_t destination_finger_value,
+                        unsigned int is_predecessor)
+{
+  struct Closest_Peer current_closest_peer;
+
+  memset (&current_closest_peer.trail_id, 0, sizeof(struct GNUNET_HashCode));
+  current_closest_peer.destination_finger_value = destination_finger_value;
+  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.
+  return current_closest_peer;
+}
+
+
+/**
+ * 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
+ *                      @a destination_finger_value
+ */
+static struct Closest_Peer
+find_local_best_known_next_hop (uint64_t destination_finger_value,
+                                unsigned int is_predecessor)
+{
+  struct Closest_Peer current_closest_peer;
+
+   /* Initialize current_successor to my_identity. */
+  current_closest_peer = init_closest_peer (my_identity,
+                                            destination_finger_value,
+                                            is_predecessor);
+
+  /* Compare each friend entry with current_successor and update 
current_successor
+   * with friend if its closest. */
+  GNUNET_assert
+          (GNUNET_SYSERR !=
+           GNUNET_CONTAINER_multipeermap_iterate (friend_peermap,
+                                                  
&compare_friend_and_current_closest_peer,
+                                                  &current_closest_peer));
+
+  /* Compare each finger entry with current_successor and update 
current_successor
+   * with finger if its closest. */
+  compare_finger_and_current_closest_peer (&current_closest_peer);
+  return current_closest_peer;
+}
+
+
+/**
+ * Construct a Put message and send it to target_peer.
+ * @param key Key for the content
+ * @param block_type Type of the block
+ * @param options Routing options
+ * @param desired_replication_level Desired replication count
+ * @param best_known_dest Peer to which this message should reach eventually,
+ *                        as it is best known destination to me.
+ * @param intermediate_trail_id Trail id in case
+ * @param target_peer Peer to which this message will be forwarded.
+ * @param hop_count Number of hops traversed so far.
+ * @param put_path_length Total number of peers in @a put_path
+ * @param put_path Number of peers traversed so far
+ * @param expiration_time When does the content expire
+ * @param data Content to store
+ * @param data_size Size of content @a data in bytes
+ */
+void
+GDS_NEIGHBOURS_send_put (const struct GNUNET_HashCode *key,
+                         enum GNUNET_BLOCK_Type block_type,
+                                          enum GNUNET_DHT_RouteOption options,
+                                          uint32_t desired_replication_level,
+                                          struct GNUNET_PeerIdentity 
best_known_dest,
+                                          struct GNUNET_HashCode 
intermediate_trail_id,
+                                          struct GNUNET_PeerIdentity 
*target_peer,
+                         uint32_t hop_count,
+                         uint32_t put_path_length,
+                         struct GNUNET_PeerIdentity *put_path,
+                         struct GNUNET_TIME_Absolute expiration_time,
+                         const void *data, size_t data_size)
+{
+  struct PeerPutMessage *ppm;
+  struct P2PPendingMessage *pending;
+  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)
+  {
+    put_path_length = 0;
+    msize = data_size + sizeof (struct PeerPutMessage);
+  }
+
+  if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+  {
+    DEBUG("msize = %lu\n",msize);
+    GNUNET_break (0);
+    return;
+  }
+
+  GNUNET_assert (NULL !=
+                 (target_friend =
+                  GNUNET_CONTAINER_multipeermap_get (friend_peermap, 
target_peer)));
+  pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+  pending->timeout = expiration_time;
+  ppm = (struct PeerPutMessage *) &pending[1];
+  pending->msg = &ppm->header;
+  ppm->header.size = htons (msize);
+  ppm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_PUT);
+  ppm->options = htonl (options);
+  ppm->block_type = htonl (block_type);
+  ppm->hop_count = htonl (hop_count + 1);
+  ppm->desired_replication_level = htonl (desired_replication_level);
+  ppm->expiration_time = GNUNET_TIME_absolute_hton (expiration_time);
+  ppm->best_known_destination = best_known_dest;
+  ppm->intermediate_trail_id = intermediate_trail_id;
+  ppm->key = *key;
+  pp = (struct GNUNET_PeerIdentity *) &ppm[1];
+  ppm->put_path_length = htonl (put_path_length);
+  if(put_path_length > 0)
+  {
+    memcpy (pp, put_path,
+            sizeof (struct GNUNET_PeerIdentity) * put_path_length);
+  }
+  memcpy (&pp[put_path_length], data, data_size);
+  GNUNET_assert (NULL != target_friend);
+  GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, 
pending);
+  target_friend->pending_count++;
+  process_friend_queue (target_friend);
+}
+
+
+/**
+ * Handle the put request from the client.
+ * @param key Key for the content
+ * @param block_type Type of the block
+ * @param options Routing options
+ * @param desired_replication_level Desired replication count
+ * @param expiration_time When does the content expire
+ * @param data Content to store
+ * @param data_size Size of content @a data in bytes
+ */
+void
+GDS_NEIGHBOURS_handle_put (const struct GNUNET_HashCode *key,
+                           enum GNUNET_BLOCK_Type block_type,
+                           enum GNUNET_DHT_RouteOption options,
+                           uint32_t desired_replication_level,
+                           struct GNUNET_TIME_Absolute expiration_time,
+                           const void *data, size_t data_size)
+{
+  struct GNUNET_PeerIdentity best_known_dest;
+  struct GNUNET_HashCode intermediate_trail_id;
+  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,
+                                              GDS_FINGER_TYPE_NON_PREDECESSOR);
+  best_known_dest = successor.best_known_destination;
+  next_hop = successor.next_hop;
+  intermediate_trail_id = successor.trail_id;
+
+  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.
+                             key, data, data_size);
+    return;
+  }
+  /* In case we are sending the request to  a finger, then send across all of 
its
+   trail.*/
+#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, 0, 1, &my_identity,
+                                 expiration_time,
+                                 data, data_size);
+       }
+    }
+    return;
+  }
+#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);
+}
+
+/**
+ * Construct a Get message and send it to target_peer.
+ * @param key Key for the content
+ * @param block_type Type of the block
+ * @param options Routing options
+ * @param desired_replication_level Desired replication count
+ * @param best_known_dest Peer which should get this message. Same as target 
peer
+ *                        if best_known_dest is a friend else its a finger.
+ * @param intermediate_trail_id  Trail id to reach to @a best_known_dest
+ *                              in case it is a finger else set to 0.
+ * @param target_peer Peer to which this message will be forwarded.
+ * @param hop_count Number of hops traversed so far.
+ * @param data Content to store
+ * @param data_size Size of content @a data in bytes
+ * @param get_path_length Total number of peers in @a get_path
+ * @param get_path Number of peers traversed so far
+ */
+void
+GDS_NEIGHBOURS_send_get (const struct GNUNET_HashCode *key,
+                         enum GNUNET_BLOCK_Type block_type,
+                         enum GNUNET_DHT_RouteOption options,
+                         uint32_t desired_replication_level,
+                         struct GNUNET_PeerIdentity best_known_dest,
+                         struct GNUNET_HashCode intermediate_trail_id,
+                         struct GNUNET_PeerIdentity *target_peer,
+                         uint32_t hop_count,
+                         uint32_t get_path_length,
+                         struct GNUNET_PeerIdentity *get_path)
+{
+  struct PeerGetMessage *pgm;
+  struct P2PPendingMessage *pending;
+  struct FriendInfo *target_friend;
+  struct GNUNET_PeerIdentity *gp;
+  size_t msize;
+
+  msize = sizeof (struct PeerGetMessage) +
+          (get_path_length * sizeof (struct GNUNET_PeerIdentity));
+
+  if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+  {
+    GNUNET_break (0);
+    return;
+  }
+  GNUNET_assert (NULL !=
+                 (target_friend =
+                  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);
+  pending->importance = 0;    /* FIXME */
+  pgm = (struct PeerGetMessage *) &pending[1];
+  pending->msg = &pgm->header;
+  pgm->header.size = htons (msize);
+  pgm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_GET);
+  pgm->get_path_length = htonl (get_path_length);
+  pgm->best_known_destination = best_known_dest;
+  pgm->key = *key;
+  pgm->intermediate_trail_id = intermediate_trail_id;
+  pgm->hop_count = htonl (hop_count + 1);
+  pgm->get_path_length = htonl (get_path_length);
+  gp = (struct GNUNET_PeerIdentity *) &pgm[1];
+  memcpy (gp, get_path,
+          sizeof (struct GNUNET_PeerIdentity) * get_path_length);
+  GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, 
pending);
+  target_friend->pending_count++;
+  process_friend_queue (target_friend);
+}
+
+
+/**
+ * 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.
+ * @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
+GDS_NEIGHBOURS_handle_get(const struct GNUNET_HashCode *key,
+                          enum GNUNET_BLOCK_Type block_type,
+                          enum GNUNET_DHT_RouteOption options,
+                          uint32_t desired_replication_level)
+{
+  struct Closest_Peer successor;
+  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,
+                                              GDS_FINGER_TYPE_NON_PREDECESSOR);
+
+  best_known_dest = successor.best_known_destination;
+  intermediate_trail_id = successor.trail_id;
+
+  /* I am the destination. I have the data. */
+  if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
+                                            &best_known_dest))
+  {
+    GDS_DATACACHE_handle_get (key,block_type, NULL, 0,
+                              NULL, 0, 1, &my_identity, NULL,&my_identity);
+    return;
+  }
+
+#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);
+}
+
+
+/**
+ * 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.
+ * @param source_peer Peer which has the data for the key.
+ * @param put_path_length Number of peers in @a put_path
+ * @param put_path Path taken to put the data at its stored location.
+ * @param get_path_length Number of peers in @a get_path
+ * @param get_path Path taken to reach to the location of the key.
+ * @param expiration When will this result expire?
+ * @param data Payload to store
+ * @param data_size Size of the @a data
+ */
+void
+GDS_NEIGHBOURS_send_get_result (const struct GNUNET_HashCode *key,
+                                enum GNUNET_BLOCK_Type type,
+                                const struct GNUNET_PeerIdentity *target_peer,
+                                const struct GNUNET_PeerIdentity *source_peer,
+                                unsigned int put_path_length,
+                                const struct GNUNET_PeerIdentity *put_path,
+                                unsigned int get_path_length,
+                                const struct GNUNET_PeerIdentity *get_path,
+                                struct GNUNET_TIME_Absolute expiration,
+                                const void *data, size_t data_size)
+{
+  struct PeerGetResultMessage *get_result;
+  struct GNUNET_PeerIdentity *paths;
+  struct P2PPendingMessage *pending;
+  struct FriendInfo *target_friend;
+  int current_path_index;
+  size_t msize;
+
+  msize = (put_path_length + get_path_length )* sizeof (struct 
GNUNET_PeerIdentity) +
+          data_size +
+          sizeof (struct PeerGetResultMessage);
+
+  if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+  {
+    put_path_length = 0;
+    msize = msize - put_path_length * sizeof (struct GNUNET_PeerIdentity);
+  }
+
+  if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+  {
+    GNUNET_break(0);
+    return;
+  }
+  current_path_index = 0;
+  if(get_path_length > 0)
+  {
+    current_path_index = search_my_index(get_path, get_path_length);
+    if (-1 == current_path_index)
+    {
+      GNUNET_break (0);
+      return;
+    }
+    if ((get_path_length + 1) == current_path_index)
+    {
+      DEBUG ("Peer found twice in get path. Not allowed \n");
+      GNUNET_break (0);
+      return;
+    }
+  }
+  if (0 == current_path_index)
+  {
+    DEBUG ("GET_RESULT TO CLIENT KEY = %s, Peer = 
%s",GNUNET_h2s(key),GNUNET_i2s(&my_identity));
+    GDS_CLIENTS_handle_reply (expiration, key, get_path_length,
+                              get_path, put_path_length,
+                              put_path, type, data_size, data);
+    return;
+  }
+
+  pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+  pending->timeout = GNUNET_TIME_relative_to_absolute 
(PENDING_MESSAGE_TIMEOUT);
+  pending->importance = 0;
+  get_result = (struct PeerGetResultMessage *)&pending[1];
+  pending->msg = &get_result->header;
+  get_result->header.size = htons (msize);
+  get_result->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_GET_RESULT);
+  get_result->key = *key;
+  get_result->querying_peer = *source_peer;
+  get_result->expiration_time = expiration;
+  get_result->get_path_length = htonl (get_path_length);
+  get_result->put_path_length = htonl (put_path_length);
+  paths = (struct GNUNET_PeerIdentity *)&get_result[1];
+  memcpy (paths, put_path,
+          put_path_length * sizeof (struct GNUNET_PeerIdentity));
+  memcpy (&paths[put_path_length], get_path,
+          get_path_length * sizeof (struct GNUNET_PeerIdentity));
+  memcpy (&paths[put_path_length + get_path_length], data, data_size);
+
+  GNUNET_assert (NULL !=
+                (target_friend =
+                 GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                    
&get_path[current_path_index - 1])));
+  GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, 
pending);
+  target_friend->pending_count++;
+  process_friend_queue (target_friend);
+}
+
+
+/**
+ * Randomly choose one of your friends (which is not congested and have not 
crossed
+ * trail threshold) from the friend_peermap
+ * @return Friend Randomly chosen friend.
+ *         NULL in case friend peermap is empty, or all the friends are either
+ *              congested or have crossed trail threshold.
+ */
+static struct FriendInfo *
+select_random_friend ()
+{
+  unsigned int current_size;
+  uint32_t index;
+  unsigned int j = 0;
+  struct GNUNET_CONTAINER_MultiPeerMapIterator *iter;
+  struct GNUNET_PeerIdentity key_ret;
+  struct FriendInfo *friend;
+
+  current_size = GNUNET_CONTAINER_multipeermap_size (friend_peermap);
+
+  /* No friends.*/
+  if (0 == current_size)
+    return NULL;
+
+  index = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, current_size);
+  iter = GNUNET_CONTAINER_multipeermap_iterator_create (friend_peermap);
+
+  /* Iterate till you don't reach to index. */
+  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. */
+    if (j == current_size)
+    {
+      j = 0;
+      GNUNET_CONTAINER_multipeermap_iterator_destroy (iter);
+      iter = GNUNET_CONTAINER_multipeermap_iterator_create (friend_peermap);
+
+    }
+
+    /* Get the friend stored at the index, j*/
+    GNUNET_assert (GNUNET_YES ==
+                   GNUNET_CONTAINER_multipeermap_iterator_next (iter,
+                                                                &key_ret,
+                                                                (const void 
**)&friend));
+
+    /* This friend is not congested and has not crossed trail threshold. */
+    if ((friend->trails_count < TRAILS_THROUGH_FRIEND_THRESHOLD) &&
+        (0 == GNUNET_TIME_absolute_get_remaining 
(friend->congestion_timestamp).rel_value_us))
+    {
+      break;
+    }
+    friend = NULL;
+    j++;
+  } while (j != index);
+
+  GNUNET_CONTAINER_multipeermap_iterator_destroy (iter);
+  return friend;
+}
+
+
+/**
+ * Compute 64 bit value of finger_identity corresponding to a finger index 
using
+ * chord formula.
+ * For all fingers, n.finger[i] = n + pow (2,i),
+ * For predecessor, n.finger[PREDECESSOR_FINGER_ID] = n - 1, where
+ * n = my_identity, i = finger_index, n.finger[i] = 64 bit finger value
+ * @param finger_index Index corresponding to which we calculate 64 bit value.
+ * @return 64 bit value.
+ */
+static uint64_t
+compute_finger_identity_value (unsigned int finger_index)
+{
+  uint64_t my_id64;
+
+  memcpy (&my_id64, &my_identity, sizeof (uint64_t));
+  my_id64 = GNUNET_ntohll (my_id64);
+
+  /* Are we looking for immediate predecessor? */
+  if (PREDECESSOR_FINGER_ID == finger_index)
+    return (my_id64 - 1);
+  else
+  {
+    uint64_t add = (uint64_t)1 << finger_index;
+    return (my_id64 + add);
+  }
+}
+
+
+/*
+ * Choose a random friend. Calculate the next finger identity to search,from
+ * current_search_finger_index. Start looking for the trail to reach to
+ * finger identity through this random friend.
+ *
+ * @param cls closure for this task
+ * @param tc the context under which the task is running
+ */
+static void
+send_find_finger_trail_message (void *cls,
+                                const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  struct FriendInfo *target_friend;
+  struct GNUNET_HashCode trail_id;
+  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
+   * 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 +
+      GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
+                                DHT_FIND_FINGER_TRAIL_INTERVAL.rel_value_us);
+  find_finger_trail_task =
+      GNUNET_SCHEDULER_add_delayed (find_finger_trail_task_next_send_time,
+                                    &send_find_finger_trail_message,
+                                    NULL);
+
+  /* No space in my routing table. (Source and destination peers also store 
entries
+   * in their routing table).  */
+  if (GNUNET_YES == GDS_ROUTING_threshold_reached())
+    return;
+
+  target_friend = select_random_friend ();
+  if (NULL == target_friend)
+  {
+    return;
+  }
+
+  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));
+  memset(&intermediate_trail_id, 0, sizeof (struct GNUNET_HashCode));
+  GDS_NEIGHBOURS_send_trail_setup (my_identity, finger_id_value,
+                                   target_friend->id, target_friend, 0, NULL,
+                                   is_predecessor, trail_id,
+                                   intermediate_trail_id);
+}
+
+
+/**
+ * In case there are already maximum number of possible trails to reach to a
+ * finger, then check if the new trail's length is lesser than any of the
+ * existing trails.
+ * If yes then replace that old trail by new trail.
+ *
+ * Note: Here we are taking length as a parameter to choose the best possible
+ * trail, but there could be other parameters also like:
+ * 1. duration of existence of a trail - older the better.
+ * 2. if the new trail is completely disjoint than the
+ *    other trails, then may be choosing it is better.
+ *
+ * @param finger Finger
+ * @param new_finger_trail List of peers to reach from me to @a finger, NOT
+ *                         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.
+ */
+static void
+select_and_replace_trail (struct FingerInfo *finger,
+                          const struct GNUNET_PeerIdentity *new_trail,
+                          unsigned int new_trail_length,
+                          struct GNUNET_HashCode new_trail_id)
+{
+  struct Trail *current_trail;
+  unsigned int largest_trail_length;
+  unsigned int largest_trail_index;
+  struct Trail_Element *trail_element;
+  struct GNUNET_PeerIdentity *next_hop;
+  unsigned int i;
+
+  largest_trail_length = new_trail_length;
+  largest_trail_index = MAXIMUM_TRAILS_PER_FINGER + 1;
+
+  GNUNET_assert (MAXIMUM_TRAILS_PER_FINGER == finger->trails_count);
+
+  for (i = 0; i < finger->trails_count; i++)
+  {
+    current_trail = &finger->trail_list[i];
+    GNUNET_assert (GNUNET_YES == current_trail->is_present);
+    if (current_trail->trail_length > largest_trail_length)
+    {
+      largest_trail_length = current_trail->trail_length;
+      largest_trail_index = i;
+    }
+  }
+
+  /* New trail is not better than existing ones. Send trail teardown. */
+  if (largest_trail_index == (MAXIMUM_TRAILS_PER_FINGER + 1))
+  {
+    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_ROUTING_SRC_TO_DEST,
+                                        next_hop);
+    return;
+  }
+
+  /* Send trail teardown message across the replaced trail. */
+  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_ROUTING_SRC_TO_DEST,
+                                      next_hop);
+
+  /* Free the trail. */
+  while (NULL != (trail_element = replace_trail->trail_head))
+  {
+    GNUNET_CONTAINER_DLL_remove (replace_trail->trail_head,
+                                 replace_trail->trail_tail, trail_element);
+    GNUNET_free_non_null (trail_element);
+  }
+
+  /* Add new trial at that location. */
+  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);
+    element->peer = new_trail[i];
+
+    GNUNET_CONTAINER_DLL_insert_tail (replace_trail->trail_head,
+                                      replace_trail->trail_tail,
+                                      element);
+  }
+  /* FIXME: URGENT Are we adding the trail back to the list. */
+}
+
+
+/**
+ * Check if the new trail to reach to finger is unique or do we already have
+ * such a trail present for finger.
+ * @param existing_finger Finger identity
+ * @param new_trail New trail to reach @a existing_finger
+ * @param trail_length Total number of peers in new_trail.
+ * @return #GNUNET_YES if the new trail is unique
+ *         #GNUNET_NO if same trail is already present.
+ */
+static int
+is_new_trail_unique (struct FingerInfo *existing_finger,
+                     const struct GNUNET_PeerIdentity *new_trail,
+                     unsigned int trail_length)
+{
+  struct Trail *current_trail;
+  struct Trail_Element *trail_element;
+  int i;
+  int j;
+
+  GNUNET_assert (existing_finger->trails_count > 0);
+
+  /* Iterate over list of trails. */
+  for (i = 0; i < existing_finger->trails_count; i++)
+  {
+    current_trail = &(existing_finger->trail_list[i]);
+    if(GNUNET_NO == current_trail->is_present)
+      continue;
+
+    /* New trail and existing trail length are not same. */
+    if (current_trail->trail_length != trail_length)
+    {
+      return GNUNET_YES;
+    }
+
+    trail_element = current_trail->trail_head;
+    for (j = 0; j < current_trail->trail_length; j++)
+    {
+      if (0 != GNUNET_CRYPTO_cmp_peer_identity (&new_trail[j],
+                                                &trail_element->peer))
+      {
+        return GNUNET_YES;
+      }
+      trail_element = trail_element->next;
+    }
+  }
+  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.
+ * @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
+ * @param new_finger_trail_id Unique identifier of the trail.
+ */
+static void
+add_new_trail (struct FingerInfo *existing_finger,
+               const struct GNUNET_PeerIdentity *new_trail,
+               unsigned int new_trail_length,
+               struct GNUNET_HashCode new_trail_id)
+{
+  struct FriendInfo *friend;
+  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)
+    {
+      free_slot = i;
+      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;
+  trail->trail_length = new_trail_length;
+  existing_finger->trails_count++;
+  trail->is_present = GNUNET_YES;
+  if (0 == new_trail_length)
+  {
+    friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                
&existing_finger->finger_identity);
+  }
+  else
+  {
+    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++)
+  {
+    struct Trail_Element *element;
+
+    element = GNUNET_new (struct Trail_Element);
+    element->peer = new_trail[i];
+    GNUNET_CONTAINER_DLL_insert_tail (trail->trail_head,
+                                      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;
+  existing_finger->trail_list[free_slot].trail_id = new_trail_id;
+  existing_finger->trail_list[free_slot].is_present = GNUNET_YES;
+}
+
+
+#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.
+ * @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
+ * @param new_finger_trail_id Unique identifier of the trail.
+ */
+static void
+add_new_trail (struct FingerInfo *existing_finger,
+               const struct GNUNET_PeerIdentity *new_trail,
+               unsigned int new_trail_length,
+               struct GNUNET_HashCode new_trail_id)
+{
+  struct Trail *trail;
+  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);
+  trail->trail_id = new_trail_id;
+  trail->trail_length = new_trail_length;
+  existing_finger->trails_count++;
+  trail->is_present = GNUNET_YES;
+
+  GNUNET_assert (NULL == (GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                             
&existing_finger->finger_identity)));
+  /* If finger is a friend then we never call this function. */
+  GNUNET_assert (new_trail_length > 0);
+
+  first_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                    &new_trail[0]);
+  first_friend->trails_count++;
+
+  for (i = 0; i < new_trail_length; i++)
+  {
+    struct Trail_Element *element;
+
+    element = GNUNET_new (struct Trail_Element);
+    element->peer = new_trail[i];
+    GNUNET_CONTAINER_DLL_insert_tail (trail->trail_head,
+                                      trail->trail_tail,
+                                      element);
+  }
+  /* Do we need to add trail head and trail tail in the trail list itearator.*/
+  existing_finger->trail_list[index].trail_head = trail->trail_head;
+  existing_finger->trail_list[index].trail_tail = trail->trail_tail;
+  existing_finger->trail_list[index].trail_length = new_trail_length;
+  existing_finger->trail_list[index].trail_id = new_trail_id;
+  existing_finger->trail_list[index].is_present = GNUNET_YES;
+}
+#endif
+
+/**
+ * Get the next hop to send trail teardown message from routing table and
+ * then delete the entry from routing table. Send trail teardown message for a
+ * specific trail of a finger.
+ * @param finger Finger whose trail is to be removed.
+ * @param trail List of peers in trail from me to a finger, NOT including
+ *              endpoints.
+ */
+static void
+send_trail_teardown (struct FingerInfo *finger,
+                     struct Trail *trail)
+{
+  struct FriendInfo *friend;
+  struct GNUNET_PeerIdentity *next_hop;
+
+  next_hop = GDS_ROUTING_get_next_hop (trail->trail_id,
+                                       GDS_ROUTING_SRC_TO_DEST);
+  if (NULL == next_hop)
+  {
+//    DEBUG(" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s, 
line=%d,traillength = %d",
+//            GNUNET_i2s(&my_identity), GNUNET_h2s(&trail->trail_id), 
__LINE__,trail->trail_length);
+    return;
+  }
+  GNUNET_assert (0 != GNUNET_CRYPTO_cmp_peer_identity 
(&finger->finger_identity,
+                                                       &my_identity));
+
+  GNUNET_assert(GNUNET_YES == trail->is_present);
+  if (trail->trail_length > 0)
+  {
+    friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                &trail->trail_head->peer);
+  }
+  else
+  {
+    friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                &finger->finger_identity);
+  }
+
+  if(NULL == friend)
+  {
+    DEBUG ("\n LINE NO: = %d, Friend not found for trail id  %s of peer %s 
trail length = %d",
+           __LINE__,GNUNET_h2s(&trail->trail_id), 
GNUNET_i2s(&my_identity),trail->trail_length);
+    return;
+  }
+  if (0 != GNUNET_CRYPTO_cmp_peer_identity (next_hop, &friend->id)
+      && (0 == trail->trail_length))
+  {
+     DEBUG ("\n LINE NO: = %d, Friend not found for trail id  %s of peer %s 
trail length = %d",
+           __LINE__,GNUNET_h2s(&trail->trail_id), 
GNUNET_i2s(&my_identity),trail->trail_length);
+    return;
+  }
+  GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (trail->trail_id));
+  friend->trails_count--;
+  GDS_NEIGHBOURS_send_trail_teardown (&trail->trail_id,
+                                      GDS_ROUTING_SRC_TO_DEST,
+                                      &friend->id);
+}
+
+
+/**
+ * Send trail teardown message across all the trails to reach to finger.
+ * @param finger Finger whose all the trail should be freed.
+ */
+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)
+    {
+      send_trail_teardown (finger, trail);
+      trail->is_present = GNUNET_NO;
+    }
+  }
+}
+
+
+/**
+ * Free a specific trail
+ * @param trail List of peers to be freed.
+ */
+static void
+free_trail (struct Trail *trail)
+{
+  struct Trail_Element *trail_element;
+
+  while (NULL != (trail_element = trail->trail_head))
+  {
+    GNUNET_CONTAINER_DLL_remove (trail->trail_head,
+                                 trail->trail_tail,
+                                 trail_element);
+    GNUNET_free_non_null (trail_element);
+  }
+  trail->trail_head = NULL;
+  trail->trail_tail = NULL;
+}
+
+
+/**
+ * Free finger and its trail.
+ * @param finger Finger to be freed.
+ * @param finger_table_index Index at which finger is stored.
+ */
+static void
+free_finger (struct FingerInfo *finger, unsigned int finger_table_index)
+{
+  struct Trail *trail;
+  unsigned int i;
+  for (i = 0; i < finger->trails_count; i++)
+  {
+    trail = &finger->trail_list[i];
+    if (GNUNET_NO == trail->is_present)
+      continue;
+
+    if (trail->trail_length > 0)
+      free_trail (trail);
+    trail->is_present = GNUNET_NO;
+  }
+
+  finger->is_present = GNUNET_NO;
+  memset ((void *)&finger_table[finger_table_index], 0, sizeof 
(finger_table[finger_table_index]));
+}
+
+
+/**
+ * Add a new entry in finger table at finger_table_index.
+ * In case I am my own finger, then we don't have a trail. In case of a friend,
+ * we have a trail with unique id and '0' trail length.
+ * In case a finger is a friend, then increment the trails count of the friend.
+ * @param finger_identity Peer Identity of new finger
+ * @param finger_trail Trail to reach from me to finger (excluding both end 
points).
+ * @param finger_trail_length Total number of peers in @a finger_trail.
+ * @param trail_id Unique identifier of the trail.
+ * @param finger_table_index Index in finger table.
+ */
+static void
+add_new_finger (struct GNUNET_PeerIdentity finger_identity,
+                const struct GNUNET_PeerIdentity *finger_trail,
+                unsigned int finger_trail_length,
+                struct GNUNET_HashCode trail_id,
+                unsigned int finger_table_index)
+{
+  struct FingerInfo *new_entry;
+  struct FriendInfo *first_trail_hop;
+  struct Trail *trail;
+  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))
+  {
+    new_entry->trails_count = 0;
+    finger_table[finger_table_index] = *new_entry;
+    GNUNET_free (new_entry);
+    return;
+  }
+
+  /* Finger is a friend. */
+  if (0 == finger_trail_length)
+  {
+    new_entry->trail_list[0].trail_id = trail_id;
+    new_entry->trails_count = 1;
+    new_entry->trail_list[0].is_present = GNUNET_YES;
+    new_entry->trail_list[0].trail_length = 0;
+    new_entry->trail_list[0].trail_head = NULL;
+    new_entry->trail_list[0].trail_tail = NULL;
+    finger_table[finger_table_index] = *new_entry;
+    GNUNET_assert (NULL !=
+                  (first_trail_hop =
+                       GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                          &finger_identity)));
+
+    first_trail_hop->trails_count++;
+    GNUNET_free (new_entry);
+    return;
+  }
+
+  GNUNET_assert (NULL !=
+                (first_trail_hop =
+                       GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                          &finger_trail[0])));
+  new_entry->trails_count = 1;
+  first_trail_hop->trails_count++;
+  /* Copy the finger trail into trail. */
+  trail = &new_entry->trail_list[0];
+  for(i = 0; i < finger_trail_length; i++)
+  {
+    struct Trail_Element *element = GNUNET_new (struct Trail_Element);
+
+    element->next = NULL;
+    element->prev = NULL;
+    element->peer = finger_trail[i];
+    GNUNET_CONTAINER_DLL_insert_tail (trail->trail_head,
+                                      trail->trail_tail,
+                                      element);
+  }
+
+  /* Add trail to trail list. */
+  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);
+}
+
+
+/**
+ * Periodic task to verify current successor. There can be multiple trails to 
reach
+ * to successor, choose the shortest one and send verify successor message
+ * across that trail.
+ * @param cls closure for this task
+ * @param tc the context under which the task is running
+ */
+static void
+send_verify_successor_message (void *cls,
+                               const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  struct FriendInfo *target_friend;
+  struct GNUNET_HashCode trail_id;
+  struct Trail *trail;
+  struct Trail_Element *element;
+  unsigned int trail_length;
+  unsigned int i = 0;
+  struct FingerInfo *successor;
+
+  successor = &finger_table[0];
+
+  /* This task will be scheduled when the result for Verify Successor is 
received. */
+  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
+   * context.
+   */
+  if (NULL == 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.
+     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.
+     */
+    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 =
+          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 =
+        GNUNET_SCHEDULER_add_delayed (verify_successor_retry_time,
+                                      &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++)
+  {
+    trail = &successor->trail_list[i];
+    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. */
+  GNUNET_assert (GNUNET_YES == trail->is_present);
+  trail_id = trail->trail_id;
+  if (NULL == GDS_ROUTING_get_next_hop(trail_id,GDS_ROUTING_SRC_TO_DEST))
+  {
+    DEBUG(" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s, line",
+            GNUNET_i2s(&my_identity), GNUNET_h2s(&trail->trail_id), __LINE__);
+    GNUNET_break(0);
+    return;
+  }
+  trail_length = trail->trail_length;
+  if (trail_length > 0)
+  {
+     /* Copy the trail into peer list. */
+    struct GNUNET_PeerIdentity peer_list[trail_length];
+    element = trail->trail_head;
+    for(i = 0; i < trail_length; i++)
+    {
+      peer_list[i] = element->peer;
+      element = element->next;
+    }
+    GNUNET_assert (NULL != (target_friend =
+                            GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                               
&peer_list[0])));
+    GDS_NEIGHBOURS_send_verify_successor_message (my_identity,
+                                                  successor->finger_identity,
+                                                  trail_id, peer_list, 
trail_length,
+                                                  target_friend);
+  }
+  else
+  {
+    GNUNET_assert (NULL != (target_friend =
+                            GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                               
&successor->finger_identity)));
+    GDS_NEIGHBOURS_send_verify_successor_message (my_identity,
+                                                  successor->finger_identity,
+                                                  trail_id, NULL, 0,
+                                                  target_friend);
+  }
+}
+
+
+/**
+ * FIXME: should this be a periodic task, incrementing the search finger index?
+ * Update the current search finger index.
+ * @a finger_identity
+ * @a finger_table_index
+ */
+static void
+update_current_search_finger_index (unsigned int finger_table_index)
+{
+  struct FingerInfo *successor;
+
+  /* FIXME correct this: only move current index periodically */
+  if (finger_table_index != current_search_finger_index)
+    return;
+
+  successor = &finger_table[0];
+  GNUNET_assert (GNUNET_YES == successor->is_present);
+
+  /* We were looking for immediate successor.  */
+  if (0 == current_search_finger_index)
+  {
+    current_search_finger_index = PREDECESSOR_FINGER_ID;
+    if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity, 
&successor->finger_identity))
+    {
+      if (NULL == send_verify_successor_task)
+      {
+        send_verify_successor_task =
+                GNUNET_SCHEDULER_add_now (&send_verify_successor_message, 
NULL);
+      }
+    }
+    return;
+  }
+
+  current_search_finger_index = current_search_finger_index - 1;
+  return;
+}
+
+
+/**
+ * Get the least significant bit set in val.
+ *
+ * @param val Value
+ * @return Position of first bit set, 65 in case of error.
+ */
+static unsigned int
+find_set_bit (uint64_t val)
+{
+  uint64_t i;
+  unsigned int pos;
+
+  i = 1;
+  pos = 0;
+
+  while (!(i & val))
+  {
+    i = i << 1;
+    pos++;
+    if (pos > 63)
+    {
+      GNUNET_break (0);
+      return 65;
+    }
+  }
+
+  if (val/i != 1)
+    return 65; /* Some other bit was set to 1 as well. */
+
+  return pos;
+}
+
+
+/**
+ * Calculate finger_table_index from initial 64 bit finger identity value that
+ * we send in trail setup message.
+ * @param ultimate_destination_finger_value Value that we calculated from our
+ *                                          identity and finger_table_index.
+ * @param is_predecessor Is the entry for predecessor or not?
+ * @return finger_table_index Value between 0 <= finger_table_index <= 64
+ *         finger_table_index > PREDECESSOR_FINGER_ID, if error occurs.
+ */
+static unsigned int
+get_finger_table_index (uint64_t ultimate_destination_finger_value,
+                        unsigned int is_predecessor)
+{
+  uint64_t my_id64;
+  uint64_t diff;
+  unsigned int finger_table_index;
+
+  memcpy (&my_id64, &my_identity, sizeof (uint64_t));
+  my_id64 = GNUNET_ntohll (my_id64);
+
+  /* Is this a predecessor finger? */
+  if (1 == is_predecessor)
+  {
+    diff =  my_id64 - ultimate_destination_finger_value;
+    if (1 == diff)
+      finger_table_index = PREDECESSOR_FINGER_ID;
+    else
+      finger_table_index = PREDECESSOR_FINGER_ID + 1; //error value
+
+  }
+  else
+  {
+    diff = ultimate_destination_finger_value - my_id64;
+    finger_table_index = find_set_bit (diff);
+  }
+  return finger_table_index;
+}
+
+
+/**
+ * Remove finger and its associated data structures from 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.
+ */
+static void
+remove_existing_finger (struct FingerInfo *existing_finger,
+                        unsigned int finger_table_index)
+{
+  GNUNET_assert (GNUNET_YES == existing_finger->is_present);
+
+  /* If I am my own finger, then we have no trails. */
+  if (0 == GNUNET_CRYPTO_cmp_peer_identity (&existing_finger->finger_identity,
+                                            &my_identity))
+  {
+    existing_finger->is_present = GNUNET_NO;
+    memset ((void *)&finger_table[finger_table_index], 0,
+            sizeof (finger_table[finger_table_index]));
+    return;
+  }
+
+  /* For all other fingers, send trail teardown across all the trails to reach
+   finger, and free the finger. */
+  send_all_finger_trails_teardown (existing_finger);
+  free_finger (existing_finger, finger_table_index);
+}
+
+
+/**
+ * Check if there is already an entry in finger_table at finger_table_index.
+ * We get the finger_table_index from 64bit finger value we got from the 
network.
+ * -- If yes, then select the closest finger.
+ *   -- If new and existing finger are same, then check if you can store more
+ *      trails.
+ *      -- If yes then add trail, else keep the best trails to reach to the
+ *         finger.
+ *   -- If the new finger is closest, remove the existing entry, send trail
+ *      teardown message across all the trails to reach the existing entry.
+ *      Add the new finger.
+ *  -- If new and existing finger are different, and existing finger is closest
+ *     then do nothing.
+ * -- Update current_search_finger_index.
+ * @param finger_identity Peer Identity of new finger
+ * @param finger_trail Trail to reach the new finger
+ * @param finger_trail_length Total number of peers in @a new_finger_trail.
+ * @param is_predecessor Is this entry for predecessor in finger_table?
+ * @param finger_value 64 bit value of finger identity that we got from 
network.
+ * @param finger_trail_id Unique identifier of @finger_trail.
+ */
+static void
+finger_table_add (struct GNUNET_PeerIdentity finger_identity,
+                  const struct GNUNET_PeerIdentity *finger_trail,
+                  unsigned int finger_trail_length,
+                  unsigned int is_predecessor,
+                  uint64_t finger_value,
+                  struct GNUNET_HashCode finger_trail_id)
+{
+  struct FingerInfo *existing_finger;
+  struct GNUNET_PeerIdentity closest_peer;
+  struct FingerInfo *successor;
+  unsigned int finger_table_index;
+
+  /* Get the finger_table_index corresponding to finger_value we got from 
network.*/
+  finger_table_index = get_finger_table_index (finger_value, is_predecessor);
+
+  /* Invalid finger_table_index. */
+  if ((finger_table_index > PREDECESSOR_FINGER_ID))
+  {
+    GNUNET_break_op (0);
+    return;
+  }
+
+  /* Check if  new entry is same as successor. */
+  if ((0 != finger_table_index) &&
+      (PREDECESSOR_FINGER_ID != finger_table_index))
+  {
+    successor = &finger_table[0];
+    if (GNUNET_NO == successor->is_present)
+    {
+      GNUNET_break (0); //ASSERTION FAILS HERE. FIXME
+      return;
+    }
+    if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
+                                              &successor->finger_identity))
+    {
+      if (0 == fingers_round_count)
+      {
+         find_finger_trail_task_next_send_time =
+              GNUNET_TIME_STD_BACKOFF(find_finger_trail_task_next_send_time);
+      }
+      else
+        fingers_round_count--;
+      current_search_finger_index = 0;
+      GNUNET_STATISTICS_update (GDS_stats,
+                                gettext_noop
+                                ("# FINGERS_COUNT"), (int64_t) 
total_fingers_found,
+                                GNUNET_NO);
+      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,
+                                              &prev_finger.finger_identity))
+    {
+       current_search_finger_index--;
+       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. */
+    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;
+  }
+
+  /* If existing entry and finger identity are not same. */
+  if (0 != GNUNET_CRYPTO_cmp_peer_identity 
(&(existing_finger->finger_identity),
+                                            &finger_identity))
+  {
+    closest_peer = select_closest_peer (&existing_finger->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))
+    {
+      remove_existing_finger (existing_finger, finger_table_index);
+      add_new_finger (finger_identity, finger_trail, finger_trail_length,
+                      finger_trail_id, finger_table_index);
+    }
+    else
+    {
+      /* Existing finger is the closest one. We need to send trail teardown
+         across the trail setup in routing table of all the peers. */
+      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_ROUTING_SRC_TO_DEST,
+                                              &finger_trail[0]);
+        else
+          GDS_NEIGHBOURS_send_trail_teardown (&finger_trail_id,
+                                              GDS_ROUTING_SRC_TO_DEST,
+                                              &finger_identity);
+      }
+    }
+  }
+  else
+  {
+    /* If both new and existing entry are same as my_identity, then do 
nothing. */
+    if (0 == GNUNET_CRYPTO_cmp_peer_identity 
(&(existing_finger->finger_identity),
+                                              &my_identity))
+    {
+      return;
+    }
+
+    /* If there is space to store more trails. */
+    if (existing_finger->trails_count < MAXIMUM_TRAILS_PER_FINGER)
+        add_new_trail (existing_finger, finger_trail,
+                       finger_trail_length, finger_trail_id);
+    else
+        select_and_replace_trail (existing_finger, finger_trail,
+                                  finger_trail_length, finger_trail_id);
+  }
+  update_current_search_finger_index (finger_table_index);
+  return;
+}
+
+
+/**
+ * Core handler for P2P put messages.
+ * @param cls closure
+ * @param peer sender of the request
+ * @param message message
+ * @return #GNUNET_OK to keep the connection open,
+ *         #GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_dht_p2p_put (void *cls, const struct GNUNET_PeerIdentity *peer,
+                    const struct GNUNET_MessageHeader *message)
+{
+  struct PeerPutMessage *put;
+  struct GNUNET_PeerIdentity *put_path;
+  struct GNUNET_PeerIdentity current_best_known_dest;
+  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_routing_hop;
+  enum GNUNET_DHT_RouteOption options;
+  struct GNUNET_HashCode test_key;
+  void *payload;
+  size_t msize;
+  uint32_t putlen;
+  uint32_t hop_count;
+  size_t payload_size;
+  uint64_t key_value;
+
+  msize = ntohs (message->size);
+  if (msize < sizeof (struct PeerPutMessage))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+
+  put = (struct PeerPutMessage *) message;
+  putlen = ntohl (put->put_path_length);
+  if ((msize <
+       sizeof (struct PeerPutMessage) +
+       putlen * sizeof (struct GNUNET_PeerIdentity)) ||
+      (putlen >
+       GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct 
GNUNET_PeerIdentity)))
+  {
+    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];
+  options = ntohl (put->options);
+  received_intermediate_trail_id = put->intermediate_trail_id;
+  hop_count = ntohl(put->hop_count);
+  payload_size = msize - (sizeof (struct PeerPutMessage) +
+                          putlen * sizeof (struct GNUNET_PeerIdentity));
+  hop_count++;
+  switch (GNUNET_BLOCK_get_key (GDS_block_context, ntohl (put->block_type),
+                                payload, payload_size, &test_key))
+  {
+    case GNUNET_YES:
+      if (0 != memcmp (&test_key, &put->key, sizeof (struct GNUNET_HashCode)))
+      {
+        char *put_s = GNUNET_strdup (GNUNET_h2s_full (&put->key));
+        GNUNET_break_op (0);
+        GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                    "PUT with key `%s' for block with key %s\n",
+                     put_s, GNUNET_h2s_full (&test_key));
+        GNUNET_free (put_s);
+        return GNUNET_OK;
+      }
+    break;
+    case GNUNET_NO:
+      GNUNET_break_op (0);
+      return GNUNET_OK;
+    case GNUNET_SYSERR:
+      /* cannot verify, good luck */
+      break;
+  }
+
+   if (ntohl (put->block_type) == GNUNET_BLOCK_TYPE_REGEX) /* FIXME: do for 
all tpyes */
+  {
+    switch (GNUNET_BLOCK_evaluate (GDS_block_context,
+                                   ntohl (put->block_type),
+                                   GNUNET_BLOCK_EO_NONE,
+                                   NULL,    /* query */
+                                   NULL, 0, /* bloom filer */
+                                   NULL, 0, /* xquery */
+                                   payload, payload_size))
+    {
+    case GNUNET_BLOCK_EVALUATION_OK_MORE:
+    case GNUNET_BLOCK_EVALUATION_OK_LAST:
+      break;
+
+    case GNUNET_BLOCK_EVALUATION_OK_DUPLICATE:
+    case GNUNET_BLOCK_EVALUATION_RESULT_INVALID:
+    case GNUNET_BLOCK_EVALUATION_RESULT_IRRELEVANT:
+    case GNUNET_BLOCK_EVALUATION_REQUEST_VALID:
+    case GNUNET_BLOCK_EVALUATION_REQUEST_INVALID:
+    case GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED:
+    default:
+      GNUNET_break_op (0);
+      return GNUNET_OK;
+    }
+  }
+
+  /* Check if you are already a part of put path. */
+  unsigned int i;
+  for (i = 0; i < putlen; i++)
+  {
+    if(0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &put_path[i]))
+    {
+      putlen = i;
+      break;
+    }
+  }
+
+  /* Add yourself to the list. */
+  struct GNUNET_PeerIdentity pp[putlen + 1];
+  //if (0 != (options & GNUNET_DHT_RO_RECORD_ROUTE))
+  if (1)
+  {
+    memcpy (pp, put_path, putlen * sizeof (struct GNUNET_PeerIdentity));
+    pp[putlen] = my_identity;
+    putlen++;
+  }
+  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,
+                                              GDS_FINGER_TYPE_NON_PREDECESSOR);
+  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;
+      intermediate_trail_id = received_intermediate_trail_id;
+      best_known_dest = current_best_known_dest;
+    }
+  }
+
+  GDS_CLIENTS_process_put (options,
+                           ntohl (put->block_type),
+                           hop_count,
+                           ntohl (put->desired_replication_level),
+                           putlen, pp,
+                           GNUNET_TIME_absolute_ntoh (put->expiration_time),
+                           &put->key,
+                           payload,
+                           payload_size);
+
+  /* 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
+  {
+#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;
+}
+
+
+/**
+ * FIXME: Check for loop in the request. If you already are part of get path,
+ * then you need to reset the get path length.
+ * Core handler for p2p get requests.
+ *
+ * @param cls closure
+ * @param peer sender of the request
+ * @param message message
+ * @return #GNUNET_OK to keep the connection open,
+ *         #GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_dht_p2p_get (void *cls, const struct GNUNET_PeerIdentity *peer,
+                    const struct GNUNET_MessageHeader *message)
+{
+  const struct PeerGetMessage *get;
+  const struct GNUNET_PeerIdentity *get_path;
+  struct GNUNET_PeerIdentity best_known_dest;
+  struct GNUNET_PeerIdentity current_best_known_dest;
+  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_routing_hop;
+  uint32_t get_length;
+  uint64_t key_value;
+  uint32_t hop_count;
+  size_t msize;
+
+  msize = ntohs (message->size);
+  if (msize < sizeof (struct PeerGetMessage))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_YES;
+  }
+
+  get = (const struct PeerGetMessage *)message;
+  get_length = ntohl (get->get_path_length);
+  if ((msize <
+       sizeof (struct PeerGetMessage) +
+       get_length * sizeof (struct GNUNET_PeerIdentity)) ||
+       (get_length >
+        GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct 
GNUNET_PeerIdentity)))
+  {
+    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++)
+  {
+    if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &get_path[i]))
+    {
+      get_length = i;
+      break;
+    }
+  }
+
+  /* Add yourself in the get path. */
+  struct GNUNET_PeerIdentity gp[get_length + 1];
+  memcpy (gp, get_path, get_length * sizeof (struct GNUNET_PeerIdentity));
+  gp[get_length] = my_identity;
+  get_length = get_length + 1;
+  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,
+                                                
GDS_FINGER_TYPE_NON_PREDECESSOR);
+  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. */
+  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;
+      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],
+                                &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,
+                             get_length, gp);
+  }
+  return GNUNET_YES;
+}
+
+
+/**
+ * Core handler for get result
+ * @param cls closure
+ * @param peer sender of the request
+ * @param message message
+ * @return #GNUNET_OK to keep the connection open,
+ *         #GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_dht_p2p_get_result (void *cls, const struct GNUNET_PeerIdentity *peer,
+                           const struct GNUNET_MessageHeader *message)
+{
+  const struct PeerGetResultMessage *get_result;
+  const struct GNUNET_PeerIdentity *get_path;
+  const struct GNUNET_PeerIdentity *put_path;
+  const void *payload;
+  size_t payload_size;
+  size_t msize;
+  unsigned int getlen;
+  unsigned int putlen;
+  int current_path_index;
+
+  msize = ntohs (message->size);
+  if (msize < sizeof (struct PeerGetResultMessage))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_YES;
+  }
+
+  get_result = (const struct PeerGetResultMessage *)message;
+  getlen = ntohl (get_result->get_path_length);
+  putlen = ntohl (get_result->put_path_length);
+
+  if ((msize <
+       sizeof (struct PeerGetResultMessage) +
+       getlen * sizeof (struct GNUNET_PeerIdentity) +
+       putlen * sizeof (struct GNUNET_PeerIdentity)) ||
+      (getlen >
+       GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct 
GNUNET_PeerIdentity) ||
+      (putlen >
+         GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct 
GNUNET_PeerIdentity))))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_YES;
+  }
+  DEBUG("GET_RESULT  FOR DATA_SIZE = %lu\n",msize);
+  GNUNET_STATISTICS_update (GDS_stats,
+                            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];
+  payload_size = msize - (sizeof (struct PeerGetResultMessage) +
+                         (getlen + putlen) * sizeof (struct 
GNUNET_PeerIdentity));
+
+  if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &(get_path[0]))))
+  {
+    GDS_CLIENTS_handle_reply (get_result->expiration_time, &(get_result->key),
+                              getlen, get_path, putlen,
+                              put_path, get_result->type, payload_size, 
payload);
+    return GNUNET_YES;
+  }
+  else
+  {
+    current_path_index = search_my_index (get_path, getlen);
+    if (-1 == current_path_index )
+    {
+      DEBUG ("No entry found in get path.\n");
+      GNUNET_break (0);
+      return GNUNET_SYSERR;
+    }
+    if((getlen + 1) == current_path_index)
+    {
+      DEBUG("Present twice in get path. Not allowed. \n");
+      GNUNET_break (0);
+      return GNUNET_SYSERR;
+    }
+    GDS_NEIGHBOURS_send_get_result (&(get_result->key), get_result->type,
+                                    &get_path[current_path_index - 1],
+                                    &(get_result->querying_peer), putlen, 
put_path,
+                                    getlen, get_path, 
get_result->expiration_time,
+                                    payload, payload_size);
+    return GNUNET_YES;
+  }
+  return GNUNET_SYSERR;
+}
+
+
+/**
+ * Find the next hop to pass trail setup message. First find the local best 
known
+ * hop from your own identity, friends and finger. If you were part of trail,
+ * then get the next hop from routing table. Compare next_hop from routing 
table
+ * and local best known hop, and return the closest one to 
final_dest_finger_val
+ * @param final_dest_finger_val 64 bit value of finger identity
+ * @param intermediate_trail_id If you are part of trail to reach to some other
+ *                              finger, then it is the trail id to reach to
+ *                              that finger, else set to 0.
+ * @param is_predecessor Are we looking for closest successor or predecessor.
+ * @param source Source of trail setup message.
+ * @param current_dest In case you are part of trail, then finger to which
+ *                     we should forward the message. Else my own identity
+ * @return Closest Peer for @a final_dest_finger_val
+ */
+static struct Closest_Peer
+get_local_best_known_next_hop (uint64_t final_dest_finger_val,
+                               struct GNUNET_HashCode intermediate_trail_id,
+                               unsigned int is_predecessor,
+                               struct GNUNET_PeerIdentity source,
+                               struct GNUNET_PeerIdentity *current_dest)
+{
+  struct Closest_Peer peer;
+
+  peer = find_local_best_known_next_hop (final_dest_finger_val, 
is_predecessor);
+
+  /* Am I just a part of a trail towards a finger (current_destination)? */
+  if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity, current_dest) &&
+      0 != GNUNET_CRYPTO_cmp_peer_identity (&peer.best_known_destination,
+                                            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,
+                                        current_dest,
+                                        final_dest_finger_val,
+                                        is_predecessor);
+
+    /* Is current dest (end point of the trail of which I am a part) 
closest_peer? */
+    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
+       some other finger, and while this trail setup is in progress, that other
+       peer might have found a better trail ,and send trail teardown message
+       across the network. In case we got the trail teardown message first,
+       then next_hop will be NULL. A possible solution could be to keep track
+       * of all removed trail id, and be sure that there is no other reason . 
*/
+      if(NULL != next_hop)
+      {
+         peer.next_hop = *next_hop;
+         peer.best_known_destination =  *current_dest;
+         peer.trail_id = intermediate_trail_id;
+      }
+    }
+  }
+  return peer;
+}
+
+
+/*
+ * Core handle for PeerTrailSetupMessage.
+ * @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_setup (void *cls, const struct GNUNET_PeerIdentity *peer,
+                            const struct GNUNET_MessageHeader *message)
+{
+  const struct PeerTrailSetupMessage *trail_setup;
+  const struct GNUNET_PeerIdentity *trail_peer_list;
+  struct GNUNET_PeerIdentity current_dest;
+  struct FriendInfo *target_friend;
+  struct GNUNET_PeerIdentity source;
+  struct GNUNET_HashCode intermediate_trail_id;
+  struct GNUNET_HashCode trail_id;
+  unsigned int is_predecessor;
+  uint32_t trail_length;
+  uint64_t final_dest_finger_val;
+  int i;
+  size_t msize;
+
+  msize = ntohs (message->size);
+  if (msize < sizeof (struct PeerTrailSetupMessage))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
+
+  trail_setup = (const struct PeerTrailSetupMessage *) message;
+  if ((msize - sizeof (struct PeerTrailSetupMessage)) %
+      sizeof (struct GNUNET_PeerIdentity) != 0)
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+  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;
+  final_dest_finger_val =
+          GNUNET_ntohll (trail_setup->final_destination_finger_value);
+  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)))
+  {
+    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;
+      break;
+    }
+  }
+
+  /* Is my routing table full?  */
+  if (GNUNET_YES == GDS_ROUTING_threshold_reached())
+  {
+    if (trail_length > 0)
+      target_friend =
+                   GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                      
&trail_peer_list[trail_length - 1]);
+    else
+      target_friend =
+                   GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                      &source);
+    if(NULL == target_friend)
+    {
+      DEBUG ("\n friend not found");
+      GNUNET_break(0);
+      return GNUNET_OK;
+    }
+    GDS_NEIGHBOURS_send_trail_rejection (source, final_dest_finger_val,
+                                         my_identity, is_predecessor,
+                                         trail_peer_list, trail_length,
+                                         trail_id, target_friend,
+                                         CONGESTION_TIMEOUT);
+    return GNUNET_OK;
+  }
+
+  /* Get the next hop to forward the trail setup request. */
+  struct Closest_Peer next_peer =
+          get_local_best_known_next_hop (final_dest_finger_val,
+                                         intermediate_trail_id,
+                                         is_predecessor,
+                                         source,
+                                         &current_dest);
+
+  /* Am I the final destination? */
+  if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&next_peer.best_known_destination,
+                                             &my_identity)))
+  {
+    if(0 == GNUNET_CRYPTO_cmp_peer_identity (&source, &my_identity))
+    {
+      finger_table_add (my_identity, NULL, 0, is_predecessor,
+                        final_dest_finger_val, trail_id);
+      return GNUNET_OK;
+    }
+
+    if (trail_length > 0)
+      target_friend =
+              GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                 
&trail_peer_list[trail_length-1]);
+    else
+      target_friend =
+              GNUNET_CONTAINER_multipeermap_get (friend_peermap, &source);
+    if (NULL == target_friend)
+    {
+      GNUNET_break_op (0);
+      return GNUNET_SYSERR;
+    }
+    GDS_ROUTING_add (trail_id, target_friend->id, my_identity);
+    GDS_NEIGHBOURS_send_trail_setup_result (source,
+                                            my_identity,
+                                            target_friend, trail_length,
+                                            trail_peer_list,
+                                            is_predecessor,
+                                            final_dest_finger_val,trail_id);
+  }
+  else /* I'm not the final destination. */
+  {
+    target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                       &next_peer.next_hop);
+    if(NULL == target_friend)
+    {
+      DEBUG ("\n target friend not found for peer = %s", 
GNUNET_i2s(&next_peer.next_hop));
+      GNUNET_break (0);
+      return GNUNET_OK;
+    }
+    if (0 != GNUNET_CRYPTO_cmp_peer_identity(&my_identity, &source))
+    {
+      /* Add yourself to list of peers. */
+      struct GNUNET_PeerIdentity peer_list[trail_length + 1];
+
+      memcpy (peer_list, trail_peer_list,
+              trail_length * sizeof (struct GNUNET_PeerIdentity));
+      peer_list[trail_length] = my_identity;
+      GDS_NEIGHBOURS_send_trail_setup (source,
+                                       final_dest_finger_val,
+                                       next_peer.best_known_destination,
+                                       target_friend, trail_length + 1, 
peer_list,
+                                       is_predecessor, trail_id,
+                                       next_peer.trail_id);
+    }
+    else
+        GDS_NEIGHBOURS_send_trail_setup (source,
+                                         final_dest_finger_val,
+                                         next_peer.best_known_destination,
+                                         target_friend, 0, NULL,
+                                         is_predecessor, trail_id,
+                                         next_peer.trail_id);
+  }
+  return GNUNET_OK;
+}
+
+
+/**
+ * Core handle for p2p trail setup result messages.
+ * @param closure
+ * @param message message
+ * @param peer sender of this message.
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_trail_setup_result(void *cls, const struct GNUNET_PeerIdentity 
*peer,
+                                  const struct GNUNET_MessageHeader *message)
+{
+  const struct PeerTrailSetupResultMessage *trail_result;
+  const struct GNUNET_PeerIdentity *trail_peer_list;
+  struct GNUNET_PeerIdentity next_hop;
+  struct FriendInfo *target_friend;
+  struct GNUNET_PeerIdentity querying_peer;
+  struct GNUNET_PeerIdentity finger_identity;
+  uint32_t trail_length;
+  uint64_t ulitmate_destination_finger_value;
+  uint32_t is_predecessor;
+  struct GNUNET_HashCode trail_id;
+  int my_index;
+  size_t msize;
+
+  msize = ntohs (message->size);
+  if (msize < sizeof (struct PeerTrailSetupResultMessage))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_YES;
+  }
+
+  trail_result = (const struct PeerTrailSetupResultMessage *) message;
+  if ((msize - sizeof (struct PeerTrailSetupResultMessage)) %
+      sizeof (struct GNUNET_PeerIdentity) != 0)
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+  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;
+  trail_id = trail_result->trail_id;
+  trail_peer_list = (const struct GNUNET_PeerIdentity *) &trail_result[1];
+  ulitmate_destination_finger_value =
+          GNUNET_ntohll (trail_result->ulitmate_destination_finger_value);
+
+  /* Am I the one who initiated the query? */
+  if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&querying_peer, &my_identity)))
+  {
+    /* Check that you got the message from the correct peer. */
+    if (trail_length > 0)
+    {
+      GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&trail_peer_list[0],
+                                                          peer));
+    }
+    else
+    {
+      GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
+                                                          peer));
+    }
+    GDS_ROUTING_add (trail_id, my_identity, *peer);
+    finger_table_add (finger_identity, trail_peer_list, trail_length,
+                      is_predecessor, ulitmate_destination_finger_value, 
trail_id);
+    return GNUNET_YES;
+  }
+
+  /* Get my location in the trail. */
+  my_index = search_my_index (trail_peer_list, trail_length);
+  if (-1 == my_index)
+  {
+    DEBUG ("Not found in trail\n");
+    GNUNET_break_op(0);
+    return GNUNET_SYSERR;
+  }
+  //TODO; return -2.
+  if ((trail_length + 1) == my_index)
+  {
+    DEBUG ("Found twice in trail.\n");
+    GNUNET_break_op(0);
+    return GNUNET_SYSERR;
+  }
+
+  //TODO; Refactor code here and above to check if sender peer is correct
+  if (my_index == 0)
+  {
+    if(trail_length > 1)
+      GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&trail_peer_list[1],
+                                                          peer));
+    else
+      GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
+                                                          peer));
+    next_hop = trail_result->querying_peer;
+  }
+  else
+  {
+    if(my_index == trail_length - 1)
+    {
+      GNUNET_assert(0 ==
+                    GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
+                                                     peer));
+    }
+    else
+      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)
+  {
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
+  GDS_ROUTING_add (trail_id, next_hop, *peer);
+  GDS_NEIGHBOURS_send_trail_setup_result (querying_peer, finger_identity,
+                                          target_friend, trail_length, 
trail_peer_list,
+                                          is_predecessor,
+                                          ulitmate_destination_finger_value,
+                                          trail_id);
+  return GNUNET_OK;
+}
+
+
+/**
+ * Invert the trail.
+ * @param trail Trail to be inverted
+ * @param trail_length Total number of peers in the trail.
+ * @return Updated trail
+ */
+static struct GNUNET_PeerIdentity *
+invert_trail (const struct GNUNET_PeerIdentity *trail,
+              unsigned int trail_length)
+{
+  int i;
+  int j;
+  struct GNUNET_PeerIdentity *inverted_trail;
+
+  inverted_trail = GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity) *
+                                  trail_length);
+  i = 0;
+  j = trail_length - 1;
+  while (i < trail_length)
+  {
+    inverted_trail[i] = trail[j];
+    i++;
+    j--;
+  }
+
+  GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
+                                                          &inverted_trail[0]));
+  return inverted_trail;
+}
+
+
+/**
+ * Return the shortest trail among all the trails to reach to finger from me.
+ * @param finger Finger
+ * @param shortest_trail_length[out] Trail length of shortest trail from me
+ *                                   to @a finger
+ * @return Shortest trail.
+ */
+static struct GNUNET_PeerIdentity *
+get_shortest_trail (struct FingerInfo *finger,
+                    unsigned int *trail_length)
+{
+  struct Trail *trail;
+  unsigned int flag = 0;
+  unsigned int shortest_trail_index = 0;
+  int shortest_trail_length = -1;
+  struct Trail_Element *trail_element;
+  struct GNUNET_PeerIdentity *trail_list;
+  unsigned int i;
+
+  /* Get the shortest trail to reach to current successor. */
+  for (i = 0; i < finger->trails_count; i++)
+  {
+    trail = &finger->trail_list[i];
+
+    if (0 == flag)
+    {
+      shortest_trail_index = i;
+      shortest_trail_length = trail->trail_length;
+      flag = 1;
+      continue;
+    }
+
+    if (shortest_trail_length > trail->trail_length)
+    {
+      shortest_trail_index = i;
+      shortest_trail_length = trail->trail_length;
+    }
+    continue;
+  }
+
+  /* Copy the shortest trail and return. */
+  trail = &finger->trail_list[shortest_trail_index];
+  trail_element = trail->trail_head;
+
+  trail_list = GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity)*
+                              shortest_trail_length);
+
+  for(i = 0; i < shortest_trail_length; i++,trail_element = 
trail_element->next)
+  {
+    trail_list[i] = trail_element->peer;
+  }
+
+  GNUNET_assert(shortest_trail_length != -1);
+
+  *trail_length = shortest_trail_length;
+  return trail_list;
+}
+
+
+/**
+ * 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.
+ * @param trail_2_len Total number of peers @a trail_2
+ * @param joined_trail_len Total number of peers in combined trail of trail_1
+ *                          trail_2.
+ * @return Joined trail.
+ */
+static struct GNUNET_PeerIdentity *
+check_for_duplicate_entries (const struct GNUNET_PeerIdentity *trail_1,
+                             unsigned int trail_1_len,
+                             struct GNUNET_PeerIdentity *trail_2,
+                             unsigned int trail_2_len,
+                             unsigned int *joined_trail_len)
+{
+  struct GNUNET_PeerIdentity *joined_trail;
+  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 *
+                                    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))
+      {
+        joined_trail[k] = trail_2[j];
+        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 *
+                                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;
+}
+
+
+/**
+ * Return the trail from source to my current predecessor. Check if source
+ * is already part of the this trail, if yes then return the shorten trail.
+ * @param current_trail Trail from source to me, NOT including the endpoints.
+ * @param current_trail_length Number of peers in @a current_trail.
+ * @param trail_src_to_curr_pred_length[out] Number of peers in trail from
+ *                                           source to my predecessor, NOT 
including
+ *                                           the endpoints.
+ * @return Trail from source to my predecessor.
+ */
+static struct GNUNET_PeerIdentity *
+get_trail_src_to_curr_pred (struct GNUNET_PeerIdentity source_peer,
+                            const struct GNUNET_PeerIdentity *trail_src_to_me,
+                            unsigned int trail_src_to_me_len,
+                            unsigned int *trail_src_to_curr_pred_length)
+{
+  struct GNUNET_PeerIdentity *trail_me_to_curr_pred;
+  struct GNUNET_PeerIdentity *trail_src_to_curr_pred;
+  unsigned int trail_me_to_curr_pred_length;
+  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;
+
+
+    *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++)
+       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++;
+
+    /* 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;
+  }
+
+  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);
+  *trail_src_to_curr_pred_length = len;
+  GNUNET_free_non_null(trail_me_to_curr_pred);
+  return trail_src_to_curr_pred;
+}
+
+
+/**
+ * Add finger as your predecessor. To add, first generate a new trail id, 
invert
+ * the trail to get the trail from me to finger, add an entry in your routing
+ * table, send add trail message to peers which are part of trail from me to
+ * finger and add finger in finger table.
+ * @param finger
+ * @param trail
+ * @param trail_length
+ */
+static void
+update_predecessor (struct GNUNET_PeerIdentity finger,
+                    struct GNUNET_PeerIdentity *trail,
+                    unsigned int trail_length)
+{
+  struct GNUNET_HashCode trail_to_new_predecessor_id;
+  struct GNUNET_PeerIdentity *trail_to_new_predecessor;
+  struct FriendInfo *target_friend;
+
+  /* Generate trail id for trail from me to new predecessor = finger. */
+  GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
+                              &trail_to_new_predecessor_id,
+                              sizeof (trail_to_new_predecessor_id));
+
+  if (0 == trail_length)
+  {
+    trail_to_new_predecessor = NULL;
+    GDS_ROUTING_add (trail_to_new_predecessor_id, my_identity, finger);
+    target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, 
&finger);
+    if (NULL == target_friend)
+    {
+      GNUNET_break (0);
+      return;
+    }
+  }
+  else
+  {
+    /* Invert the trail to get the trail from me to finger, NOT including the
+       endpoints.*/
+    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,
+                     trail_to_new_predecessor[0]);
+
+    GNUNET_assert (NULL != (target_friend =
+                   GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                      
&trail_to_new_predecessor[0])));
+  }
+
+  /* Add entry in routing table of all peers that are part of trail from me
+     to finger, including finger. */
+  GDS_NEIGHBOURS_send_add_trail (my_identity,
+                                 finger,
+                                 trail_to_new_predecessor_id,
+                                 trail_to_new_predecessor,
+                                 trail_length,
+                                 target_friend);
+
+  add_new_finger (finger, trail_to_new_predecessor, trail_length,
+                  trail_to_new_predecessor_id, PREDECESSOR_FINGER_ID);
+  GNUNET_free_non_null(trail_to_new_predecessor);
+}
+
+
+/*
+ * Check if you already have a predecessor. If not then add finger as your
+ * predecessor. If you have predecessor, then compare two peer identites.
+ * If finger is correct predecessor, then remove the old entry, add finger in
+ * finger table and send add_trail message to add the trail in the routing
+ * table of all peers which are part of trail to reach from me to finger.
+ * @param finger New peer which may be our predecessor.
+ * @param trail List of peers to reach from @finger to me.
+ * @param trail_length Total number of peer in @a trail.
+ */
+static void
+compare_and_update_predecessor (struct GNUNET_PeerIdentity finger,
+                                struct GNUNET_PeerIdentity *trail,
+                                unsigned int trail_length)
+{
+  struct FingerInfo *current_predecessor;
+  struct GNUNET_PeerIdentity closest_peer;
+  uint64_t predecessor_value;
+  unsigned int is_predecessor = 1;
+
+  current_predecessor = &finger_table[PREDECESSOR_FINGER_ID];
+  GNUNET_assert (0 != GNUNET_CRYPTO_cmp_peer_identity (&finger, &my_identity));
+
+  /* No predecessor. Add finger as your predecessor. */
+  if (GNUNET_NO == current_predecessor->is_present)
+  {
+    update_predecessor (finger, trail, trail_length);
+    return;
+  }
+
+  if (0 == GNUNET_CRYPTO_cmp_peer_identity 
(&current_predecessor->finger_identity,
+                                            &finger))
+  {
+    return;
+  }
+
+  predecessor_value = compute_finger_identity_value (PREDECESSOR_FINGER_ID);
+  closest_peer = select_closest_peer (&finger,
+                                      &current_predecessor->finger_identity,
+                                      predecessor_value, is_predecessor);
+
+  /* Finger is the closest predecessor. Remove the existing one and add the new
+     one. */
+  if (0 == GNUNET_CRYPTO_cmp_peer_identity(&closest_peer, &finger))
+  {
+    remove_existing_finger (current_predecessor, PREDECESSOR_FINGER_ID);
+    update_predecessor (finger, trail, trail_length);
+    return;
+  }
+  return;
+}
+
+
+/*
+ * Core handle for p2p verify successor 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_verify_successor(void *cls,
+                                const struct GNUNET_PeerIdentity *peer,
+                                const struct GNUNET_MessageHeader *message)
+{
+  const struct PeerVerifySuccessorMessage *vsm;
+  struct GNUNET_HashCode trail_id;
+  struct GNUNET_PeerIdentity successor;
+  struct GNUNET_PeerIdentity source_peer;
+  struct GNUNET_PeerIdentity *trail;
+  struct GNUNET_PeerIdentity *next_hop;
+  struct FingerInfo current_predecessor;
+  struct FriendInfo *target_friend;
+  unsigned int trail_src_to_curr_pred_len = 0;
+  struct GNUNET_PeerIdentity *trail_src_to_curr_pred;
+  unsigned int trail_length;
+  size_t msize;
+
+  msize = ntohs (message->size);
+
+  if (msize < sizeof (struct PeerVerifySuccessorMessage))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_YES;
+  }
+
+  vsm = (const struct PeerVerifySuccessorMessage *) message;
+  trail_length = (msize - sizeof (struct PeerVerifySuccessorMessage))/
+                  sizeof (struct GNUNET_PeerIdentity);
+  if ((msize - sizeof (struct PeerVerifySuccessorMessage)) %
+      sizeof (struct GNUNET_PeerIdentity) != 0)
+  {
+    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);
+    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);
+      return GNUNET_OK;
+    }
+    GDS_NEIGHBOURS_send_verify_successor_message (source_peer, successor,
+                                                  trail_id, trail, 
trail_length,
+                                                  target_friend);
+    return GNUNET_OK;
+  }
+
+  /* I am the destination of this message. */
+
+  /* Check if the source_peer could be our predecessor and if yes then update
+   * 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 =
+              get_trail_src_to_curr_pred (source_peer,
+                                          trail,
+                                          trail_length,
+                                          &trail_src_to_curr_pred_len);
+  }
+  else
+  {
+    trail_src_to_curr_pred_len = trail_length;
+    unsigned int i;
+
+    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++)
+    {
+      trail_src_to_curr_pred[i] = trail[i];
+    }
+  }
+
+  GNUNET_assert (NULL !=
+                (target_friend =
+                 GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer)));
+  GDS_NEIGHBOURS_send_verify_successor_result (source_peer, my_identity,
+                                               
current_predecessor.finger_identity,
+                                               trail_id, 
trail_src_to_curr_pred,
+                                               trail_src_to_curr_pred_len,
+                                               GDS_ROUTING_DEST_TO_SRC,
+                                               target_friend);
+  GNUNET_free_non_null(trail_src_to_curr_pred);
+  return GNUNET_OK;
+}
+
+
+/**
+ * If the trail from me to my probable successor contains a friend not
+ * at index 0, then we can shorten the trail.
+ * @param probable_successor Peer which is our probable successor
+ * @param trail_me_to_probable_successor Peers in path from me to my probable
+ *                                       successor, NOT including the 
endpoints.
+ * @param trail_me_to_probable_successor_len Total number of peers in
+ *                                           @a trail_me_to_probable_succesor.
+ * @return Updated trail, if any friend found.
+ *         Else the trail_me_to_probable_successor.
+ */
+struct GNUNET_PeerIdentity *
+check_trail_me_to_probable_succ (struct GNUNET_PeerIdentity probable_successor,
+                                 const struct GNUNET_PeerIdentity 
*trail_me_to_probable_successor,
+                                 unsigned int 
trail_me_to_probable_successor_len,
+                                 unsigned int *trail_to_new_successor_length)
+{
+  unsigned int i;
+  unsigned int j;
+  struct GNUNET_PeerIdentity *trail_to_new_successor;
+
+  /* Probable successor is  a friend */
+  if (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                 &probable_successor))
+  {
+    trail_to_new_successor = NULL;
+    *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)
+  {
+    for (i = trail_me_to_probable_successor_len - 1; i > 0; i--)
+    {
+      if (NULL == GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                     
&trail_me_to_probable_successor[i]))
+        continue;
+
+      *trail_to_new_successor_length = (trail_me_to_probable_successor_len - 
i);
+      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;
+    }
+  }
+
+  *trail_to_new_successor_length = trail_me_to_probable_successor_len;
+  return (struct GNUNET_PeerIdentity*)trail_me_to_probable_successor;
+}
+
+// TODO: Move up
+struct SendNotifyContext
+{
+  struct GNUNET_PeerIdentity source_peer;
+  struct GNUNET_PeerIdentity successor;
+  struct GNUNET_PeerIdentity *successor_trail;
+  unsigned int successor_trail_length;
+  struct GNUNET_HashCode succesor_trail_id;
+  struct FriendInfo *target_friend;
+  unsigned int num_retries_scheduled;
+};
+
+void
+send_notify_new_successor (void *cls,
+                           const struct GNUNET_SCHEDULER_TaskContext
+                           * tc);
+
+/**
+ * Check if the peer which sent us verify successor result message is still 
ours
+ * successor or not. If not, then compare existing successor and probable 
successor.
+ * In case probable successor is the correct successor, remove the existing
+ * successor. Add probable successor as new successor. Send notify new 
successor
+ * message to new successor.
+ * @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
+ *                           curr_succ
+ * @param trail List of peers to reach from me to @a probable successor, NOT 
including
+ *              endpoints.
+ * @param trail_length Total number of peers in @a trail.
+ */
+static void
+compare_and_update_successor (struct GNUNET_PeerIdentity curr_succ,
+                              struct GNUNET_PeerIdentity probable_successor,
+                              const struct GNUNET_PeerIdentity *trail,
+                              unsigned int trail_length)
+{
+  struct FingerInfo *current_successor;
+  struct GNUNET_PeerIdentity closest_peer;
+  struct GNUNET_HashCode trail_id;
+  struct GNUNET_PeerIdentity *trail_me_to_probable_succ;
+  struct FriendInfo *target_friend;
+  unsigned int trail_me_to_probable_succ_len;
+  unsigned int is_predecessor = 0;
+  uint64_t successor_value;
+
+  current_successor = &finger_table[0];
+  successor_value = compute_finger_identity_value(0);
+
+  /* If probable successor is same as current_successor, do nothing. */
+  if(0 == GNUNET_CRYPTO_cmp_peer_identity (&probable_successor,
+                                           
&current_successor->finger_identity))
+  {
+    if ((NULL != GDS_stats))
+    {
+      char *my_id_str;
+      uint64_t succ;
+      char *key;
+      uint64_t my_id;
+      memcpy (&my_id, &my_identity, sizeof(uint64_t));
+      my_id_str = GNUNET_strdup (GNUNET_i2s_full (&my_identity));
+      memcpy(&succ, &current_successor->finger_identity, sizeof(uint64_t));
+      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 == NULL)
+      send_verify_successor_task =
+              GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
+                                           &send_verify_successor_message,
+                                           NULL);
+    return;
+  }
+  closest_peer = select_closest_peer (&probable_successor,
+                                      &current_successor->finger_identity,
+                                      successor_value, is_predecessor);
+
+  /* If the current_successor in the finger table is closest, then do nothing. 
*/
+  if (0 == GNUNET_CRYPTO_cmp_peer_identity (&closest_peer ,
+                                            
&current_successor->finger_identity))
+  {
+    //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);
+      GNUNET_free (my_id_str);
+      GNUNET_STATISTICS_set (GDS_stats, key, succ, 0);
+      GNUNET_free (key);
+    }
+
+    if(0 == successor_times)
+    {
+//      successor_times = 3;
+      verify_successor_next_send_time =
+              GNUNET_TIME_STD_BACKOFF (verify_successor_next_send_time);
+    }
+    else
+      successor_times--;
+
+
+    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)
+  {
+    GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
+                                                            &trail[0]));
+  }
+  else
+  {
+    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,
+                                           trail, trail_length,
+                                           &trail_me_to_probable_succ_len);
+
+  /* Remove the existing successor. */
+  remove_existing_finger (current_successor, 0);
+   /* Generate a new trail id to reach to your new successor. */
+  GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
+                              &trail_id, sizeof (trail_id));
+
+  if (trail_me_to_probable_succ_len > 0)
+  {
+    GDS_ROUTING_add (trail_id, my_identity, trail_me_to_probable_succ[0]);
+    GNUNET_assert (NULL !=
+                  (target_friend =
+                      GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                        
&trail_me_to_probable_succ[0])));
+  }
+  else
+  {
+    GDS_ROUTING_add (trail_id, my_identity, probable_successor);
+    GNUNET_assert (NULL !=
+                  (target_friend =
+                   GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                      &probable_successor)));
+  }
+
+  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 =
+          GNUNET_malloc(sizeof(struct GNUNET_PeerIdentity) * 
trail_me_to_probable_succ_len);
+  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);
+}
+
+
+
+void
+send_notify_new_successor (void *cls,
+                           const struct GNUNET_SCHEDULER_TaskContext
+                           * tc)
+{
+  struct SendNotifyContext *ctx = (struct SendNotifyContext *) cls;
+
+  GDS_NEIGHBOURS_send_notify_new_successor (ctx->source_peer,
+                                            ctx->successor,
+                                            ctx->successor_trail,
+                                            ctx->successor_trail_length,
+                                            ctx->succesor_trail_id,
+                                            ctx->target_friend);
+
+  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.
+    // We will cancel the retry request.
+    struct SendNotifyContext *old_notify_ctx;
+    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 = NULL;
+  }
+
+  ctx->num_retries_scheduled++;
+  send_notify_new_successor_retry_task = 
GNUNET_SCHEDULER_add_delayed(notify_successor_retry_time,
+                                                                      
&send_notify_new_successor,
+                                                                      cls);
+}
+
+/*
+ * Core handle for p2p verify successor result 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_verify_successor_result(void *cls,
+                                       const struct GNUNET_PeerIdentity *peer,
+                                       const struct GNUNET_MessageHeader 
*message)
+{
+  const struct PeerVerifySuccessorResultMessage *vsrm;
+  enum GDS_ROUTING_trail_direction trail_direction;
+  struct GNUNET_PeerIdentity querying_peer;
+  struct GNUNET_HashCode trail_id;
+  struct GNUNET_PeerIdentity *next_hop;
+  struct FriendInfo *target_friend;
+  struct GNUNET_PeerIdentity probable_successor;
+  struct GNUNET_PeerIdentity current_successor;
+  const struct GNUNET_PeerIdentity *trail;
+  unsigned int trail_length;
+  size_t msize;
+
+  msize = ntohs (message->size);
+  if (msize < sizeof (struct PeerVerifySuccessorResultMessage))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_YES;
+  }
+
+  vsrm = (const struct PeerVerifySuccessorResultMessage *) message;
+  if ((msize - sizeof (struct PeerVerifySuccessorResultMessage)) %
+      sizeof (struct GNUNET_PeerIdentity) != 0)
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+  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 (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 = 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)))
+  {
+    /* Here it may happen that source peer has found a new successor, and 
removed
+     the trail, Hence no entry found in the routing table. Fail silently.*/
+    DEBUG(" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s, line",
+            GNUNET_i2s(&my_identity), GNUNET_h2s(&trail_id), __LINE__);
+    GNUNET_break_op(0);
+    return GNUNET_OK;
+  }
+  if (NULL == (target_friend =
+                 GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop)))
+  {
+    GNUNET_break_op(0);
+    return GNUNET_OK;
+  }
+  GDS_NEIGHBOURS_send_verify_successor_result (querying_peer,
+                                               vsrm->current_successor,
+                                               probable_successor, trail_id,
+                                               trail,
+                                               trail_length,
+                                               trail_direction, target_friend);
+  return GNUNET_OK;
+}
+
+
+/*
+ * Core handle for p2p notify new successor 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_notify_new_successor(void *cls,
+                                    const struct GNUNET_PeerIdentity *peer,
+                                    const struct GNUNET_MessageHeader *message)
+{
+  const struct PeerNotifyNewSuccessorMessage *nsm;
+  struct GNUNET_PeerIdentity *trail;
+  struct GNUNET_PeerIdentity source;
+  struct GNUNET_PeerIdentity new_successor;
+  struct GNUNET_HashCode trail_id;
+  struct GNUNET_PeerIdentity next_hop;
+  struct FriendInfo *target_friend;
+  int my_index;
+  size_t msize;
+  uint32_t trail_length;
+
+  msize = ntohs (message->size);
+  if (msize < sizeof (struct PeerNotifyNewSuccessorMessage))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_YES;
+  }
+  nsm = (const struct PeerNotifyNewSuccessorMessage *) message;
+  if ((msize - sizeof (struct PeerNotifyNewSuccessorMessage)) %
+      sizeof (struct GNUNET_PeerIdentity) != 0)
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+  trail_length = (msize - sizeof (struct PeerNotifyNewSuccessorMessage))/
+                  sizeof (struct GNUNET_PeerIdentity);
+  GNUNET_STATISTICS_update (GDS_stats,
+                            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
+      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);
+    return GNUNET_OK;
+  }
+
+  GNUNET_assert(trail_length > 0);
+  /* I am part of trail to reach to successor. */
+  my_index = search_my_index (trail, trail_length);
+  if (-1 == my_index)
+  {
+    DEBUG ("No entry found in trail\n");
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
+  if((trail_length + 1) == my_index)
+  {
+    DEBUG ("Found twice in trail.\n");
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
+  if ((trail_length-1) == my_index)
+    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);
+  if (NULL == target_friend)
+  {
+    GNUNET_break(0);
+    return GNUNET_OK;
+  }
+  GDS_NEIGHBOURS_send_notify_new_successor (source, new_successor, trail,
+                                            trail_length,
+                                            trail_id, target_friend);
+  return GNUNET_OK;
+
+}
+
+
+/**
+ * Core handler for P2P notify successor message
+ * @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_notify_succ_confirmation (void *cls,
+                                         const struct GNUNET_PeerIdentity 
*peer,
+                                         const struct GNUNET_MessageHeader 
*message)
+{
+  const struct PeerNotifyConfirmationMessage *notify_confirmation;
+  enum GDS_ROUTING_trail_direction trail_direction;
+  struct GNUNET_HashCode trail_id;
+  struct FriendInfo *target_friend;
+  struct GNUNET_PeerIdentity *next_hop;
+  size_t msize;
+
+  msize = ntohs (message->size);
+
+  if (msize != sizeof (struct PeerNotifyConfirmationMessage))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+  GNUNET_STATISTICS_update (GDS_stats,
+                            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
+     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))
+  {
+   /*
+    * Schedule another round of verify sucessor with your current successor
+    * 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 != 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 = NULL;
+    }
+    if (send_verify_successor_task == NULL)
+    {
+      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 =
+              GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
+                                           &send_verify_successor_message,
+                                           NULL);
+    }
+  }
+  else
+  {
+    target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, 
next_hop);
+    if (NULL == target_friend)
+    {
+      DEBUG ("\n friend not found, line number = %d",__LINE__);
+      return GNUNET_SYSERR;
+    }
+    GDS_NEIGHBOURS_send_notify_succcessor_confirmation  (trail_id,
+                                                        
GDS_ROUTING_DEST_TO_SRC,
+                                                        target_friend);
+  }
+  return GNUNET_OK;
+}
+
+
+/**
+ * Core handler for P2P trail rejection message
+ * @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_setup_rejection (void *cls,
+                                      const struct GNUNET_PeerIdentity *peer,
+                                      const struct GNUNET_MessageHeader 
*message)
+{
+  const struct PeerTrailRejectionMessage *trail_rejection;
+  unsigned int trail_length;
+  const struct GNUNET_PeerIdentity *trail_peer_list;
+  struct FriendInfo *target_friend;
+  struct GNUNET_TIME_Relative congestion_timeout;
+  struct GNUNET_HashCode trail_id;
+  struct GNUNET_PeerIdentity next_peer;
+  struct GNUNET_PeerIdentity source;
+  uint64_t ultimate_destination_finger_value;
+  unsigned int is_predecessor;
+  size_t msize;
+
+  msize = ntohs (message->size);
+  if (msize < sizeof (struct PeerTrailRejectionMessage))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_YES;
+  }
+  trail_rejection = (const struct PeerTrailRejectionMessage *) message;
+  if ((msize - sizeof (struct PeerTrailRejectionMessage)) %
+      sizeof (struct GNUNET_PeerIdentity) != 0)
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+  trail_length = (msize - sizeof (struct PeerTrailRejectionMessage))/
+                  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_rejection[1];
+  is_predecessor = ntohl (trail_rejection->is_predecessor);
+  congestion_timeout = trail_rejection->congestion_time;
+  source = trail_rejection->source_peer;
+  trail_id = trail_rejection->trail_id;
+  ultimate_destination_finger_value =
+          GNUNET_ntohll (trail_rejection->ultimate_destination_finger_value);
+  /* First set the congestion time of the friend that sent you this message. */
+  target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer);
+  if (NULL == target_friend)
+  {
+    DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
+    GNUNET_break(0);
+    return GNUNET_OK;
+  }
+  target_friend->congestion_timestamp =
+          GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get(),
+                                    congestion_timeout);
+
+  /* I am the source peer which wants to setup the trail. Do nothing.
+   * send_find_finger_trail_task is scheduled periodically.*/
+  if(0 == (GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &source)))
+    return GNUNET_OK;
+
+  /* If I am congested then pass this message to peer before me in trail. */
+  if(GNUNET_YES == GDS_ROUTING_threshold_reached())
+  {
+    /* 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;
+    else
+      next_peer = trail[new_trail_length-1];
+
+    target_friend =
+                   GNUNET_CONTAINER_multipeermap_get (friend_peermap, 
&next_peer);
+    if (NULL == target_friend)
+    {
+      DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
+      GNUNET_break(0);
+      return GNUNET_OK;
+    }
+    GDS_NEIGHBOURS_send_trail_rejection (source,
+                                         ultimate_destination_finger_value,
+                                         my_identity, is_predecessor,
+                                         trail, new_trail_length, trail_id,
+                                         target_friend, CONGESTION_TIMEOUT);
+    return GNUNET_OK;
+  }
+
+  struct Closest_Peer successor;
+  successor = find_local_best_known_next_hop 
(ultimate_destination_finger_value, is_predecessor);
+
+  /* Am I the final destination? */
+  if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
+                                             &my_identity)))
+  {
+     /*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
+    {
+      next_peer = trail[new_trail_length-1];
+    }
+    target_friend =
+                   GNUNET_CONTAINER_multipeermap_get (friend_peermap, 
&next_peer);
+
+    if (NULL == target_friend)
+    {
+      DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
+      GNUNET_break(0);
+      return GNUNET_OK;
+    }
+    GDS_NEIGHBOURS_send_trail_setup_result (source,
+                                            my_identity,
+                                            target_friend, new_trail_length,
+                                            trail,
+                                            is_predecessor,
+                                            ultimate_destination_finger_value,
+                                            trail_id);
+  }
+  else
+  {
+    /* Here I was already part of trail. So no need to add. */
+    target_friend =
+                   GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                      &successor.next_hop);
+    if (NULL == target_friend)
+    {
+      DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
+      GNUNET_break(0);
+      return GNUNET_OK;
+    }
+
+    GDS_NEIGHBOURS_send_trail_setup (source,
+                                     ultimate_destination_finger_value,
+                                     successor.best_known_destination,
+                                     target_friend, trail_length, 
trail_peer_list,
+                                     is_predecessor, trail_id,
+                                     successor.trail_id);
+  }
+  return GNUNET_OK;
+}
+
+
+/**
+ * Core handler for trail teardown message.
+ * @param cls closure
+ * @param message message
+ * @param peer sender of this messsage.
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_trail_teardown (void *cls, const struct GNUNET_PeerIdentity 
*peer,
+                               const struct GNUNET_MessageHeader *message)
+{
+  const struct PeerTrailTearDownMessage *trail_teardown;
+  enum GDS_ROUTING_trail_direction trail_direction;
+  struct GNUNET_HashCode trail_id;
+  struct GNUNET_PeerIdentity *next_hop;
+  size_t msize;
+
+  msize = ntohs (message->size);
+
+  /* Here we pass only the trail id. */
+  if (msize != sizeof (struct PeerTrailTearDownMessage))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+
+  GNUNET_STATISTICS_update (GDS_stats,
+                            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;
+
+  /* Check if peer is the real peer from which we should get this message.*/
+  /* Get the prev_hop for this trail by getting the next hop in opposite 
direction. */
+#if 0
+  GNUNET_assert (NULL != (prev_hop =
+                 GDS_ROUTING_get_next_hop (trail_id, !trail_direction)));
+  if (0 != GNUNET_CRYPTO_cmp_peer_identity (prev_hop, peer))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+#endif
+
+  next_hop = GDS_ROUTING_get_next_hop (trail_id, trail_direction);
+  if (NULL == next_hop)
+  {
+    DEBUG(" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s, line",
+            GNUNET_i2s(&my_identity), GNUNET_h2s(&trail_id), __LINE__);
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+
+  /* I am the next hop, which means I am the final destination. */
+  if (0 == GNUNET_CRYPTO_cmp_peer_identity (next_hop, &my_identity))
+  {
+    GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (trail_id));
+    return GNUNET_OK;
+  }
+  else
+  {
+    /* 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);
+  }
+
+  return GNUNET_OK;
+}
+
+
+/**
+ * Core handle for p2p add trail message.
+ * @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_add_trail (void *cls, const struct GNUNET_PeerIdentity *peer,
+                          const struct GNUNET_MessageHeader *message)
+{
+  const struct PeerAddTrailMessage *add_trail;
+  const struct GNUNET_PeerIdentity *trail;
+  struct GNUNET_HashCode trail_id;
+  struct GNUNET_PeerIdentity destination_peer;
+  struct GNUNET_PeerIdentity source_peer;
+  struct GNUNET_PeerIdentity next_hop;
+  unsigned int trail_length;
+  unsigned int my_index;
+  size_t msize;
+
+  msize = ntohs (message->size);
+  /* In this message we pass the whole trail from source to destination as we
+   * are adding that trail.*/
+  //FIXME: failed when run with 1000 pears. check why.
+  if (msize < sizeof (struct PeerAddTrailMessage))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+
+  add_trail = (const struct PeerAddTrailMessage *) message;
+  trail_length = (msize - sizeof (struct PeerAddTrailMessage))/
+                  sizeof (struct GNUNET_PeerIdentity);
+  if ((msize - sizeof (struct PeerAddTrailMessage)) %
+      sizeof (struct GNUNET_PeerIdentity) != 0)
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+
+  GNUNET_STATISTICS_update (GDS_stats,
+                            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;
+  trail_id = add_trail->trail_id;
+
+  /* I am not the destination of the trail. */
+  if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &destination_peer))
+  {
+    struct FriendInfo *target_friend;
+
+    /* Get my location in the trail. */
+    my_index = search_my_index (trail, trail_length);
+    if (-1 == my_index)
+    {
+      GNUNET_break_op (0);
+      return GNUNET_SYSERR;
+    }
+    if((trail_length + 1) == my_index)
+    {
+      DEBUG ("Found twice in trail.\n");
+      GNUNET_break_op (0);
+      return GNUNET_SYSERR;
+    }
+    if ((trail_length - 1) == my_index)
+    {
+      next_hop = destination_peer;
+    }
+    else
+    {
+      next_hop = trail[my_index + 1];
+    }
+    /* Add in your routing table. */
+    GNUNET_assert (GNUNET_OK == GDS_ROUTING_add (trail_id, *peer, next_hop));
+    //GNUNET_assert (GNUNET_OK == GDS_ROUTING_add (trail_id, next_hop, *peer));
+    GNUNET_assert (NULL !=
+                  (target_friend =
+                   GNUNET_CONTAINER_multipeermap_get (friend_peermap, 
&next_hop)));
+    GDS_NEIGHBOURS_send_add_trail (source_peer, destination_peer, trail_id,
+                                   trail, trail_length, target_friend);
+    return GNUNET_OK;
+  }
+  /* I am the destination. Add an entry in routing table. */
+  GNUNET_assert (GNUNET_OK == GDS_ROUTING_add (trail_id, *peer, my_identity));
+  return GNUNET_OK;
+}
+
+
+/**
+ * Free the finger trail in which the first friend to reach to a finger is
+ * disconnected_friend. Also remove entry from routing table for that 
particular
+ * trail id.
+ * @param disconnected_friend PeerIdentity of friend which got disconnected
+ * @param remove_finger Finger whose trail we need to check if it has
+ *                      disconnected_friend as the first hop.
+ * @return Total number of trails in which disconnected_friend was the first
+ *         hop.
+ */
+static int
+remove_matching_trails (const struct GNUNET_PeerIdentity *disconnected_friend,
+                        struct FingerInfo *finger)
+{
+  struct GNUNET_PeerIdentity *next_hop;
+  struct FriendInfo *remove_friend;
+  struct Trail *current_trail;
+  unsigned int matching_trails_count = 0;
+  int i;
+
+  /* Iterate over all the trails of finger. */
+  for (i = 0; i < finger->trails_count; i++)
+  {
+    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))
+    {
+      remove_friend =
+                     GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+                                                        disconnected_friend);
+      GNUNET_assert (NULL != remove_friend);
+      next_hop = GDS_ROUTING_get_next_hop (current_trail->trail_id,
+                                           GDS_ROUTING_SRC_TO_DEST);
+
+      /* Here it may happen that as all the peers got disconnected, the entry 
in
+       routing table for that particular trail has been removed, because the
+       previously disconnected peer was either a next hop or prev hop of that
+       peer. */
+      if (NULL != next_hop)
+      {
+        GNUNET_assert (0 == (GNUNET_CRYPTO_cmp_peer_identity 
(disconnected_friend,
+                                                              next_hop)));
+        GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail 
(current_trail->trail_id));
+      }
+      matching_trails_count++;
+      free_trail (current_trail);
+      current_trail->is_present = GNUNET_NO;
+    }
+  }
+  return matching_trails_count;
+}
+
+
+/**
+ * Iterate over finger_table entries.
+ * 0. Ignore finger which is my_identity or if no valid entry present at
+ *    that finger index.
+ * 1. If disconnected_friend is a finger, then remove the routing entry from
+      your own table. Free the trail.
+ * 2. Check if disconnected_friend is the first friend in the trail to reach 
to a finger.
+ *   2.1 Remove all the trails and entry from routing table in which 
disconnected
+ *       friend is the first friend in the trail. If disconnected_friend is the
+ *       first friend in all the trails to reach finger, then remove the 
finger.
+ * @param disconnected_friend Peer identity of friend which got disconnected.
+ */
+static void
+remove_matching_fingers (const struct GNUNET_PeerIdentity *disconnected_peer)
+{
+  struct FingerInfo *current_finger;
+  int removed_trails_count;
+  int i;
+
+  /* Iterate over finger table entries. */
+  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))
+      continue;
+
+    /* Iterate over the list of trails to reach remove_finger. Check if
+     * disconnected_friend is the first friend in any of the trail. */
+    removed_trails_count = remove_matching_trails (disconnected_peer,
+                                                   current_finger);
+    current_finger->trails_count =
+            current_finger->trails_count - removed_trails_count;
+    if (0 == current_finger->trails_count)
+    {
+      current_finger->is_present = GNUNET_NO;
+      memset ((void *)&finger_table[i], 0, sizeof (finger_table[i]));
+    }
+  }
+}
+
+
+/**
+ * Method called whenever a peer disconnects.
+ *
+ * @param cls closure
+ * @param peer peer identity this notification is about
+ */
+static void
+handle_core_disconnect (void *cls,
+                                         const struct GNUNET_PeerIdentity 
*peer)
+{
+  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;
+
+  if(NULL == (remove_friend =
+                 GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer)))
+  {
+    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))
+  {
+    GNUNET_CONTAINER_DLL_remove (remove_friend->head, remove_friend->tail, 
pos);
+    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 (NULL != find_finger_trail_task)
+  {
+      GNUNET_SCHEDULER_cancel (find_finger_trail_task);
+      find_finger_trail_task = NULL;
+  }
+  else
+    GNUNET_break (0);
+}
+
+
+/**
+ * Method called whenever a peer connects.
+ *
+ * @param cls closure
+ * @param peer_identity peer identity this notification is about
+ */
+static void
+handle_core_connect (void *cls, const struct GNUNET_PeerIdentity 
*peer_identity)
+{
+  struct FriendInfo *friend;
+
+  /* Check for connect to self message */
+  if (0 == memcmp (&my_identity, peer_identity, sizeof (struct 
GNUNET_PeerIdentity)))
+    return;
+
+  /* If peer already exists in our friend_peermap, then exit. */
+  if (GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains (friend_peermap,
+                                                            peer_identity))
+  {
+    GNUNET_break (0);
+    return;
+  }
+
+  friend = GNUNET_new (struct FriendInfo);
+  friend->id = *peer_identity;
+
+  GNUNET_assert (GNUNET_OK ==
+                 GNUNET_CONTAINER_multipeermap_put (friend_peermap,
+                                                    peer_identity, friend,
+                                                    
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
+
+  /* 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
+   * each other as their friend. */
+  /* Got a first connection, good time to start with FIND FINGER TRAIL 
requests...*/
+  if (NULL == find_finger_trail_task)
+  {
+    find_finger_trail_task = GNUNET_SCHEDULER_add_now 
(&send_find_finger_trail_message, NULL);
+  }
+}
+
+
+/**
+ * To be called on core init/fail.
+ *
+ * @param cls service closure
+ * @param identity the public identity of this peer
+ */
+static void
+core_init (void *cls,
+           const struct GNUNET_PeerIdentity *identity)
+{
+  my_identity = *identity;
+}
+
+
+/**
+ * Initialize finger table entries.
+ */
+static void
+finger_table_init ()
+{
+  memset (&finger_table, 0, sizeof (finger_table));
+}
+
+
+/**
+ * Initialize neighbours subsystem.
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+int
+GDS_NEIGHBOURS_init (void)
+{
+  static struct GNUNET_CORE_MessageHandler core_handlers[] = {
+    {&handle_dht_p2p_put, GNUNET_MESSAGE_TYPE_XDHT_P2P_PUT, 0},
+    {&handle_dht_p2p_get, GNUNET_MESSAGE_TYPE_XDHT_P2P_GET, 0},
+    {&handle_dht_p2p_get_result, GNUNET_MESSAGE_TYPE_XDHT_P2P_GET_RESULT, 0},
+    {&handle_dht_p2p_trail_setup, GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP, 0},
+    {&handle_dht_p2p_trail_setup_result, 
GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_RESULT, 0},
+    {&handle_dht_p2p_verify_successor, 
GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR, 0},
+    {&handle_dht_p2p_verify_successor_result, 
GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR_RESULT, 0},
+    {&handle_dht_p2p_notify_new_successor, 
GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_NEW_SUCCESSOR, 0},
+    {&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_add_trail, GNUNET_MESSAGE_TYPE_XDHT_P2P_ADD_TRAIL, 0},
+    {&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?
+  friend_peermap = GNUNET_CONTAINER_multipeermap_create (256, GNUNET_NO);
+  finger_table_init ();
+  successor_times = 10;
+  fingers_round_count = 5;
+  find_finger_trail_task_next_send_time.rel_value_us =
+      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 =
+      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 =
+      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 =
+      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.
+ */
+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[j]);
+    }
+  }
+}
+
+
+/**
+ * Shutdown neighbours subsystem.
+ */
+void
+GDS_NEIGHBOURS_done (void)
+{
+  if (NULL == core_api)
+    return;
+
+  GNUNET_CORE_disconnect (core_api);
+  core_api = NULL;
+
+  delete_finger_table_entries();
+  GNUNET_assert (0 == GNUNET_CONTAINER_multipeermap_size (friend_peermap));
+  GNUNET_CONTAINER_multipeermap_destroy (friend_peermap);
+  friend_peermap = NULL;
+
+  if (NULL != find_finger_trail_task)
+  {
+    GNUNET_SCHEDULER_cancel (find_finger_trail_task);
+    find_finger_trail_task = NULL;
+  }
+
+  if (NULL != send_verify_successor_task)
+  {
+    GNUNET_SCHEDULER_cancel (send_verify_successor_task);
+    send_verify_successor_task = NULL;
+  }
+
+  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 = NULL;
+  }
+
+  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 = NULL;
+  }
+}
+
+
+/**
+ * Get my identity
+ *
+ * @return my identity
+ */
+struct GNUNET_PeerIdentity
+GDS_NEIGHBOURS_get_my_id (void)
+{
+  return my_identity;
+}
+
+/* end of gnunet-service-xdht_neighbours.c */

Added: gnunet/src/dht/gnunet-service-wdht_neighbours.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_neighbours.h                             
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_neighbours.h     2015-04-27 11:12:21 UTC 
(rev 35559)
@@ -0,0 +1,146 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2009, 2010, 2011 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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_neighbours.h
+ * @brief GNUnet DHT routing code
+ * @author Supriti Singh
+ */
+
+#ifndef GNUNET_SERVICE_XDHT_NEIGHBOURS_H
+#define GNUNET_SERVICE_XDHT_NEIGHBOURS_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_block_lib.h"
+#include "gnunet_dht_service.h"
+
+
+#if ENABLE_MALICIOUS
+/**
+ * Set the ENABLE_MALICIOUS value to malicious.
+ * @param malicious
+ */
+int
+GDS_NEIGHBOURS_act_malicious (unsigned int malicious);
+#endif
+
+/**
+ * Handle the put request from the client.
+ * @param key Key for the content
+ * @param block_type Type of the block
+ * @param options Routing options
+ * @param desired_replication_level Desired replication count
+ * @param expiration_time When does the content expire
+ * @param data Content to store
+ * @param data_size Size of content @a data in bytes
+ */
+void
+GDS_NEIGHBOURS_handle_put (const struct GNUNET_HashCode *key,
+                           enum GNUNET_BLOCK_Type block_type,
+                           enum GNUNET_DHT_RouteOption options,
+                           uint32_t desired_replication_level,
+                           struct GNUNET_TIME_Absolute expiration_time,
+                           const void *data, size_t data_size);
+
+/**
+ * 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.
+ * @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
+GDS_NEIGHBOURS_handle_get(const struct GNUNET_HashCode *key,
+                          enum GNUNET_BLOCK_Type block_type,
+                          enum GNUNET_DHT_RouteOption options,
+                          uint32_t desired_replication_level);
+
+/**
+ * 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.
+ * @param source_peer Peer which has the data for the key.
+ * @param put_path_length Number of peers in @a put_path
+ * @param put_path Path taken to put the data at its stored location.
+ * @param get_path_length Number of peers in @a get_path
+ * @param get_path Path taken to reach to the location of the key.
+ * @param expiration When will this result expire?
+ * @param data Payload to store
+ * @param data_size Size of the @a data
+ */
+void
+GDS_NEIGHBOURS_send_get_result (const struct GNUNET_HashCode *key,
+                                enum GNUNET_BLOCK_Type type,
+                                const struct GNUNET_PeerIdentity *target_peer,
+                                const struct GNUNET_PeerIdentity *source_peer,
+                                unsigned int put_path_length,
+                                const struct GNUNET_PeerIdentity *put_path,
+                                unsigned int get_path_length,
+                                const struct GNUNET_PeerIdentity *get_path,
+                                struct GNUNET_TIME_Absolute expiration,
+                                const void *data, size_t data_size);
+
+/**
+ * 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 (const struct GNUNET_HashCode *trail_id,
+                                    unsigned int trail_direction,
+                                    const struct GNUNET_PeerIdentity *peer);
+
+/**
+ * Return friend corresponding to peer.
+ * @param peer
+ * @return  Friend
+ */
+struct FriendInfo *
+GDS_NEIGHBOURS_get_friend (struct GNUNET_PeerIdentity peer);
+/**
+ * Initialize neighbours subsystem.
+ *
+ * @return #GNUNET_OK on success,
+ *         #GNUNET_SYSERR on error
+ */
+int
+GDS_NEIGHBOURS_init (void);
+
+
+/**
+ * Shutdown neighbours subsystem.
+ */
+void
+GDS_NEIGHBOURS_done (void);
+
+
+/**
+ * Get my identity
+ *
+ * @return my identity
+ */
+struct GNUNET_PeerIdentity
+GDS_NEIGHBOURS_get_my_id (void);
+
+#endif

Added: gnunet/src/dht/gnunet-service-wdht_nse.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_nse.c                            (rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_nse.c    2015-04-27 11:12:21 UTC (rev 
35559)
@@ -0,0 +1,116 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2009, 2010, 2011 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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_nse.c
+ * @brief GNUnet DHT integration with NSE
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include "gnunet_nse_service.h"
+#include "gnunet-service-wdht.h"
+#include "gnunet-service-wdht_nse.h"
+
+/**
+ * log of the current network size estimate, used as the point where
+ * we switch between random and deterministic routing.  Default
+ * value of 4.0 is used if NSE module is not available (i.e. not
+ * configured).
+ */
+static double log_of_network_size_estimate = 4.0;
+
+/**
+ * Network size estimation handle.
+ */
+static struct GNUNET_NSE_Handle *nse;
+
+
+/**
+ * Callback that is called when network size estimate is updated.
+ *
+ * @param cls closure
+ * @param timestamp time when the estimate was received from the server (or 
created by the server)
+ * @param logestimate the log(Base 2) value of the current network size 
estimate
+ * @param std_dev standard deviation for the estimate
+ *
+ */
+static void
+update_network_size_estimate (void *cls, struct GNUNET_TIME_Absolute timestamp,
+                              double logestimate, double std_dev)
+{
+  GNUNET_STATISTICS_update (GDS_stats,
+                            gettext_noop ("# Network size estimates received"),
+                            1, GNUNET_NO);
+  /* do not allow estimates < 0.5 */
+  log_of_network_size_estimate = GNUNET_MAX (0.5, logestimate);
+}
+
+
+/**
+ * Return the log of the current network size estimate.
+ *
+ * @return log of NSE
+ */
+double
+GDS_NSE_get ()
+{
+  return log_of_network_size_estimate;
+}
+
+
+/**
+ * Initialize NSE subsystem.
+ */
+void
+GDS_NSE_init ()
+{
+  unsigned long long hops;
+
+  if ( (GNUNET_YES ==
+       GNUNET_CONFIGURATION_have_value (GDS_cfg,
+                                        "dht",
+                                        "FORCE_NSE")) &&
+       (GNUNET_OK ==
+       GNUNET_CONFIGURATION_get_value_number (GDS_cfg,
+                                              "dht",
+                                              "FORCE_NSE",
+                                              &hops)) )
+  {
+    log_of_network_size_estimate = (double) hops;
+    return;
+  }
+  nse = GNUNET_NSE_connect (GDS_cfg, &update_network_size_estimate, NULL);
+}
+
+
+/**
+ * Shutdown NSE subsystem.
+ */
+void
+GDS_NSE_done ()
+{
+  if (NULL != nse)
+  {
+    GNUNET_NSE_disconnect (nse);
+    nse = NULL;
+  }
+}
+
+/* end of gnunet-service-dht_nse.c */

Added: gnunet/src/dht/gnunet-service-wdht_nse.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_nse.h                            (rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_nse.h    2015-04-27 11:12:21 UTC (rev 
35559)
@@ -0,0 +1,52 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2011 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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_nse.h
+ * @brief GNUnet DHT integration with NSE
+ * @author Christian Grothoff
+ */
+#ifndef GNUNET_SERVICE_XDHT_NSE_H
+#define GNUNET_SERVICE_XDHT_NSE_H
+
+
+/**
+ * Return the log of the current network size estimate.
+ *
+ * @return log of NSE
+ */
+double
+GDS_NSE_get (void);
+
+
+/**
+ * Initialize NSE subsystem.
+ */
+void
+GDS_NSE_init (void);
+
+
+/**
+ * Shutdown NSE subsystem.
+ */
+void
+GDS_NSE_done (void);
+
+#endif

Added: gnunet/src/dht/gnunet-service-wdht_routing.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_routing.c                                
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_routing.c        2015-04-27 11:12:21 UTC 
(rev 35559)
@@ -0,0 +1,363 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2011 - 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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_routing.c
+ * @brief GNUnet DHT tracking of requests for routing replies
+ * @author Supriti Singh
+ */
+#include "platform.h"
+#include "gnunet-service-wdht_neighbours.h"
+#include "gnunet-service-wdht_routing.h"
+#include "gnunet-service-wdht.h"
+
+
+/**
+ * FIXME: Check if its better to store pointer to friend rather than storing
+ * peer identity next_hop or prev_hop.
+ * keep entries in destnation and source peer also. so when we send the trail
+ * teardown message then we don't know the source but if source gets the 
message
+ * then it shold remove that trail id from its finger table. But how does
+ * source know what is the desination finger ? It will whenevr contact a trail
+ * will do a lookup in routing table and if no trail id present the remove
+ * that trail of the finger and if only one trail then remove the finger.
+ * because of this use case of trail teardown I think trail compression
+ * and trail teardown should not be merged.
+ * 2. store a pointer to friendInfo in place o peer identity.
+ */
+/**
+ * Maximum number of entries in routing table.
+ */
+#define ROUTING_TABLE_THRESHOLD 80000
+
+/**
+ * FIXME: Store friend pointer instead of peer identifier.
+ * Routing table entry .
+ */
+struct RoutingTrail
+{
+  /**
+   * Global Unique identifier of the trail.
+   */
+  struct GNUNET_HashCode trail_id;
+
+  /**
+   * The peer to which this request should be passed to.
+   */
+  struct GNUNET_PeerIdentity next_hop;
+
+  /**
+   * Peer just before next hop in the trail.
+   */
+  struct GNUNET_PeerIdentity prev_hop;
+};
+
+/**
+ * Routing table of the peer
+ */
+static struct GNUNET_CONTAINER_MultiHashMap *routing_table;
+
+/**
+ * Update the prev. hop of the trail. Call made by trail compression where
+ * if you are the first friend now in the trail then you need to update
+ * your prev. hop.
+ * @param trail_id
+ * @return #GNUNET_OK success
+ *         #GNUNET_SYSERR in case no matching entry found in routing table.
+ */
+int
+GDS_ROUTING_update_trail_prev_hop (const struct GNUNET_HashCode trail_id,
+                                   struct GNUNET_PeerIdentity prev_hop)
+{
+  struct RoutingTrail *trail;
+
+  trail = GNUNET_CONTAINER_multihashmap_get (routing_table, &trail_id);
+
+  if (NULL == trail)
+    return GNUNET_SYSERR;
+
+  trail->prev_hop = prev_hop;
+  return GNUNET_OK;
+}
+
+/**
+ * Update the next hop of the trail. Call made by trail compression where
+ * if you are source of the trail and now you have a new first friend, then
+ * you should update the trail.
+ * @param trail_id
+ * @return #GNUNET_OK success
+ *         #GNUNET_SYSERR in case no matching entry found in routing table.
+ */
+int
+GDS_ROUTING_update_trail_next_hop (const struct GNUNET_HashCode trail_id,
+                                   struct GNUNET_PeerIdentity next_hop)
+{
+  struct RoutingTrail *trail;
+
+  trail = GNUNET_CONTAINER_multihashmap_get (routing_table, &trail_id);
+
+  if (NULL == trail)
+
+    return GNUNET_SYSERR;
+
+  trail->next_hop = next_hop;
+  return GNUNET_OK;
+}
+
+/**
+ * Get the next hop for trail corresponding to trail_id
+ * @param trail_id Trail id to be searched.
+ * @return Next_hop if found
+ *         NULL If next hop not found.
+ */
+struct GNUNET_PeerIdentity *
+GDS_ROUTING_get_next_hop (const struct GNUNET_HashCode trail_id,
+                          enum GDS_ROUTING_trail_direction trail_direction)
+{
+  struct RoutingTrail *trail;
+
+  trail = GNUNET_CONTAINER_multihashmap_get (routing_table, &trail_id);
+  if (NULL == trail)
+  {
+    /* If a friend got disconnected and we removed all the entry from the
+     routing table, then trail will be deleted and my identity will not know
+     and when it tries to reach to that finger it fails. thats why
+     assertion always fails in*/
+    return NULL;
+  }
+  switch (trail_direction)
+  {
+    case GDS_ROUTING_SRC_TO_DEST:
+      return &(trail->next_hop);
+    case GDS_ROUTING_DEST_TO_SRC:
+      return &(trail->prev_hop);
+  }
+  return NULL;
+}
+
+
+/**
+ * Remove trail with trail_id
+ * @param trail_id Trail id to be removed
+ * @return #GNUNET_YES success
+ *         #GNUNET_NO if entry not found.
+ */
+int
+GDS_ROUTING_remove_trail (const struct GNUNET_HashCode remove_trail_id)
+{
+  struct RoutingTrail *remove_entry;
+
+  remove_entry = GNUNET_CONTAINER_multihashmap_get (routing_table, 
&remove_trail_id);
+  if (NULL == remove_entry)
+    return GNUNET_NO;
+
+  if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (routing_table,
+                                                          &remove_trail_id,
+                                                          remove_entry))
+  {
+    GNUNET_free (remove_entry);
+    return GNUNET_YES;
+  }
+
+  return GNUNET_NO;
+}
+
+
+/**
+ * Iterate over routing table and remove entries with value as part of any 
trail.
+ *
+ * @param cls closure
+ * @param key current public key
+ * @param value value in the hash map
+ * @return #GNUNET_YES if we should continue to iterate,
+ *         #GNUNET_NO if not.
+ */
+static int remove_matching_trails (void *cls,
+                                   const struct GNUNET_HashCode *key,
+                                   void *value)
+{
+  struct RoutingTrail *remove_trail = value;
+  struct GNUNET_PeerIdentity *disconnected_peer = cls;
+  struct GNUNET_HashCode trail_id = *key;
+  struct GNUNET_PeerIdentity my_identity;
+
+  /* If disconnected_peer is next_hop, then send a trail teardown message 
through
+   * prev_hop in direction from destination to source. */
+  if (0 == GNUNET_CRYPTO_cmp_peer_identity (&remove_trail->next_hop,
+                                            disconnected_peer))
+  {
+    my_identity = GDS_NEIGHBOURS_get_my_id ();
+    if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
+                                              &remove_trail->prev_hop))
+    {
+      GDS_NEIGHBOURS_send_trail_teardown (&trail_id,
+                                          GDS_ROUTING_DEST_TO_SRC,
+                                          &remove_trail->prev_hop);
+    }
+  }
+
+  /* If disconnected_peer is prev_hop, then send a trail teardown through
+   * next_hop in direction from Source to Destination. */
+  if (0 == GNUNET_CRYPTO_cmp_peer_identity (&remove_trail->prev_hop,
+                                            disconnected_peer))
+  {
+    my_identity = GDS_NEIGHBOURS_get_my_id ();
+
+    if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
+                                              &remove_trail->next_hop))
+    {
+      GDS_NEIGHBOURS_send_trail_teardown (&trail_id,
+                                          GDS_ROUTING_SRC_TO_DEST,
+                                          &remove_trail->next_hop);
+    }
+  }
+
+  GNUNET_assert (GNUNET_YES ==
+                   GNUNET_CONTAINER_multihashmap_remove (routing_table,
+                                                         &trail_id,
+                                                         remove_trail));
+  GNUNET_free (remove_trail);
+  return GNUNET_YES;
+}
+
+#if 0
+/**
+ * TEST FUNCTION
+ * Remove after using.
+ */
+void
+GDS_ROUTING_test_print (void)
+{
+  struct GNUNET_CONTAINER_MultiHashMapIterator *iter;
+  struct RoutingTrail *trail;
+  struct GNUNET_PeerIdentity print_peer;
+  struct GNUNET_HashCode key_ret;
+  int i;
+
+  struct GNUNET_PeerIdentity my_identity = GDS_NEIGHBOURS_get_my_id();
+  print_peer = my_identity;
+   FPRINTF (stderr,_("\nSUPU ***PRINTING ROUTING TABLE ***** of 
=%s"),GNUNET_i2s(&print_peer));
+  iter =GNUNET_CONTAINER_multihashmap_iterator_create (routing_table);
+  for (i = 0; i < GNUNET_CONTAINER_multihashmap_size(routing_table); i++)
+  {
+    if(GNUNET_YES == GNUNET_CONTAINER_multihashmap_iterator_next (iter,
+                                                                  &key_ret,
+                                                                  (const void 
**)&trail))
+    {
+      FPRINTF (stderr,_("\nSUPU %s, %s, %d, trail->trail_id = %s"),
+              __FILE__, __func__,__LINE__, GNUNET_h2s(&trail->trail_id));
+      memcpy (&print_peer, &trail->next_hop, sizeof (struct 
GNUNET_PeerIdentity));
+      FPRINTF (stderr,_("\nSUPU %s, %s, %d, trail->next_hop = %s"),
+              __FILE__, __func__,__LINE__, GNUNET_i2s(&print_peer));
+      memcpy (&print_peer, &trail->prev_hop, sizeof (struct 
GNUNET_PeerIdentity));
+      FPRINTF (stderr,_("\nSUPU %s, %s, %d, trail->prev_hop = %s"),
+              __FILE__, __func__,__LINE__, GNUNET_i2s(&print_peer));
+    }
+  }
+}
+#endif
+
+/**
+ * Remove every trail where peer is either next_hop or prev_hop. Also send a
+ * trail teardown message in direction of hop which is not disconnected.
+ * @param peer Peer identity. Trail containing this peer should be removed.
+ */
+int
+GDS_ROUTING_remove_trail_by_peer (const struct GNUNET_PeerIdentity *peer)
+{
+  int ret;
+
+
+  /* No entries in my routing table. */
+  if (0 == GNUNET_CONTAINER_multihashmap_size(routing_table))
+    return GNUNET_YES;
+
+  ret = GNUNET_CONTAINER_multihashmap_iterate (routing_table,
+                                               &remove_matching_trails,
+                                               (void *)peer);
+  return ret;
+}
+
+
+/**
+ * Add a new entry in routing table
+ * @param new_trail_id
+ * @param prev_hop
+ * @param next_hop
+ * @return #GNUNET_OK success
+ *         #GNUNET_SYSERR in case new_trail_id already exists in the network
+ *                         but with different prev_hop/next_hop
+ */
+int
+GDS_ROUTING_add (struct GNUNET_HashCode new_trail_id,
+                 struct GNUNET_PeerIdentity prev_hop,
+                 struct GNUNET_PeerIdentity next_hop)
+{
+  struct RoutingTrail *new_entry;
+
+  new_entry = GNUNET_new (struct RoutingTrail);
+  new_entry->trail_id = new_trail_id;
+  new_entry->next_hop = next_hop;
+  new_entry->prev_hop = prev_hop;
+
+
+  return GNUNET_CONTAINER_multihashmap_put (routing_table,
+                                            &new_trail_id, new_entry,
+                                            
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
+
+}
+
+
+/**
+ * Check if the size of routing table has crossed ROUTING_TABLE_THRESHOLD.
+ * It means that I don't have any more space in my routing table and I can not
+ * be part of any more trails till there is free space in my routing table.
+ * @return #GNUNET_YES, if threshold crossed else #GNUNET_NO.
+ */
+int
+GDS_ROUTING_threshold_reached (void)
+{
+  return (GNUNET_CONTAINER_multihashmap_size(routing_table) >
+          ROUTING_TABLE_THRESHOLD) ? GNUNET_YES:GNUNET_NO;
+}
+
+
+/**
+ * Initialize routing subsystem.
+ */
+void
+GDS_ROUTING_init (void)
+{
+  routing_table = GNUNET_CONTAINER_multihashmap_create 
(ROUTING_TABLE_THRESHOLD * 4 / 3,
+                                                        GNUNET_NO);
+}
+
+
+/**
+ * Shutdown routing subsystem.
+ */
+void
+GDS_ROUTING_done (void)
+{
+  GNUNET_assert (0 == GNUNET_CONTAINER_multihashmap_size (routing_table));
+  GNUNET_CONTAINER_multihashmap_destroy (routing_table);
+}
+
+/* end of gnunet-service-xdht_routing.c */

Added: gnunet/src/dht/gnunet-service-wdht_routing.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_routing.h                                
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_routing.h        2015-04-27 11:12:21 UTC 
(rev 35559)
@@ -0,0 +1,138 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2011 - 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
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_routing.h
+ * @brief GNUnet DHT tracking of requests for routing replies
+ * @author Christian Grothoff
+ */
+#ifndef GNUNET_SERVICE_XDHT_ROUTING_H
+#define GNUNET_SERVICE_XDHT_ROUTING_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_block_lib.h"
+#include "gnunet_dht_service.h"
+
+/**
+ * To understand the direction in which trial should be read. 
+ */
+enum GDS_ROUTING_trail_direction 
+{
+  GDS_ROUTING_SRC_TO_DEST,
+  GDS_ROUTING_DEST_TO_SRC
+};
+
+
+/**
+ * Update the prev. hop of the trail. Call made by trail teardown where
+ * if you are the first friend now in the trail then you need to update
+ * your prev. hop.
+ * @param trail_id
+ * @return #GNUNET_OK success
+ *         #GNUNET_SYSERR in case no matching entry found in routing table. 
+ */
+int
+GDS_ROUTING_update_trail_prev_hop (struct GNUNET_HashCode trail_id,
+                                   struct GNUNET_PeerIdentity prev_hop);
+
+
+/**
+ * Update the next hop of the trail. Call made by trail compression where
+ * if you are source of the trail and now you have a new first friend, then
+ * you should update the trail. 
+ * @param trail_id
+ * @return #GNUNET_OK success
+ *         #GNUNET_SYSERR in case no matching entry found in routing table.
+ */
+int
+GDS_ROUTING_update_trail_next_hop (const struct GNUNET_HashCode trail_id,
+                                   struct GNUNET_PeerIdentity next_hop);
+
+/**
+ * Get the next hop for trail corresponding to trail_id
+ * @param trail_id Trail id to be searched. 
+ * @return Next_hop if found
+ *         NULL If next hop not found. 
+ */
+struct GNUNET_PeerIdentity *
+GDS_ROUTING_get_next_hop (struct GNUNET_HashCode trail_id,
+                          enum GDS_ROUTING_trail_direction trail_direction);
+
+
+/**
+  * Remove every trail where peer is either next_hop or prev_hop 
+ * @param peer Peer to be searched.
+ */
+int
+GDS_ROUTING_remove_trail_by_peer (const struct GNUNET_PeerIdentity *peer);
+/**
+ * Remove trail with trail_id
+ * @param trail_id Trail id to be removed
+ * @return #GNUNET_YES success 
+ *         #GNUNET_NO if entry not found.
+ */
+int
+GDS_ROUTING_remove_trail (struct GNUNET_HashCode remove_trail_id);
+
+
+/**
+ * Add a new entry in routing table
+ * @param new_trail_id
+ * @param prev_hop
+ * @param next_hop
+ * @return #GNUNET_OK success
+ *         #GNUNET_SYSERR in case new_trail_id already exists in the network
+ *                         but with different prev_hop/next_hop
+ */
+int
+GDS_ROUTING_add (struct GNUNET_HashCode new_trail_id, 
+                 struct GNUNET_PeerIdentity prev_hop,
+                 struct GNUNET_PeerIdentity next_hop);
+
+
+/**
+ * Check if the size of routing table has crossed threshold. 
+ * @return #GNUNET_YES, if threshold crossed 
+ *         #GNUNET_NO, if size is within threshold 
+ */
+int
+GDS_ROUTING_threshold_reached (void);
+
+#if 0
+/**
+ * Test function. Remove afterwards. 
+ */
+void 
+GDS_ROUTING_test_print (void);
+#endif
+
+/**
+ * Initialize routing subsystem.
+ */
+void
+GDS_ROUTING_init (void);
+
+/**
+ * Shutdown routing subsystem.
+ */
+void
+GDS_ROUTING_done (void);
+
+#endif
\ No newline at end of file




reply via email to

[Prev in Thread] Current Thread [Next in Thread]