diff --git a/adult_smile.tgz b/adult_smile.tgz
index 59d7437c..67e2a31e 100644
Binary files a/adult_smile.tgz and b/adult_smile.tgz differ
diff --git a/dwpost/dwpost.css b/dwpost/dwpost.css
index 8edab3d9..3b0ee32a 100644
--- a/dwpost/dwpost.css
+++ b/dwpost/dwpost.css
@@ -1,15 +1,15 @@
 
-#ljpost-enable-label, #ljpost-username-label, #ljpost-password-label, #ljpost-bydefault-label {
+#dwpost-enable-label, #dwpost-username-label, #dwpost-password-label, #dwpost-bydefault-label {
 float: left;
 width: 200px;
 margin-top: 10px;
 }
 
-#ljpost-checkbox, #ljpost-username, #ljpost-password, #ljpost-bydefault {
+#dwpost-checkbox, #dwpost-username, #dwpost-password, #dwpost-bydefault {
 float: left;
 margin-top: 10px;
 }
 
-#ljpost-submit {
+#dwpost-submit {
 margin-top: 15px;
-}
\ No newline at end of file
+}
diff --git a/dwpost/dwpost.php b/dwpost/dwpost.php
index 5f8dcc73..2391b571 100644
--- a/dwpost/dwpost.php
+++ b/dwpost/dwpost.php
@@ -4,7 +4,7 @@
  * Name: Dreamwidth Post Connector
  * Description: Post to dreamwidth
  * Version: 1.0
- * Author: Tony Baldwin <http://tonybaldwin.me/friendica/profile/tony>
+ * Author: Tony Baldwin <https://free-haven.org/profile/tony>
  * Author: Michael Johnston
  * Author: Cat Gray <https://free-haven.org/profile/catness>
  */
@@ -213,7 +213,7 @@ EOT;
 		logger('dwpost: data: ' . $xml, LOGGER_DATA);
 
 		if($dw_blog !== 'test')
-			$x = post_url($dw_blog,$xml);
+			$x = post_url($dw_blog,$xml,array("Content-Type: text/xml"));
 		logger('posted to dreamwidth: ' . ($x) ? $x : '', LOGGER_DEBUG);
 
 	}
diff --git a/facebook.tgz b/facebook.tgz
index 3039b11d..783425ce 100644
Binary files a/facebook.tgz and b/facebook.tgz differ
diff --git a/facebook/facebook.php b/facebook/facebook.php
index 35338fa1..4524a486 100755
--- a/facebook/facebook.php
+++ b/facebook/facebook.php
@@ -1051,7 +1051,7 @@ function fb_consume_stream($uid,$j,$wall = false) {
 	$a = get_app();
 
 
-	$user = q("SELECT `nickname`, `blockwall` FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1",
+	$user = q("SELECT * FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1",
 		intval($uid)
 	);
 	if(! count($user))
@@ -1176,12 +1176,17 @@ function fb_consume_stream($uid,$j,$wall = false) {
 				$datarray['private'] = 1;
 				$datarray['allow_cid'] = '<' . $uid . '>';
 			}
-			
+
+			if(trim($datarray['body']) == '') {
+				logger('facebook: empty body');
+				continue;
+			}
+
 			$top_item = item_store($datarray);
 			$r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
 				intval($top_item),
 				intval($uid)
-			);			
+			);
 			if(count($r)) {
 				$orig_post = $r[0];
 				logger('fb: new top level item posted');
@@ -1308,6 +1313,47 @@ function fb_consume_stream($uid,$j,$wall = false) {
 				$cmntdata['author-avatar'] = 'https://graph.facebook.com/' . $cmnt->from->id . '/picture';
 				$cmntdata['body'] = $cmnt->message;
 				$item = item_store($cmntdata);			
+				
+				$myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 ",
+					dbesc($orig_post['uri']),
+					intval($uid)
+				);
+
+				if(count($myconv)) {
+					$importer_url = $a->get_baseurl() . '/profile/' . $user[0]['nickname'];
+
+					foreach($myconv as $conv) {
+
+						// now if we find a match, it means we're in this conversation
+	
+						if(! link_compare($conv['author-link'],$importer_url))
+							continue;
+
+						require_once('include/enotify.php');
+								
+						$conv_parent = $conv['parent'];
+
+						notification(array(
+							'type'         => NOTIFY_COMMENT,
+							'notify_flags' => $user[0]['notify-flags'],
+							'language'     => $user[0]['language'],
+							'to_name'      => $user[0]['username'],
+							'to_email'     => $user[0]['email'],
+							'uid'          => $user[0]['uid'],
+							'item'         => $cmntdata,
+							'link'		   => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $item,
+							'source_name'  => $cmntdata['author-name'],
+							'source_link'  => $cmntdata['author-link'],
+							'source_photo' => $cmntdata['author-avatar'],
+							'verb'         => ACTIVITY_POST,
+							'otype'        => 'item',
+							'parent'       => $conv_parent,
+						));
+
+						// only send one notification
+						break;
+					}
+				}
 			}
 		}
 	}
