diff --git a/README.txt b/README.txt
index 379ecbc..580b622 100644
--- a/README.txt
+++ b/README.txt
@@ -1,7 +1,36 @@
-// @TODO
+Welcome to Vinculum.
 
+Vinculum is a Drupal 7 implementation for the pingback and trackback protocols.
 
-TECHNICAL REFERENCES
+Functionllity:
+- support pingback and trackback
+- register one pingback/trackback per node per link
+
+Vinculum: latin for a link in a chain (and coincidentally the heart of a Borg ship)
+
+INSTALLATION INSTRUCTIONS FOR Vinculum
+
+(1) Download the tarball to your 'modules' directory
+
+(2) Extract the tarball with
+
+      "tar -xvzf vinculum-7.x-X.Y.tar.gz"
+
+    where the 'X' and 'Y' should be the digits that
+    are in the exact name of the tarball you've downloaded.
+
+(3) Log in to your Drupal site as someone with permission
+    to enable modules and enable trackback.
+
+(4) Configure Vinculum for each content type. Send and Receive is enabled for
+    all content types by default.
+    Configure the global settings on admin/config/content/vinculum.
+
+Reports of sent and received vinculums (pingbacks or trackbacks) are available
+on admin/reports/vinculum.
+
+
+TECHNICAL REFERENCES:
 
 Pingback specification
 - http://www.hixie.ch/specs/pingback/pingback
