diff --git a/dwpost/dwpost.css b/dwpost/dwpost.css
new file mode 100644
index 00000000..8edab3d9
--- /dev/null
+++ b/dwpost/dwpost.css
@@ -0,0 +1,15 @@
+
+#ljpost-enable-label, #ljpost-username-label, #ljpost-password-label, #ljpost-bydefault-label {
+float: left;
+width: 200px;
+margin-top: 10px;
+}
+
+#ljpost-checkbox, #ljpost-username, #ljpost-password, #ljpost-bydefault {
+float: left;
+margin-top: 10px;
+}
+
+#ljpost-submit {
+margin-top: 15px;
+}
\ No newline at end of file
diff --git a/dwpost/dwpost.php b/dwpost/dwpost.php
new file mode 100644
index 00000000..0bf420e5
--- /dev/null
+++ b/dwpost/dwpost.php
@@ -0,0 +1,220 @@
+
+ * Author: Michael Johnston
+ */
+
+function dwpost_install() {
+ register_hook('post_local', 'addon/dwpost/dwpost.php', 'dwpost_post_local');
+ register_hook('notifier_normal', 'addon/dwpost/dwpost.php', 'dwpost_send');
+ register_hook('jot_networks', 'addon/dwpost/dwpost.php', 'dwpost_jot_nets');
+ register_hook('connector_settings', 'addon/dwpost/dwpost.php', 'dwpost_settings');
+ register_hook('connector_settings_post', 'addon/dwpost/dwpost.php', 'dwpost_settings_post');
+
+}
+function dwpost_uninstall() {
+ unregister_hook('post_local', 'addon/dwpost/dwpost.php', 'dwpost_post_local');
+ unregister_hook('notifier_normal', 'addon/dwpost/dwpost.php', 'dwpost_send');
+ unregister_hook('jot_networks', 'addon/dwpost/dwpost.php', 'dwpost_jot_nets');
+ unregister_hook('connector_settings', 'addon/dwpost/dwpost.php', 'dwpost_settings');
+ unregister_hook('connector_settings_post', 'addon/dwpost/dwpost.php', 'dwpost_settings_post');
+
+}
+
+
+function dwpost_jot_nets(&$a,&$b) {
+ if(! local_user())
+ return;
+
+ $dw_post = get_pconfig(local_user(),'dwpost','post');
+ if(intval($dw_post) == 1) {
+ $dw_defpost = get_pconfig(local_user(),'dwpost','post_by_default');
+ $selected = ((intval($dw_defpost) == 1) ? ' checked="checked" ' : '');
+ $b .= '
'
+ . t('Post to Dreamwidth') . '
';
+ }
+}
+
+
+function dwpost_settings(&$a,&$s) {
+
+ if(! local_user())
+ return;
+
+ /* Add our stylesheet to the page so we can make our settings look nice */
+
+ $a->page['htmlhead'] .= '' . "\r\n";
+
+ /* Get the current state of our config variables */
+
+ $enabled = get_pconfig(local_user(),'dwpost','post');
+
+ $checked = (($enabled) ? ' checked="checked" ' : '');
+
+ $def_enabled = get_pconfig(local_user(),'dwpost','post_by_default');
+
+ $def_checked = (($def_enabled) ? ' checked="checked" ' : '');
+
+ $dw_username = get_pconfig(local_user(), 'dwpost', 'dw_username');
+ $dw_password = get_pconfig(local_user(), 'dwpost', 'dw_password');
+
+
+ /* Add some HTML to the existing form */
+
+ $s .= '';
+ $s .= '
' . t('Dreamwidth Post Settings') . '
';
+ $s .= '
';
+ $s .= '';
+ $s .= '';
+ $s .= '
';
+
+ $s .= '
';
+ $s .= '';
+ $s .= '';
+ $s .= '
';
+
+ $s .= '
';
+ $s .= '';
+ $s .= '';
+ $s .= '
';
+
+ $s .= '
';
+ $s .= '';
+ $s .= '';
+ $s .= '
';
+
+ /* provide a submit button */
+
+ $s .= '
';
+
+}
+
+
+function dwpost_settings_post(&$a,&$b) {
+
+ if(x($_POST,'dwpost-submit')) {
+
+ set_pconfig(local_user(),'dwpost','post',intval($_POST['dwpost']));
+ set_pconfig(local_user(),'dwpost','post_by_default',intval($_POST['dw_bydefault']));
+ set_pconfig(local_user(),'dwpost','dw_username',trim($_POST['dw_username']));
+ set_pconfig(local_user(),'dwpost','dw_password',trim($_POST['dw_password']));
+
+ }
+
+}
+
+function dwpost_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;
+
+ $dw_post = intval(get_pconfig(local_user(),'dwpost','post'));
+
+ $dw_enable = (($dw_post && x($_REQUEST,'dwpost_enable')) ? intval($_REQUEST['dwpost_enable']) : 0);
+
+ if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'dwpost','post_by_default')))
+ $dw_enable = 1;
+
+ if(! $dw_enable)
+ return;
+
+ if(strlen($b['postopts']))
+ $b['postopts'] .= ',';
+ $b['postopts'] .= 'dwpost';
+}
+
+
+
+
+function dwpost_send(&$a,&$b) {
+
+ if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))
+ return;
+
+ if(! strstr($b['postopts'],'dwpost'))
+ return;
+
+ if($b['parent'] != $b['id'])
+ return;
+
+ // dreamwidth 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'];
+
+ $dw_username = get_pconfig($b['uid'],'dwpost','dw_username');
+ $dw_password = get_pconfig($b['uid'],'dwpost','dw_password');
+ $dw_blog = 'http://www.dreamwidth.org/interface/xmlrpc';
+
+ if($dw_username && $dw_password && $dw_blog) {
+
+ require_once('include/bbcode.php');
+ require_once('include/datetime.php');
+
+ $title = $b['title'];
+ $post = bbcode($b['body']);
+ $post = xmlify($post);
+
+ $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
+
+LJ.XMLRPC.postevent
+
+
+year$year
+mon$mon
+day$day
+hour$hour
+min$min
+usejournal$dw_username
+event$post
+username$dw_username
+password$dw_password
+subject$title
+lineendingsunix
+ver1
+props
+
+useragentFriendica
+taglistfriendica
+
+
+
+
+
+EOT;
+
+ logger('dwpost: data: ' . $xml, LOGGER_DATA);
+
+ if($dw_blog !== 'test')
+ $x = post_url($dw_blog,$xml);
+ logger('posted to dreamwidth: ' . ($x) ? $x : '', LOGGER_DEBUG);
+
+ }
+}
+