diff --git a/ijpost.tar.gz b/ijpost.tar.gz
new file mode 100644
index 00000000..4c67d491
Binary files /dev/null and b/ijpost.tar.gz differ
diff --git a/ijpost/ijpost.css b/ijpost/ijpost.css
new file mode 100644
index 00000000..8b424917
--- /dev/null
+++ b/ijpost/ijpost.css
@@ -0,0 +1,15 @@
+
+#ijpost-enable-label, #ijpost-username-label, #ijpost-password-label, #ijpost-bydefault-label {
+float: left;
+width: 200px;
+margin-top: 10px;
+}
+
+#ijpost-checkbox, #ijpost-username, #ijpost-password, #ijpost-bydefault {
+float: left;
+margin-top: 10px;
+}
+
+#ijpost-submit {
+margin-top: 15px;
+}
diff --git a/ijpost/ijpost.php b/ijpost/ijpost.php
new file mode 100644
index 00000000..d6861f46
--- /dev/null
+++ b/ijpost/ijpost.php
@@ -0,0 +1,227 @@
+<?php
+
+/**
+ * Name: Insanejournal Post Connector
+ * Description: Post to Insanejournal
+ * Version: 1.0
+ * Author: Tony Baldwin <https://free-haven.org/profile/tony>
+ * Author: Michael Johnston
+ * Author: Cat Gray <https://free-haven.org/profile/catness>
+ */
+
+function ijpost_install() {
+    register_hook('post_local',           'addon/ijpost/ijpost.php', 'ijpost_post_local');
+    register_hook('notifier_normal',      'addon/ijpost/ijpost.php', 'ijpost_send');
+    register_hook('jot_networks',         'addon/ijpost/ijpost.php', 'ijpost_jot_nets');
+    register_hook('connector_settings',      'addon/ijpost/ijpost.php', 'ijpost_settings');
+    register_hook('connector_settings_post', 'addon/ijpost/ijpost.php', 'ijpost_settings_post');
+
+}
+function ijpost_uninstall() {
+    unregister_hook('post_local',       'addon/ijpost/ijpost.php', 'ijpost_post_local');
+    unregister_hook('notifier_normal',  'addon/ijpost/ijpost.php', 'ijpost_send');
+    unregister_hook('jot_networks',     'addon/ijpost/ijpost.php', 'ijpost_jot_nets');
+    unregister_hook('connector_settings',      'addon/ijpost/ijpost.php', 'ijpost_settings');
+    unregister_hook('connector_settings_post', 'addon/ijpost/ijpost.php', 'ijpost_settings_post');
+
+}
+
+
+function ijpost_jot_nets(&$a,&$b) {
+    if(! local_user())
+        return;
+
+    $ij_post = get_pconfig(local_user(),'ijpost','post');
+    if(intval($ij_post) == 1) {
+        $ij_defpost = get_pconfig(local_user(),'ijpost','post_by_default');
+        $selected = ((intval($ij_defpost) == 1) ? ' checked="checked" ' : '');
+        $b .= '<div class="profile-jot-net"><input type="checkbox" name="ijpost_enable" ' . $selected . ' value="1" /> '
+            . t('Post to Insanejournal') . '</div>';
+    }
+}
+
+
+function ijpost_settings(&$a,&$s) {
+
+    if(! local_user())
+        return;
+
+    /* Add our stylesheet to the page so we can make our settings look nice */
+
+    $a->page['htmlhead'] .= '<link rel="stylesheet"  type="text/css" href="' . $a->get_baseurl() . '/addon/ijpost/ijpost.css' . '" media="all" />' . "\r\n";
+
+    /* Get the current state of our config variables */
+
+    $enabled = get_pconfig(local_user(),'ijpost','post');
+
+    $checked = (($enabled) ? ' checked="checked" ' : '');
+
+    $def_enabled = get_pconfig(local_user(),'ijpost','post_by_default');
+
+    $def_checked = (($def_enabled) ? ' checked="checked" ' : '');
+
+	$ij_username = get_pconfig(local_user(), 'ijpost', 'ij_username');
+	$ij_password = get_pconfig(local_user(), 'ijpost', 'ij_password');
+
+
+    /* Add some HTML to the existing form */
+
+    $s .= '<div class="settings-block">';
+    $s .= '<h3>' . t('InsaneJournal Post Settings') . '</h3>';
+    $s .= '<div id="ijpost-enable-wrapper">';
+    $s .= '<label id="ijpost-enable-label" for="ijpost-checkbox">' . t('Enable InsaneJournal Post Plugin') . '</label>';
+    $s .= '<input id="ijpost-checkbox" type="checkbox" name="ijpost" value="1" ' . $checked . '/>';
+    $s .= '</div><div class="clear"></div>';
+
+    $s .= '<div id="ijpost-username-wrapper">';
+    $s .= '<label id="ijpost-username-label" for="ijpost-username">' . t('InsaneJournal username') . '</label>';
+    $s .= '<input id="ijpost-username" type="text" name="ij_username" value="' . $ij_username . '" />';
+    $s .= '</div><div class="clear"></div>';
+
+    $s .= '<div id="ijpost-password-wrapper">';
+    $s .= '<label id="ijpost-password-label" for="ijpost-password">' . t('InsaneJournal password') . '</label>';
+    $s .= '<input id="ijpost-password" type="password" name="ij_password" value="' . $ij_password . '" />';
+    $s .= '</div><div class="clear"></div>';
+
+    $s .= '<div id="ijpost-bydefault-wrapper">';
+    $s .= '<label id="ijpost-bydefault-label" for="ijpost-bydefault">' . t('Post to InsaneJournal by default') . '</label>';
+    $s .= '<input id="ijpost-bydefault" type="checkbox" name="ij_bydefault" value="1" ' . $def_checked . '/>';
+    $s .= '</div><div class="clear"></div>';
+
+    /* provide a submit button */
+
+    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="ijpost-submit" name="ijpost-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
+
+}
+
+
+function ijpost_settings_post(&$a,&$b) {
+
+	if(x($_POST,'ijpost-submit')) {
+
+		set_pconfig(local_user(),'ijpost','post',intval($_POST['ijpost']));
+		set_pconfig(local_user(),'ijpost','post_by_default',intval($_POST['ij_bydefault']));
+		set_pconfig(local_user(),'ijpost','ij_username',trim($_POST['ij_username']));
+		set_pconfig(local_user(),'ijpost','ij_password',trim($_POST['ij_password']));
+
+	}
+
+}
+
+function ijpost_post_local(&$a,&$b) {
+
+	// This can probably be changed to allow editing by pointing to a different API endpoint
+
+	if($b['edit'])
+		return;
+
+	if((! local_user()) || (local_user() != $b['uid']))
+		return;
+
+	if($b['private'] || $b['parent'])
+		return;
+
+    $ij_post   = intval(get_pconfig(local_user(),'ijpost','post'));
+
+	$ij_enable = (($ij_post && x($_REQUEST,'ijpost_enable')) ? intval($_REQUEST['ijpost_enable']) : 0);
+
+	if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'ijpost','post_by_default')))
+		$ij_enable = 1;
+
+    if(! $ij_enable)
+       return;
+
+    if(strlen($b['postopts']))
+       $b['postopts'] .= ',';
+     $b['postopts'] .= 'ijpost';
+}
+
+
+
+
+function ijpost_send(&$a,&$b) {
+
+    if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))
+        return;
+
+    if(! strstr($b['postopts'],'ijpost'))
+        return;
+
+    if($b['parent'] != $b['id'])
+        return;
+
+	// insanejournal post in the LJ user's timezone. 
+	// Hopefully the person's Friendica account
+	// will be set to the same thing.
+
+	$tz = 'UTC';
+
+	$x = q("select timezone from user where uid = %d limit 1",
+		intval($b['uid'])
+	);
+	if($x && strlen($x[0]['timezone']))
+		$tz = $x[0]['timezone'];	
+
+	$ij_username = get_pconfig($b['uid'],'ijpost','ij_username');
+	$ij_password = get_pconfig($b['uid'],'ijpost','ij_password');
+	$ij_blog = 'http://www.insanejournal.com/interface/xmlrpc';
+
+	if($ij_username && $ij_password && $ij_blog) {
+
+		require_once('include/bbcode.php');
+		require_once('include/datetime.php');
+
+		$title = $b['title'];
+		$post = bbcode($b['body']);
+		$post = xmlify($post);
+		$tags = ijpost_get_tags($b['tag']);
+
+		$date = datetime_convert('UTC',$tz,$b['created'],'Y-m-d H:i:s');
+		$year = intval(substr($date,0,4));
+		$mon  = intval(substr($date,5,2));
+		$day  = intval(substr($date,8,2));
+		$hour = intval(substr($date,11,2));
+		$min  = intval(substr($date,14,2));
+
+		$xml = <<< EOT
+<?xml version="1.0" encoding="utf-8"?>
+<methodCall><methodName>LJ.XMLRPC.postevent</methodName>
+<params><param>
+<value><struct>
+<member><name>year</name><value><int>$year</int></value></member>
+<member><name>mon</name><value><int>$mon</int></value></member>
+<member><name>day</name><value><int>$day</int></value></member>
+<member><name>hour</name><value><int>$hour</int></value></member>
+<member><name>min</name><value><int>$min</int></value></member>
+<member><name>event</name><value><string>$post</string></value></member>
+<member><name>username</name><value><string>$ij_username</string></value></member>
+<member><name>password</name><value><string>$ij_password</string></value></member>
+<member><name>subject</name><value><string>$title</string></value></member>
+<member><name>lineendings</name><value><string>unix</string></value></member>
+<member><name>ver</name><value><int>1</int></value></member>
+<member><name>props</name>
+<value><struct>
+<member><name>useragent</name><value><string>Friendica</string></value></member>
+<member><name>taglist</name><value><string>$tags</string></value></member>
+</struct></value></member>
+</struct></value>
+</param></params>
+</methodCall>
+
+EOT;
+
+		logger('ijpost: data: ' . $xml, LOGGER_DATA);
+
+		if($ij_blog !== 'test')
+			$x = post_url($ij_blog,$xml,array("Content-Type: text/xml"));
+		logger('posted to insanejournal: ' . ($x) ? $x : '', LOGGER_DEBUG);
+
+	}
+}
+
+function ijpost_get_tags($post)
+{
+	preg_match_all("/\]([^\[#]+)\[/",$post,$matches);
+	$tags = implode(', ',$matches[1]);
+	return $tags;
+}
diff --git a/irc/irc.php b/irc/irc.php
index 397844e0..cf86a446 100644
--- a/irc/irc.php
+++ b/irc/irc.php
@@ -3,7 +3,7 @@
 * Name: IRC Chat Plugin
 * Description: add an Internet Relay Chat chatroom
 * Version: 1.0