diff --git a/modules/vinculum_comment/vinculum_comment.module b/modules/vinculum_comment/vinculum_comment.module
index 86e72d7..ee86f4d 100644
--- a/modules/vinculum_comment/vinculum_comment.module
+++ b/modules/vinculum_comment/vinculum_comment.module
@@ -14,11 +14,17 @@ function vinculum_comment_vinculum_received_action($vinculum) {
   // Trackbacks can provide more valuable information than pingbacks (e.g.
   // the blog name, the title of the remote post, etc). Use this information
   // if it's provided.
+
   switch ($vinculum->handler) {
 
     case 'vinculum_pingback':
-      // @TODO: Fetch an excerpt to use for the comment body.
-      $comment_text = t('<p>Ping from <a href="@blog_url">@blog_url</a>.</p>', array('@blog_url' => $vinculum->url));
+      $comment_text = t('<p>Pingback: !blog_url.</p>', array('!blog_url' => l($vinculum->url, $vinculum->url, array('attributes' => array('rel' => 'nofollow',)))));
+      $excerpt = _vinculum_get_excerpt($vinculum->url, url("node/{$vinculum->nid}", array('absolute' => TRUE)));
+      if ($excerpt) {
+        // Add two new lines for triggering filtered_html to creating a paragraph
+        $comment_text .= "\n\n" . check_markup('<p>… ' . $excerpt . ' …</p>', $format);
+      }
+      //@REMOVE watchdog('DEBUG', '!text', array('!text' => $comment_text), WATCHDOG_DEBUG);
 
       $comment = (object) array(
         'cid'      => NULL,
@@ -26,13 +32,15 @@ function vinculum_comment_vinculum_received_action($vinculum) {
         'nid'      => $vinculum->nid,
         // The anonymous user is hard-coded in Drupal to use uid 0.
         'uid'      => 0,
-        'subject'  => t('Pingback from @url', array('@url' => $vinculum->url)),
+        'subject'  => t('Blog posting on @url', array('@url' => parse_url(check_url($vinculum->url), PHP_URL_HOST))),
         'created'  => $vinculum->timestamp,
         'changed'  => $vinculum->timestamp,
         'status'   => COMMENT_PUBLISHED,
-        'name'     => $comment->name,
+        //@FIXED:
+        // Notice: Undefined variable: comment in vinculum_comment_vinculum_received_action() (Zeile 33 von /modules/vinculum/modules/vinculum_comment/vinculum_comment.module).
+        'name'     => parse_url(check_url($vinculum->url), PHP_URL_HOST),
         'mail'     => '',
-        'homepage' => $vinculum->url,
+        'homepage' => check_url($vinculum->url),
         // @TODO: Language settings:
         // - Detect the language of the comment?
         // - Match the language of the node?
@@ -52,8 +60,9 @@ function vinculum_comment_vinculum_received_action($vinculum) {
 
     case 'vinculum_trackback':
       $trackback = $vinculum->data;
-      $comment_text = t('<p>Trackback from <a href="@blog_url">@blog_url</a>.</p>', array('@blog_url' => $vinculum->url));
-      $comment_text .= check_markup('<p>' . $trackback->excerpt . '</p>', $format);
+      $comment_text = t('<p>Trackback: !blog_url.</p>', array('!blog_url' => l($trackback->title, $vinculum->url, array('attributes' => array('rel' => 'nofollow',)))));
+      // Add two new lines for triggering filtered_html to creating a paragraph
+      $comment_text .= "\n\n" . check_markup('<p>… ' . $trackback->excerpt . ' …</p>', $format);
 
       $comment = (object) array(
         'cid'      => NULL,
@@ -61,13 +70,13 @@ function vinculum_comment_vinculum_received_action($vinculum) {
         'nid'      => $vinculum->nid,
         // The anonymous user is hard-coded in Drupal to use uid 0.
         'uid'      => 0,
-        'subject'  => t('Trackback: @title', array('@title' => $trackback->title)),
+        'subject'  => t('Blog posting on @url', array('@url' => parse_url(check_url($vinculum->url), PHP_URL_HOST))),
         'created'  => $vinculum->timestamp,
         'changed'  => $vinculum->timestamp,
         'status'   => COMMENT_PUBLISHED,
-        'name'     => t('Blog: @name', array('@name' => $trackback->blog_name)),
+        'name'     => check_plain($trackback->blog_name),
         'mail'     => '',
-        'homepage' => $vinculum->url,
+        'homepage' => check_url($vinculum->url),
         // @TODO: Language settings:
         // - Detect the language of the comment?
         // - Match the language of the node?
@@ -99,3 +108,72 @@ function vinculum_comment_vinculum_received_action($vinculum) {
     ->condition('cid', $comment->cid)
     ->execute();
 }
+
+/**
+* Gets an excerpt of the source site.
+* Adapted from Pingback Drupal 6 module.
+*
+* @param String $pagelinkedfrom
+*   The URL of the source site.
+* @return
+*   A excerpt or FALSE in case of problems.
+*/
+function _vinculum_get_excerpt($pagelinkedfrom, $pagelinkedto) {
+  $excerpt = FALSE;
+  // Let's check the remote site
+  $r = drupal_http_request($pagelinkedfrom);
+  if (!empty($r->error))
+    return FALSE;
+  $linea = $r->data;
+
+  // Work around bug in strip_tags():
+  $linea = str_replace('<!DOC', '<DOC', $linea);
+  $linea = preg_replace('/[\s\r\n\t]+/', ' ', $linea); // normalize spaces
+  $linea = preg_replace('/ <(h1|h2|h3|h4|h5|h6|p|th|td|li|dt|dd|pre|caption|input|textarea|button|body|br)[^>]*>/', "\n\n", $linea);
+
+  preg_match('|<title>([^<]*?)</title>|is', $linea, $matchtitle);
+  $title = check_plain($matchtitle[1]);
+  if (empty($title)) {
+    return FALSE;
+  }
+
+  $linea = strip_tags($linea, '<a>'); // just keep the tag we need
+
+  $p = explode("\n\n", $linea);
+
+  $preg_target = preg_quote($pagelinkedto);
+
+  foreach ($p as $para) {
+    if (strpos($para, $pagelinkedto) !== FALSE) { // it exists, but is it a link?
+      preg_match('|<a[^>]+?'. $preg_target .'[^>]*>([^>]+?)</a>|', $para, $context);
+
+      // If the URL isn't in a link context, keep looking
+      if (empty($context)) {
+        continue;
+      }
+
+      // We're going to use this fake tag to mark the context in a bit
+      // the marker is needed in case the link text appears more than once in the paragraph
+      //I edited <wpcontext></wpcontext> to <dpcontext></dpcontext> so it becomes more Drupal-ish!
+      $excerpt = preg_replace('|\</?dpcontext\>|', '', $para);
+
+
+      // prevent really long link text
+      $limit = 200;
+      if (drupal_strlen($context[1]) > $limit) {
+        $context[1] = drupal_substr($context[1], 0, $limit) .' …';
+      }
+
+      $marker = '<dpcontext>'. $context[1] .'</dpcontext>'; // set up our marker
+      $excerpt = str_replace($context[0], $marker, $excerpt); // swap out the link for our marker
+      $excerpt = strip_tags($excerpt, '<dpcontext>'); // strip all tags but our context marker
+      $excerpt = trim($excerpt);
+      $preg_marker = preg_quote($marker);
+      $excerpt = preg_replace("|.*?\s(.{0,$limit}$preg_marker.{0,$limit})\s.*|s", '$1', $excerpt);
+      $excerpt = strip_tags($excerpt); // YES, again, to remove the marker wrapper
+
+      break;
+    }
+  }
+  return $excerpt;
+}
diff --git a/modules/vinculum_pingback/vinculum_pingback.module b/modules/vinculum_pingback/vinculum_pingback.module
index 434a439..07b0c3b 100755
--- a/modules/vinculum_pingback/vinculum_pingback.module
+++ b/modules/vinculum_pingback/vinculum_pingback.module
@@ -69,8 +69,11 @@ function vinculum_pingback_vinculum_handler() {
  * @ingroup vinculum
  */
 function vinculum_pingback_vinculum_send($target, $source, $node) {
+  //$source = url("node/{$node->nid}", array('absolute' => TRUE));
+  $source = url($source, array('absolute' => TRUE, 'alias' => TRUE));
   // Check whether the remote target supports pingbacks.
   if ($xmlrpc_endpoint = vinculum_pingback_target_supports_pingback($target)) {
+    //@REMOVE drupal_set_message(t('Pingback supported to @target', array('@target' => $target, '@source' => $source,)));
     $methods = array(
       'pingback.ping' => array($source, $target),
     );
@@ -79,8 +82,10 @@ function vinculum_pingback_vinculum_send($target, $source, $node) {
       $params = array(
         '%source' => $source,
         '%target' => $target,
+        '@result' => $result,
       );
-      watchdog('pingback', 'Pingback to %target from %source succeeded.', $params, WATCHDOG_INFO);
+      watchdog('Pingback', 'Pingback to %target from %source succeeded.<br/>Return value: @result.', $params, WATCHDOG_INFO);
+      //@REMOVE drupal_set_message(t('Pingback to %target from %source succeeded.<br/>Return value: @result.', $params));
       return TRUE;
     }
     else {
@@ -90,7 +95,8 @@ function vinculum_pingback_vinculum_send($target, $source, $node) {
         '@errno' => xmlrpc_errno(),
         '@description' => xmlrpc_error_msg(),
       );
-      watchdog('pingback', 'Pingback to %target from %source failed.<br />Error @errno: @description', $params, WATCHDOG_WARNING);
+      watchdog('Pingback', 'Pingback to %target from %source failed.<br />Error @errno: @description', $params, WATCHDOG_WARNING);
+      //@REMOVE drupal_set_message(t('Pingback to %target from %source failed.<br />Error @errno: @description', $params), 'warning');
       return FALSE;
     }
   }
@@ -194,14 +200,20 @@ function vinculum_pingback_receive_pingback($sourceURI, $targetURI) {
     'origin_ip' => ip_address(),
   );
 
+  watchdog('Pingback', 'Pingback received from %source to %target.', array('%source' => $sourceURI, '%target' => $targetURI), WATCHDOG_DEBUG);
+
+  // very stupid, but gives time to the 'from' server to publish !
+  sleep(1);
+
   // Attempt to save the pingback.  Non-zero results indicate an error.
   if ($result = vinculum_pingback_save_pingback($pingback)) {
     // Lookup the error message from the error-code, and return an xmlrpc error.
     $error_message = _vinculum_pingback_get_error_message($result);
+    watchdog('Pingback', 'Pingback receive error from %source to %target. Error: @result<br/>Message: @msg', array('@msg' => $error_message, '@result' => $result, '%source' => $sourceURI, '%target' => $targetURI), WATCHDOG_WARNING);
     return xmlrpc_server_error($result, $error_message);
   }
 
-  $message = t('Pingback from @source to @target registered.', array('@source' => $sourceURI, '@target' => $targetURI));
+  $message = t('Pingback from @source to @target registered by Drupal Vinculum. Keep the web talking! :-)', array('@source' => $sourceURI, '@target' => $targetURI));
   return $message;
 }
 
diff --git a/modules/vinculum_trackback/vinculum_trackback.module b/modules/vinculum_trackback/vinculum_trackback.module
index b933d5d..670f4eb 100644
--- a/modules/vinculum_trackback/vinculum_trackback.module
+++ b/modules/vinculum_trackback/vinculum_trackback.module
@@ -124,7 +124,9 @@ function vinculum_trackback_send_trackback($endpoint_url, $params) {
   );
   $result = drupal_http_request($endpoint_url, $options);
 
-  if ($result->data) {
+  //@FIXED
+  //Notice: Undefined property: stdClass::$data in vinculum_trackback_send_trackback() (line 127 of /vinculum/modules/vinculum_trackback/vinculum_trackback.module).
+  if (!empty($result->data)) {
     list($error, $message) = _vinculum_trackback_parse_response($result->data);
 
     // Log the error.
@@ -135,6 +137,7 @@ function vinculum_trackback_send_trackback($endpoint_url, $params) {
         '!verbose_output' => filter_xss(str_replace("\n", "<br />\n", htmlentities($result->data))),
       );
       watchdog('Trackback', 'Trackback response for endpoint %url could not be parsed as XML.<br />!verbose_output', $params, WATCHDOG_DEBUG);
+      //@REMOVE drupal_set_message(t('Trackback response for endpoint %url could not be parsed as XML.<br />!verbose_output', $params), 'warning');
     }
     elseif ($error && $message) {
       $params = array(
@@ -142,14 +145,24 @@ function vinculum_trackback_send_trackback($endpoint_url, $params) {
         '!verbose_output' => filter_xss(str_replace("\n", "<br />\n", htmlentities($message))),
       );
       watchdog('Trackback', 'Trackback failed for endpoint %url with the message:<br />!verbose_output', $params, WATCHDOG_DEBUG);
+      //@REMOVE drupal_set_message(t('Trackback failed for endpoint %url with the message:<br />!verbose_output', $params), 'warning');
     }
     elseif ($error) {
       $params = array(
         '%url' => $endpoint_url,
       );
       watchdog('Trackback', 'Trackback failed for endpoint %url. No error message was provided.', $params, WATCHDOG_DEBUG);
+      //@REMOVE drupal_set_message(t('Trackback failed for endpoint %url. No error message was provided.', $params), 'warning');
     }
 
+    if ($error === FALSE) {
+      $params = array(
+        '%url' => $endpoint_url,
+        '!verbose_output' => filter_xss(str_replace("\n", "<br />\n", htmlentities($message))),
+      );
+      watchdog('Trackback', 'Trackback for endpoint %url succeeded: <br />!verbose_output.', $params, WATCHDOG_DEBUG);
+      //@REMOVE drupal_set_message(t('Trackback for endpoint %url succeeded: <br />!verbose_output.', $params));
+    }
     return ($error === FALSE);
   }
 }
@@ -217,6 +230,29 @@ function _vinculum_get_trackback_endpoint($node) {
 }
 
 /**
+ * Write the auto auto-discover Trackback descripton.
+ *
+ * @param Object $url
+ *   URL that supports auto-discovery.
+ * @param Object $node
+ *   A drupal node.
+ *
+ * @return String
+ * The URL of the Trackback endpoint.
+ */
+function _vinculum_add_trackback_autodiscovery_metadata_description($url, $node) {
+  // Get the Trackback endpoint for this specific node.
+  $tb_url = _vinculum_get_trackback_endpoint($node);
+
+  $rdf_text = "\t" . '<rdf:Description';
+  $rdf_text .= ' rdf:about="' . $url . '"';
+  $rdf_text .= ' dc:identifier="' . $url . '"';
+  $rdf_text .= ' dc:title="' . strtr(check_plain($node->title), array('--' => '&mdash;')) . '"';
+  $rdf_text .= ' trackback:ping="' . $tb_url . '" />' . "\n";
+  return $rdf_text;
+}
+
+/**
  * Add the RDF meta-data which allows third-party sites to auto-discover
  * Trackback support.
  *
@@ -226,17 +262,18 @@ function _vinculum_add_trackback_autodiscovery_metadata($node) {
 
   // Get the canonical URL to this node.
   $url = url("node/{$node->nid}", array('absolute' => TRUE));
-
-  // Get the Trackback endpoint for this specific node.
-  $tb_url = _vinculum_get_trackback_endpoint($node);
+  // Get the short URL to this node
+  $short_url = url("node/{$node->nid}", array('absolute' => TRUE, 'alias' => TRUE));
 
   $rdf_text = "\n<!--\n";
   $rdf_text .= '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">' . "\n";
-  $rdf_text .= "\t" . '<rdf:Description';
-  $rdf_text .= ' rdf:about="' . $url . '"';
-  $rdf_text .= ' dc:identifier="' . $url . '"';
-  $rdf_text .= ' dc:title="' . strtr(check_plain($node->title), array('--' => '&mdash;')) . '"';
-  $rdf_text .= ' trackback:ping="' . $tb_url . '" />' . "\n";
+  $rdf_text .= _vinculum_add_trackback_autodiscovery_metadata_description($url, $node);
+  if ($short_url != $url) {
+    // Add also the basic short URL node/nid in order to accept auto-discovery
+    // of this URL. Remote sites may link to node/nid in order to be robust
+    // against alias changes.
+    $rdf_text .= _vinculum_add_trackback_autodiscovery_metadata_description($short_url, $node);
+  }
   $rdf_text .= '</rdf:RDF>';
   $rdf_text .= "\n-->\n";
 
diff --git a/modules/vinculum_trackback/vinculum_trackback.pages.inc b/modules/vinculum_trackback/vinculum_trackback.pages.inc
index fd1b365..bb40eb1 100755
--- a/modules/vinculum_trackback/vinculum_trackback.pages.inc
+++ b/modules/vinculum_trackback/vinculum_trackback.pages.inc
@@ -9,6 +9,9 @@
  */
 function vinculum_trackback_receive($node) {
 
+  // very stupid, but gives time to the 'from' server to publish !
+  sleep(1);
+
   // Validate the incoming trackback data.
   if (!_vinculum_trackback_is_request_valid()) {
     // Log the failure.
@@ -24,8 +27,9 @@ function vinculum_trackback_receive($node) {
     $params = array(
       '%method' => $_SERVER['REQUEST_METHOD'],
       '!node' => l($node->title, "node/{$node->nid}"),
+      '@err' => $err,
     );
-    watchdog('Trackback', 'Received an invalid trackback request for !node.' . $err, $params, WATCHDOG_DEBUG);
+    watchdog('Trackback', 'Received an invalid trackback request for !node. @err', $params, WATCHDOG_DEBUG);
 
     // Abort early for invalid requests.
     $msg = t('Malformed Trackback request: requests must use POST and provide a url.  See http://www.sixapart.com/pronet/docs/trackback_spec#Sending_a_TrackBack_Ping');
diff --git a/modules/vinculum_trackback/vinculum_trackback_autodiscovery.module b/modules/vinculum_trackback/vinculum_trackback_autodiscovery.module
index ee780d6..25f3e76 100644
--- a/modules/vinculum_trackback/vinculum_trackback_autodiscovery.module
+++ b/modules/vinculum_trackback/vinculum_trackback_autodiscovery.module
@@ -23,10 +23,10 @@ function vinculum_trackback_autodiscovery_vinculum_send($target, $source, $node)
   // Use auto-discovery to check that the external URL supports trackback.
   if ($trackback_endpoint_url = vinculum_trackback_autodiscovery_autodetect_trackback_support($target)) {
     $params = array(
-      'url' => url("node/{$node->nid}", array('absolute' => TRUE)), 
+      'url' => url("node/{$node->nid}", array('absolute' => TRUE)),
       'title' => $node->title,
       // @TODO: extract an excerpt.
-      // 'excerpt' => 
+      // 'excerpt' =>
     );
 
     // Allow other modules to change the data sent to the remote site, via
diff --git a/modules/vinculum_trigger/vinculum_trigger.module b/modules/vinculum_trigger/vinculum_trigger.module
index 27444ea..68be69f 100644
--- a/modules/vinculum_trigger/vinculum_trigger.module
+++ b/modules/vinculum_trigger/vinculum_trigger.module
@@ -23,8 +23,6 @@ function vinculum_trigger_trigger_info() {
   );
 }
 
-
-
 /**
  * Implements hook_action_info().
  */
@@ -32,7 +30,7 @@ function vinculum_trigger_action_info() {
   return array(
     'vinculum_create_comment_action' => array(
       'type' => 'vinculum',
-      'label' => t('Create comment'),
+      'label' => t('Create Vinculum comment'),
       // Available configuration for the new comments:
       // - Should comment be published?
       'configurable' => TRUE,
@@ -58,18 +56,14 @@ function vinculum_create_comment_action_form($context) {
  * Configuration form submit handler for the vinculum_create_comment_action
  * action.
  */
-function vinculum_create_comment_action__submit($form, $form_state) {
+function vinculum_create_comment_action_submit($form, $form_state) {
   return (bool) array_filter($form_state['values']['status']);
 }
 
-
-
 /**
  * Implements hook_vinculum_received_action().
  */
 function vinculum_trigger_vinculum_received_action($record) {
   // Fire the vinculum_receive trigger when a vinculum is sent.
-  drupal_set_message('DEBUG: the vinculum hook is fired.');
-  watchdog('lb', 'vinculum hook fired.');
+  watchdog('Vinculum', 'Vinculum trigger hook fired.');
 }
-
diff --git a/translations/vinculum.de.po b/translations/vinculum.de.po
new file mode 100644
index 0000000..b8bbb90
--- /dev/null
+++ b/translations/vinculum.de.po
@@ -0,0 +1,459 @@
+# German translation of Drupal (general)
+# Copyright 2011 Scito
+# Generated from files:
+#  vinculum.admin.inc
+#  vinculum.api.inc
+#  modules/vinculum_pingback/vinculum_pingback.module
+#  vinculum.module
+#  vinculum.info
+#  modules/vinculum_comment/vinculum_comment.info
+#  modules/vinculum_pingback/vinculum_pingback.info
+#  modules/vinculum_rules/vinculum_rules.info
+#  modules/vinculum_trackback/vinculum_trackback.info
+#  modules/vinculum_trackback/vinculum_trackback_autodiscovery.info
+#  modules/vinculum_trigger/vinculum_trigger.module
+#  modules/vinculum_trigger/vinculum_trigger.info
+#  vinculum.install
+#  vinculum_content_types.js
+#  modules/vinculum_comment/vinculum_comment.module
+#  modules/vinculum_trackback/vinculum_trackback.pages.inc
+#  modules/vinculum_trackback/vinculum_trackback.module
+#  modules/vinculum_trackback/vinculum_trackback_autodiscovery.module
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: vinculum 7.x-1.x-dev\n"
+"POT-Creation-Date: 2011-11-06 07:16+0100\n"
+"PO-Revision-Date: 2011-11-06 07:16+0100\n"
+"Last-Translator: Scito \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+
+#: vinculum.admin.inc:16
+msgid "Validate remote pages"
+msgstr "Überprüfe entfernte Seite"
+
+#: vinculum.admin.inc:17
+msgid "When linkbacks are received, check that the remote URL is reachable and contains a link to the referenced node."
+msgstr ""
+
+#: vinculum.admin.inc:46
+msgid "Save"
+msgstr "Speichern"
+
+#: vinculum.admin.inc:59
+msgid "Your settings have been saved."
+msgstr "Die Einstellungen wurden gespeichert."
+
+#: vinculum.admin.inc:71
+msgid "Protocol"
+msgstr ""
+
+#: vinculum.admin.inc:72
+msgid "Weight"
+msgstr "Gewichtung"
+
+#: vinculum.admin.inc:101;143
+msgid "Date"
+msgstr "Datum"
+
+#: vinculum.admin.inc:102
+msgid "From"
+msgstr ""
+
+#: vinculum.admin.inc:103;145
+msgid "Remote URL"
+msgstr ""
+
+#: vinculum.admin.inc:104;146
+msgid "Handler"
+msgstr ""
+
+#: vinculum.admin.inc:144
+msgid "Content"
+msgstr "Inhalt"
+
+#: vinculum.api.inc:35 modules/vinculum_pingback/vinculum_pingback.module:52;87;98;126;137;144;203;212
+msgid "Pingback"
+msgstr ""
+
+#: vinculum.module:65
+msgid "Über"
+msgstr ""
+
+#: vinculum.module:66
+msgid "<p>Vinculum provides the pingback and trackback protocols for sending and receiving. Auto-discovery is supported.<p><p><em>Vinculum</em> is the latin word for a link in a chain (and coincidentally the heart of a Borg ship).</p>"
+msgstr ""
+
+#: vinculum.module:67
+msgid "Configuration"
+msgstr "Konfiguration"
+
+#: vinculum.module:68
+msgid "<p>By default sending and receiving is enabled for all <a href=\"@types\">content types</a> by default. Each nodes permits to set the send and receive behavior.</p><p>Please visit the configuration pages below.</p>"
+msgstr ""
+
+#: vinculum.module:72
+msgid "The vinculum handlers are prioritised by module-weight."
+msgstr ""
+
+#: vinculum.module:85
+msgid "Administer vinculum settings"
+msgstr ""
+
+#: vinculum.module:88
+msgid "View vinculum reports"
+msgstr ""
+
+#: vinculum.module:161;208
+msgid "Vinculums"
+msgstr ""
+
+#: vinculum.module:162
+msgid "Default settings for new content:"
+msgstr ""
+
+#: vinculum.module:169;216
+msgid "Receive vinculums"
+msgstr ""
+
+#: vinculum.module:170
+msgid "Allow %type nodes to receive vinculums from third party sites."
+msgstr ""
+
+#: vinculum.module:175;221
+msgid "Send vinculums"
+msgstr ""
+
+#: vinculum.module:176
+msgid "Allow %type nodes to send vinculums to third party sites when the node is created or changed."
+msgstr ""
+
+#: vinculum.module:572;570
+msgid "Vinculum sent to !target for node !node using %handler."
+msgstr "Vinculum an !target von Node !node via %handler gesendet."
+
+#: vinculum.module:919
+msgid "%type_name: Configure vinculums"
+msgstr ""
+
+#: vinculum.module:920
+msgid "This is only available to users who already have permission to edit the content."
+msgstr ""
+
+#: vinculum.module:291;345;570;594;846;115;125 vinculum.info:0;0 modules/vinculum_comment/vinculum_comment.info:0 modules/vinculum_pingback/vinculum_pingback.info:0 modules/vinculum_rules/vinculum_rules.info:0 modules/vinculum_trackback/vinculum_trackback.info:0 modules/vinculum_trackback/vinculum_trackback_autodiscovery.info:0 modules/vinculum_trigger/vinculum_trigger.module:68 modules/vinculum_trigger/vinculum_trigger.info:0
+msgid "Vinculum"
+msgstr ""
+
+#: vinculum.module:291
+msgid "Alter URL before send from %source to %url for target %key"
+msgstr ""
+
+#: vinculum.module:345
+msgid "Vinculum received from !source to node !node by %handler."
+msgstr ""
+
+#: vinculum.module:594
+msgid "Vinculum could not be sent to <em><a href=\"@target\">@target</a></em> for node <a href=\"@node_url\">%node_title</a> - no vinculum support found."
+msgstr ""
+
+#: vinculum.module:846
+msgid "Processing node/%node for Vinculum send."
+msgstr ""
+
+#: vinculum.module:116
+msgid "Configure trackbacks and pingbacks."
+msgstr ""
+
+#: vinculum.module:126
+msgid "List vinculums sent and received."
+msgstr ""
+
+#: vinculum.module:132
+msgid "Sent"
+msgstr ""
+
+#: vinculum.module:137
+msgid "Received"
+msgstr ""
+
+#: vinculum.install:18
+msgid "Vinculum API handlers"
+msgstr ""
+
+#: vinculum.install:24
+msgid "Vinculum requires at least one enabled handler-module to function correctly."
+msgstr ""
+
+#: vinculum.install:19
+msgid "@count handler"
+msgid_plural "@count handlers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: vinculum.info:0
+msgid "An API to provide support for linkback protocols such as pingback and trackback."
+msgstr ""
+
+#: vinculum_content_types.js:0
+msgid "Send and receive"
+msgstr ""
+
+#: vinculum_content_types.js:0
+msgid "Send only"
+msgstr ""
+
+#: vinculum_content_types.js:0
+msgid "Receive only"
+msgstr ""
+
+#: vinculum_content_types.js:0
+msgid "Disabled"
+msgstr "Deaktiviert"
+
+#: modules/vinculum_comment/vinculum_comment.module:21
+msgid "<p>Pingback: !blog_url.</p>"
+msgstr ""
+
+#: modules/vinculum_comment/vinculum_comment.module:35;73
+msgid "Blog posting on @url"
+msgstr "Blogreaktion auf @url"
+
+#: modules/vinculum_comment/vinculum_comment.module:63
+msgid "<p>Trackback: !blog_url.</p>"
+msgstr ""
+
+#: modules/vinculum_comment/vinculum_comment.info:0
+msgid "Vinculum action - Comment"
+msgstr "Vinculum action - Kommentar"
+
+#: modules/vinculum_comment/vinculum_comment.info:0
+msgid "Add a comment when a vinculum is received."
+msgstr ""
+"Füge einen Kommentar beim Erhalt eins Vinculums (Pingback oder "
+"Trackback) hinzu."
+
+#: modules/vinculum_pingback/vinculum_pingback.module:161
+msgid "Handles pingback pings."
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:216
+msgid "Pingback from @source to @target registered by Drupal Vinculum. Keep the web talking! :-)"
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:326
+msgid "sourceURI not found."
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:327
+msgid "sourceURI does not contain a link to this site."
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:328
+msgid "targetURI could not be found."
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:329
+msgid "targetURI does not support pingbacks."
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:330
+msgid "The pingback has already been added."
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:336 modules/vinculum_trackback/vinculum_trackback.pages.inc:78
+msgid "An unknown error occurred."
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:87
+msgid "Pingback to %target from %source succeeded.<br/>Return value: @result."
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:98
+msgid "Pingback to %target from %source failed.<br />Error @errno: @description"
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:126
+msgid "Pingback auto-discovery is supported on %url, with the Pingback endpoint %endpoint.<br />(using X-PINGBACK HTTP header)."
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:137
+msgid "Pingback auto-discovery is supported on %url, with the Pingback endpoint %endpoint.<br />(using &lt;link rel=\"pingback\"&gt; tag)."
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:144
+msgid "Pingback auto-discovery is not supported on %url."
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:203
+msgid "Pingback received from %source to %target."
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.module:212
+msgid "Pingback receive error from %source to %target. Error: @result<br/>Message: @msg"
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.info:0
+msgid "Vinculum handler - Pingback"
+msgstr ""
+
+#: modules/vinculum_pingback/vinculum_pingback.info:0
+msgid "Provides the Pingback protocol for the Vinculum module."
+msgstr ""
+
+#: modules/vinculum_rules/vinculum_rules.info:0
+msgid "Vinculum action - rules"
+msgstr ""
+
+#: modules/vinculum_rules/vinculum_rules.info:0
+msgid "Integrate with the rules module to carry out actions when vinculums are received."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.pages.inc:35
+msgid "Malformed Trackback request: requests must use POST and provide a url.  See http://www.sixapart.com/pronet/docs/trackback_spec#Sending_a_TrackBack_Ping"
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.pages.inc:58
+msgid "Trackbacks are not allowed for this page."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.pages.inc:63
+msgid "The Trackback has already been registered."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.pages.inc:68
+msgid "Your page @remote_url could not be reached."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.pages.inc:73
+msgid "Your page @remote_url must include a link to the page on this site @local_url."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.pages.inc:32;48;57;62;67;72;77 modules/vinculum_trackback/vinculum_trackback.module:139;147;154;163 modules/vinculum_trackback/vinculum_trackback_autodiscovery.module:80;90;94;98;128;131
+msgid "Trackback"
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.pages.inc:32
+msgid "Received an invalid trackback request for !node. @err"
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.pages.inc:48
+msgid "Received a successful trackback request for !node."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.pages.inc:57
+msgid "Trackback request failed for !node: trackback-receive not enabled."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.pages.inc:62
+msgid "Trackback request failed for !node: trackback previously registered."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.pages.inc:67
+msgid "Trackback request failed for !node: trackback URL %remote_url not accessible."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.pages.inc:72
+msgid "Trackback request failed for !node: trackback URL %remote_url does not link to the node."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.pages.inc:77
+msgid "Trackback request failed for !node: unknown error."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.module:139
+msgid "Trackback response for endpoint %url could not be parsed as XML.<br />!verbose_output"
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.module:147
+msgid "Trackback failed for endpoint %url with the message:<br />!verbose_output"
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.module:154
+msgid "Trackback failed for endpoint %url. No error message was provided."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.module:163
+msgid "Trackback for endpoint %url succeeded: <br />!verbose_output."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.module:17
+msgid "Trackbacks"
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback_autodiscovery.module:12
+msgid "Trackback auto-discovery"
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback_autodiscovery.module:80
+msgid "Trackback auto-discovery not attempted: an error occurred when making a GET request for %url."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback_autodiscovery.module:90
+msgid "Trackback auto-discovery not checked on %url - the html cannot be parsed."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback_autodiscovery.module:94
+msgid "Trackback auto-discovery is not supported on %url."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback_autodiscovery.module:98
+msgid "Trackback auto-discovery is supported on %url, with the Trackback endpoint %endpoint."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback_autodiscovery.module:128
+msgid "Trackback auto-discovery not attempted: an error occurred when making a HEAD request for %url."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback_autodiscovery.module:131
+msgid "Trackback auto-discovery not attempted: %url does not appear to be a web page."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.info:0
+msgid "Vinculum handler - Trackback API"
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback.info:0
+msgid "Provides an API for using the Trackback protocol for the Vinculum module."
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback_autodiscovery.info:0
+msgid "Vinculum handler - Trackback autodiscovery"
+msgstr ""
+
+#: modules/vinculum_trackback/vinculum_trackback_autodiscovery.info:0
+msgid "Automatically discover support for the Trackback protocol and send trackbacks."
+msgstr ""
+"Suche automatische die Unterstützung für das Trackback Protokoll und "
+"sende einen Trackback."
+
+#: modules/vinculum_trigger/vinculum_trigger.module:20
+msgid "When a new vinculum is received"
+msgstr "Wenn ein neues Vinculum (Pingback oder Trackback) erhalten wurde"
+
+#: modules/vinculum_trigger/vinculum_trigger.module:33
+msgid "Create Vinculum comment"
+msgstr ""
+
+#: modules/vinculum_trigger/vinculum_trigger.module:47
+msgid "Published"
+msgstr "Veröffentlicht"
+
+#: modules/vinculum_trigger/vinculum_trigger.module:68
+msgid "Vinculum trigger hook fired."
+msgstr "Vinculum Trigger Hook gefeuert."
+
+#: modules/vinculum_trigger/vinculum_trigger.info:0
+msgid "Vinculum action - Trigger"
+msgstr "Vinculum Aktion - Trigger"
+
+#: modules/vinculum_trigger/vinculum_trigger.info:0
+msgid "Integrate with the core trigger module to carry out actions when vinculums are received."
+msgstr ""
+"Integriere mit dem Core Trigger Modul um Aktion beim Erhalt von "
+"Vinculums (Pingbacks oder Trackbacks) auszuführen."
+
diff --git a/vinculum.admin.inc b/vinculum.admin.inc
index b6898a7..5b28cc0 100755
--- a/vinculum.admin.inc
+++ b/vinculum.admin.inc
@@ -18,6 +18,12 @@ function vinculum_settings_form($form) {
     '#default_value' => variable_get('vinculum_validate_remote_pages', FALSE),
   );
 
+  $form['vinculum_cron_send'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Ping in cron'),
+    '#description' => t('Send Vinculums (pingbacks und trackbacks) asynchronously with cron.'),
+    '#default_value' => variable_get('vinculum_cron_send', TRUE),
+  );
 
   // Fetch a list of the available handlers (and reset the cache to ensure it's
   // always current on this page).
@@ -55,6 +61,7 @@ function vinculum_settings_form_submit(&$form, &$form_state) {
   $weights = $form_state['values']['handlers'];
   vinculum_set_weights($weights);
   variable_set('vinculum_validate_remote_pages', (bool) $form_state['values']['vinculum_validate_remote_pages']);
+  variable_set('vinculum_cron_send', (bool) $form_state['values']['vinculum_cron_send']);
 
   drupal_set_message(t('Your settings have been saved.'));
 }
diff --git a/vinculum.info b/vinculum.info
index 80e34c1..bbc5720 100755
--- a/vinculum.info
+++ b/vinculum.info
@@ -1,8 +1,12 @@
 name = Vinculum
 description = An API to provide support for linkback protocols such as pingback and trackback.
 core = 7.x
+
 package = Vinculum
-files[] = vinculum.module
-files[] = vinculum.class.inc
-files[] = vinculum.test
 configure = admin/config/content/vinculum
+
+; Information added by drupal.org packaging script on 2012-05-21
+version = "7.x-1.x-dev"
+core = "7.x"
+project = "vinculum"
+datestamp = "1342376056"
diff --git a/vinculum.install b/vinculum.install
index 1861173..42c1656 100755
--- a/vinculum.install
+++ b/vinculum.install
@@ -15,7 +15,7 @@ function vinculum_requirements($phase) {
       // Vinculum is an API which requires at least one handler.
       $handlers = vinculum_get_handler();
       $requirements['vinculum'] = array(
-        'title' => t('Vinculum API handlers'), 
+        'title' => t('Vinculum API handlers'),
         'value' => format_plural(count($handlers), '@count handler', '@count handlers'),
       );
 
diff --git a/vinculum.module b/vinculum.module
index 9e97e54..3618957 100755
--- a/vinculum.module
+++ b/vinculum.module
@@ -62,13 +62,14 @@ function vinculum_help($path, $arg) {
   switch ($path) {
     // Main help for the Vinculum module.
     case 'admin/help#vinculum':
-      break;
+      return '<h3>' . t("About") . '</h3>' .
+      t('<p>Vinculum provides the pingback and trackback protocols for sending and receiving. Auto-discovery is supported.<p><p><em>Vinculum</em> is the latin word for a link in a chain (and coincidentally the heart of a Borg ship).</p>') .
+      '<h3>' . t("Configuration") . '</h3>' .
+      t('<p>By default sending and receiving is enabled for all <a href="@types">content types</a> by default. Each nodes permits to set the send and receive behavior.</p><p>Please visit the configuration pages below.</p>', array('@types' => url('admin/structure/types')));
 
     // The configuration page.
     case 'admin/config/content/vinculum':
-      $output = '';
-      $output .= '<p>' . t('The vinculum handlers are prioritised by module-weight.') . '</p>';
-      return $output;
+      return '<p>' . t('The vinculum handlers are prioritised by module-weight.') . '</p>';
   }
 }
 
@@ -264,8 +265,6 @@ function vinculum_node_update($node) {
   _vinculum_node_save($node);
 }
 
-
-
 /**
  * Implements hook_vinculum_get_external_links().
  * Gets all the URLs found in the body field of a node.
@@ -275,7 +274,23 @@ function vinculum_node_update($node) {
  */
 function vinculum_vinculum_get_external_links($node) {
   $text = _vinculum_extract_text($node);
-  return _vinculum_extract_urls($text);
+  $links = _vinculum_extract_urls($text);
+  // Only external urls
+  global $base_url;
+  $self_url = preg_quote($base_url);
+// Anonymos functions (closures) are only available since PHP 5.3.0,
+// so keep compatibility with PHP 5.2.
+// $links = array_filter($links, function ($element) use ($self_url) {
+//   return preg_match("|^$self|", $element) != 1;
+// } );
+  foreach ($links as $key => $element) {
+    if(preg_match("|^$self_url|", $element) == 1) {
+      unset($links[$key]);
+    }
+  }
+  //@REMOVE dpm($links, '$links');
+
+  return $links;
 }
 
 /**
@@ -288,13 +303,13 @@ function vinculum_vinculum_link_send_alter(&$links, $node) {
   foreach ($links as $key => $record) {
     $language = (isset($node->language)) ? $node->language : LANGUAGE_NONE;
     if ($url = drupal_lookup_path('alias', $record->source, $language)) {
+      watchdog('Vinculum', "Alter URL before send from %source to %url for target %key", array('%key' => $key, '%url' => $url, '%source' => $record->source), WATCHDOG_DEBUG);
       $links[$key]->source = $url;
     }
   }
 }
 
 
-
 /**********************************************************
  * Public API functions.
  *********************************************************/
@@ -342,12 +357,13 @@ function vinculum_receive(vinculum $vinculum) {
     ))
     ->execute();
 
+  watchdog('Vinculum', 'Vinculum received from !source to node !node by %handler.', array('!source' => l($vinculum->url, $vinculum->url), '!node' => l('node/' . $vinculum->nid, 'node/' . $vinculum->nid), '%handler' => $vinculum->handler), WATCHDOG_INFO);
+
   // Fire hook_vinculum_received_action().
   // Actions are implemented through:
   // - vinculum_trigger - supports the core trigger module.
   // - vinculum_rules - integrates with the rules module.
   module_invoke_all('vinculum_received_action', $vinculum);
-
 }
 
 
@@ -385,19 +401,24 @@ function vinculum_receive_validate(vinculum $vinculum) {
   if (variable_get('vinculum_validate_remote_pages', FALSE)) {
     // Validate that the remote node is reachable.
     $result = drupal_http_request($vinculum->url);
+    watchdog('Vinculum', "Validate on source page: %url", array('%url' => $vinculum->url,), WATCHDOG_DEBUG);
 
     // Treat all HTTP errors (inc Forbidden) as remote URL not found.
-    if ($result->error) {
+    //@FIXED:
+    // Notice: Undefined property: stdClass::$error in vinculum_receive_validate() (Zeile 390 von vinculum/vinculum.module).
+    if (!empty($result->error)) {
       return VINCULUM_ERROR_REMOTE_URL_NOT_FOUND;
     }
 
     // Check the content for a link to the local node.
     $content = $result->data;
     // Extract all the URLs from the page content.
+    watchdog('Vinculum', "Source content: %content", array('%content' => $content,), WATCHDOG_DEBUG);
     $urls = _vinculum_extract_urls($content);
+    watchdog('Vinculum', "URLs: %urls", array('%urls' => print_r($urls, true),), WATCHDOG_DEBUG);
     $matched = FALSE;
     foreach ($urls as $url) {
-      if ($nid = vinculum_lookup_nid($url)) {
+      if ((preg_match("|^$self_url|", $element) == 1) && ($nid = vinculum_lookup_nid($url))) {
         $matched = TRUE;
         break;
       }
@@ -412,7 +433,6 @@ function vinculum_receive_validate(vinculum $vinculum) {
   return VINCULUM_VALIDATES;
 }
 
-
 /**
  * Parse a node and send vinculums to the discovered URLs (which haven't
  * already recorded a successful vinculum).
@@ -422,11 +442,13 @@ function vinculum_receive_validate(vinculum $vinculum) {
  *
  * @param Object $node
  * A fully loaded node object (or one which is in the process of being saved).
+ * @param Boolean $message
+ * TRUE if a message should printed to the user, FALSE otherwise.
  */
-function vinculum_node_process($node) {
+function vinculum_node_process($node, $message = TRUE) {
   // Look for external links.
   $links = vinculum_get_external_links($node);
-  vinculum_send_vinculums($links, $node);
+  vinculum_send_vinculums($links, $node, $message);
 }
 
 /**
@@ -478,14 +500,17 @@ function vinculum_get_external_links($node) {
   return $links;
 }
 
-
 /**
  * Invoke vinculum handlers on each external link to record a vinculum.
  *
  * @param Array $links
  * An array of external URLs.
+ * @param Object $node
+ * The local node object.
+ * @param Boolean $message
+ * TRUE if a message should printed to the user, FALSE otherwise.
  */
-function vinculum_send_vinculums($links, $node) {
+function vinculum_send_vinculums($links, $node, $message = TRUE) {
   // The initial source URL is defined as node/xxx.  The vinculum module
   // provides an implementation of hook_vinculum_link_send_alter for the path
   // module to support node-aliases.
@@ -508,7 +533,7 @@ function vinculum_send_vinculums($links, $node) {
 
   foreach ($records as $record) {
     if (!vinculum_is_sent($node->nid, $record->target)) {
-      vinculum_send_single_vinculum($record->source, $record->target, $node);
+      vinculum_send_single_vinculum($record->source, $record->target, $node, $message);
     }
   }
 }
@@ -522,11 +547,13 @@ function vinculum_send_vinculums($links, $node) {
  * The URL of the remote page.
  * @param Object $node
  * The local node object.
+ * @param Boolean $message
+ * TRUE if a message should printed to the user, FALSE otherwise.
  *
  * @return Boolean
  * TRUE if the remote server accepts the vinculum request.
  */
-function vinculum_send_single_vinculum($source, $target, $node) {
+function vinculum_send_single_vinculum($source, $target, $node, $message = TRUE) {
   // Record the timestamp of this attempt in the {node_vinculum_sent} table.
   // This allows vinculums which have not been successful to be re-attempted
   // periodically.
@@ -553,12 +580,15 @@ function vinculum_send_single_vinculum($source, $target, $node) {
     // If the handler reports success, log this as a successful request.
     if ($success) {
       $params = array(
-        '%target'     => $target,
-        '@node_url'   => url("node/{$node->nid}"),
+        '!target'     => l($target, $target),
+        '!node'   => l($node->title, "node/{$node->nid}"),
         '%node_title' => $node->title,
         '%handler'    => $handler->module,
       );
-      watchdog('Vinculum', 'Vinculum sent to %target for node <a href="@node_url">%node_title</a> using %handler.', $params, WATCHDOG_DEBUG);
+      watchdog('Vinculum', 'Vinculum sent to !target for node !node using %handler.', $params, WATCHDOG_INFO);
+      if ($message) {
+        drupal_set_message(t('Vinculum sent to !target for node !node using %handler.', $params));
+      }
 
       db_merge('node_vinculum_sent')
         ->key(array(
@@ -575,15 +605,14 @@ function vinculum_send_single_vinculum($source, $target, $node) {
   }
 
   $params = array(
-    '%target'     => $target,
+    '@target'     => $target,
     '@node_url'   => url("node/{$node->nid}"),
     '%node_title' => $node->title,
   );
-  watchdog('Vinculum', 'Vinculum could not be sent to %target for node <a href="@node_url">%node_title</a> - no vinculum support found.', $params, WATCHDOG_DEBUG);
+  watchdog('Vinculum', 'Vinculum could not be sent to <em><a href="@target">@target</a></em> for node <a href="@node_url">%node_title</a> - no vinculum support found.', $params, WATCHDOG_DEBUG);
   return FALSE;
 }
 
-
 /**
  * Fetch the node nid from a local URL.
  *
@@ -734,7 +763,6 @@ function vinculum_set_weights($weights) {
 }
 
 
-
 /**********************************************************
  * Private API handlers.
  *********************************************************/
@@ -769,6 +797,11 @@ function _vinculum_node_get_settings($nids) {
  * vinculums as needed.
  */
 function _vinculum_node_save($node) {
+  // Unpublished nodes cannot communicate, abort the Vinculum sending process.
+  if ($node->status == 0) {
+    return FALSE;
+  }
+
   // If a custom send/receive setting has not been provided, use the default
   // setting for this node-type.
   $settings = array(
@@ -788,10 +821,53 @@ function _vinculum_node_save($node) {
     ))
     ->execute();
 
+  // vinculum_node_process($node) cannot be called now as on node creation
+  // the node is not yet published and accessible. We are in the middle of
+  // the creation process.
+  // Do it in hook_exit or hook_cron as the Pingback Drupal 6 module.
+  if ($settings['send'] && !variable_get('vinculum_cron_send', TRUE)) {
+    global $_vinculum_nid;
+    $_vinculum_nid = $node->nid;
+    //@REMOVE dpm($_vinculum_nid, '_vinculum_node_save $_vinculum_nid');
+  } else { //mode == 'cron'
+    //queue this nid in variable pingback_nid_queue, but take care for not queuing existing nids
+    $q = variable_get('vinculum_nid_queue', array());
+    if (!in_array($node->nid, $q)) {
+      $q[] = $node->nid;
+      variable_set('vinculum_nid_queue', $q);
+    }
+    //dpm($q, '_vinculum_node_save $q');
+    watchdog('Vinculum', "Queued nodes for cron send: %node", array('%node' => implode(', ', $q),), WATCHDOG_DEBUG);
+  }
+}
 
-  if ($settings['send']) {
-    // TODO: do this now or later?
-    vinculum_node_process($node);
+/**
+* Implementation of hook_cron().
+* Adapted from Pingback Drupal 6 module.
+*/
+function vinculum_cron() {
+  $q = variable_get('vinculum_nid_queue', array());
+  $limit = variable_get('vinculum_check_per_cron', 10);
+  $count = 0;
+  while (($nid = array_shift($q)) && ($count++ < $limit)) {
+    $node = node_load($nid);
+    watchdog('Vinculum', "Processing node/%node for Vinculum cron send.", array('%node' => $nid,), WATCHDOG_DEBUG);
+    vinculum_node_process($node, FALSE);
+  }
+  variable_set('vinculum_nid_queue', $q);
+}
+
+/**
+* Implementation of hook_exit().
+* Adapted from Pingback Drupal 6 module.
+*/
+function vinculum_exit() {
+  global $_vinculum_nid;
+  if (!empty($_vinculum_nid)) {
+    watchdog('Vinculum', "Processing node/%node for Vinculum send.", array('%node' => $_vinculum_nid,), WATCHDOG_DEBUG);
+    // Reset the node_load() cache.
+    $node = node_load($_vinculum_nid, NULL, TRUE);
+    vinculum_node_process($node, variable_get('vinculum_notify_successful_pings', 1));
   }
 }
 
@@ -898,13 +974,15 @@ function _vinculum_extract_text($node) {
 }
 
 /**
- * Extract all the external URLs from a single string.
+ * Extract all the URLs from a single string.
+ * TODO This method should be replaced with _vinculum_extract_domain_or_external_urls
  */
 function _vinculum_extract_urls($text) {
   // Check for the href value of explicit <a> tags, and remove the text found
   // within the <a> tags (because the "Convert URLs into links" filter may
   // shorten <a> text, making uniqueness difficult).
-  $pattern = "#<a [^>]*?href=([\"'])([^\\1]+?)\\1[^>]*?>.*?</a>#ms";
+
+  $pattern = "#<a\s[^>]*?href=([\"'])([^\\1]+?)\\1[^>]*?>.*?</a>#ms";
   preg_match_all($pattern, $text, $matches);
 
   // Matches:
@@ -919,8 +997,30 @@ function _vinculum_extract_urls($text) {
   // Regexp is stolen from trackback.module ;)
   preg_match_all("/(http|https):\/\/[a-zA-Z0-9@:%_~#?&=.,\/;-]*[a-zA-Z0-9@:%_~#&=\/;-]/", $text, $matches);
 
-  // TODO: check that the URLs are external, and not local FQDN?
+  $links = array_unique(array_merge($links, $matches[0]));
+  //@REMOVE dpm($links, '$links');
 
-  $links = array_merge($links, $matches[0]);
-  return array_unique($links);
+  return $links;
+}
+
+/**
+ * Extract all the URLs pointing to from a single string.
+ * $domain = 1: only urls from this domain
+ * $domain = 0: only external urls
+ * TODO not tested
+ */
+function _vinculum_extract_domain_or_external_urls($text, $domain) {
+  // Only external urls
+  global $base_url;
+  $self_url = preg_quote($base_url);
+
+  $document = filter_dom_load($text);
+  $links = $document->getElementsByTagName('a');
+  $urls = array();
+  foreach ($links as $a) {
+    if ($href = $a->getAttribute('href') && preg_match("|^$self_url|", $element) == $domain) {
+      $urls[] = $href;
+    }
+  }
+  return $urls;
 }