-* Author: tony baldwin <http://tonybaldwin.me>
+* Author: tony baldwin <https://free-haven.org/profile/tony>
 */
 
 
@@ -35,6 +35,7 @@ $o = '';
  // add the chatroom frame and some html
   $o .= <<< EOT
 <h2>IRC chat</h2>
+<p><a href="http://tldp.org/HOWTO/IRC/beginners.html" target="_blank">a beginner's guid to using IRC.</a></p>
 <iframe src="http://webchat.freenode.net?channels=friendica" width="600" height="600"></iframe>
 EOT;
 
diff --git a/ljpost/ljpost.php b/ljpost/ljpost.php
index e1bd2d63..dc17e83f 100755
--- a/ljpost/ljpost.php
+++ b/ljpost/ljpost.php
@@ -4,7 +4,7 @@
  * Name: LiveJournal Post Connector
  * Description: Post to LiveJournal
  * Version: 1.0
- * Author: Tony Baldwin <http://tonybaldwin.me/friendica/profile/tony>
+ * Author: Tony Baldwin <https://free-haven.org/profile/tony>
  * Author: Michael Johnston
  * Author: Cat Gray <https://free-haven.org/profile/catness>
  */
@@ -232,7 +232,7 @@ EOT;
 		logger('ljpost: data: ' . $xml, LOGGER_DATA);
 
 		if($lj_blog !== 'test')
-			$x = post_url($lj_blog,$xml);
+			$x = post_url($lj_blog,$xml,array("Content-Type: text/xml"));
 		logger('posted to livejournal: ' . ($x) ? $x : '', LOGGER_DEBUG);
 
 	}
diff --git a/pages.tgz b/pages.tgz
new file mode 100644
index 00000000..7be170af
Binary files /dev/null and b/pages.tgz differ
diff --git a/pages/README b/pages/README
new file mode 100755
index 00000000..6ec314b7
--- /dev/null
+++ b/pages/README
@@ -0,0 +1,3 @@
+Pages
+
+Shows lists of community pages
diff --git a/pages/pages.php b/pages/pages.php
new file mode 100755
index 00000000..bc56d2e4
--- /dev/null
+++ b/pages/pages.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Name: Pages
+ * Description: Shows lists of community pages
+ * Version: 1.0
+ * Author: Michael Vogel <ike@piratenpartei.de>
+ *
+ */
+
+function pages_install() {
+	register_hook('page_end', 'addon/pages/pages.php', 'pages_page_end');
+}
+
+function pages_uninstall() {
+	unregister_hook('page_end', 'addon/pages/pages.php', 'pages_page_end');
+}
+
+function pages_iscommunity($url, &$pagelist) {
+	// check every week for the status - should be enough
+	if ($pagelist[$url]["checked"]<time()-86400*7) {
+		// When too old or not found fetch the status from the profile
+		$ch = curl_init();
+
+		$url = str_replace("/profile/","/hcard/", $url);
+
+		curl_setopt($ch, CURLOPT_URL, $url);
+		curl_setopt($ch, CURLOPT_HEADER, 0);
+		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+		curl_setopt($ch, CURLOPT_TIMEOUT, 2);
+ 
+		$page = curl_exec($ch);
+ 
+		curl_close($ch);
+
+		$iscommunity = (strpos($page, '<meta name="friendika.community" content="true" />') != 0);
+
+		$pagelist[$url] = array("community" => $iscommunity, "checked" => time());
+	} else // Fetch from cache
+		$iscommunity = $pagelist[$url]["community"];
+	return($iscommunity);
+}
+
+function pages_getpages($uid) {
+
+	// Fetch cached pagelist from configuration
+	$pagelist = get_pconfig($uid,'pages','pagelist');
+
+	if (sizeof($pagelist) == 0)
+		$pagelist = array();
+
+	$contacts = q("SELECT `id`, `url`, `Name` FROM `contact`
+			WHERE `network`= 'dfrn' AND `uid` = %d",
+			intval($uid));
+
+	$pages = array();
+
+	// Look if the profile is a community page
+	foreach($contacts as $contact) {
+		if (pages_iscommunity($contact["url"], $pagelist))
+			$pages[] = array("url"=>$contact["url"], "Name"=>$contact["Name"], "id"=>$contact["id"]);
+	}
+
+	// Write back cached pagelist
+	set_pconfig($uid,'pages','pagelist', $pagelist);
+	return($pages);
+}
+
+function pages_page_end($a,&$b) {
+	// Only move on if if it's the "network" module and there is a logged on user
+	if (($a->module != "network") OR ($a->user['uid'] == 0))
+		return;
+
+	$pages = '<div id="pages-sidebar" class="widget">
+			<div class="title tool">
+			<h3>'.t("Community").'</h3></div>
+			<div id="sidebar-pages-list"><ul>';
+
+	$contacts = pages_getpages($a->user['uid']);
+
+	foreach($contacts as $contact) {
+		$pages .= '<li class="tool"><a href="'.$a->get_baseurl().'/redir/'.$contact["id"].'" class="label" target="external-link">'.
+				$contact["Name"]."</a></li>";
+	}
+	$pages .= "</ul></div></div>";
+	if (sizeof($contacts) > 0)
+		$a->page['aside'] = $pages.$a->page['aside'];
+}
+?>