diff --git a/wp-content/plugins/flattr/callback.php b/wp-content/plugins/flattr/callback.php
new file mode 100644
index 0000000000000000000000000000000000000000..bc53dbe593872b72363da939781ff734def2314b
--- /dev/null
+++ b/wp-content/plugins/flattr/callback.php
@@ -0,0 +1,31 @@
+<?php
+
+if ( isset ($_REQUEST['oauth_token']) && isset ($_REQUEST['oauth_verifier'])) {
+
+    if (session_id() == '') { session_start(); }
+
+    include_once "oAuth/flattr_rest.php";
+
+    $api_key = get_option('flattrss_api_key');
+    $api_secret = get_option('flattrss_api_secret');
+
+    $flattr = new Flattr_Rest($api_key, $api_secret, $_SESSION['flattrss_current_token']['oauth_token'], $_SESSION['flattrss_current_token']['oauth_token_secret']);
+
+    $access_token = $flattr->getAccessToken($_REQUEST['oauth_verifier']);
+
+    if ($flattr->http_code == 200) {
+
+        add_option('flattrss_api_oauth_token', $access_token['oauth_token']);
+        update_option('flattrss_api_oauth_token', $access_token['oauth_token']);
+
+        add_option('flattrss_api_oauth_token_secret', $access_token['oauth_token_secret']);
+        update_option('flattrss_api_oauth_token_secret', $access_token['oauth_token_secret']);
+    } else {
+        wp_die("<h1>Callback Error.</h1><p>Please clear browser cach and cookies, then try again. Sorry for the inconvenience.</p><p align='right'>Michael Henke</p>");
+    }
+
+    header("Status: 307");
+    header("Location: ". get_bloginfo('wpurl') .'/wp-admin/admin.php?page=flattr/settings.php');
+
+    exit(307);
+ }
\ No newline at end of file
diff --git a/wp-content/plugins/flattr/flattr.php b/wp-content/plugins/flattr/flattr.php
index 8d60a9772a1de3c942e444cee00ecf1b0ca127ab..e6d64b772f31216a4a63c3470f8b7e93df7f34c2 100644
--- a/wp-content/plugins/flattr/flattr.php
+++ b/wp-content/plugins/flattr/flattr.php
@@ -1,13 +1,19 @@
 <?php
+/**
+ * @package Flattr
+ * @author Michael Henke
+ * @version 0.9.22.2
+ */
 /*
 Plugin Name: Flattr
 Plugin URI: http://wordpress.org/extend/plugins/flattr/
 Description: Give your readers the opportunity to Flattr your effort
-Version: 0.9.19
-Author: Flattr.com
-Author URI: http://flattr.com/
+Version: 0.9.22.2
+Author: Michael Henke
+Author URI: http://allesblog.de/
 License: This code is (un)licensed under the kopimi (copyme) non-license; http://www.kopimi.com. In other words you are free to copy it, taunt it, share it, fork it or whatever. :)
-*/
+Comment: The author of this plugin is not affiliated with the flattr company in whatever meaning.
+ */
 
 if (version_compare(PHP_VERSION, '5.0.0', '<'))
 {
diff --git a/wp-content/plugins/flattr/flattr5.php b/wp-content/plugins/flattr/flattr5.php
index 5c5dedf2a2eeb9cec685d5f95bdc25897289f116..dc6d34096762c546168cc547fa3294fd61e7252e 100644
--- a/wp-content/plugins/flattr/flattr5.php
+++ b/wp-content/plugins/flattr/flattr5.php
@@ -1,8 +1,10 @@
 <?php
 
+if (session_id() == '') { session_start(); }
+
 class Flattr
 {
-	const VERSION = '0.9.19';
+	const VERSION = '0.9.22';
 	const WP_MIN_VER = '2.9';
 	const API_SCRIPT  = 'api.flattr.com/js/0.6/load.js?mode=auto';
 
@@ -30,11 +32,12 @@ class Flattr
 			
 			$this->init();
 		}
-		if ( get_option('flattr_aut_page', 'off') == 'on' || get_option('flattr_aut', 'off') == 'on' )
+		if (( get_option('flattr_aut_page', 'off') == 'on' || get_option('flattr_aut', 'off') == 'on' ) && !in_array( 'live-blogging/live-blogging.php' , get_option('active_plugins') ))
 		{
 			remove_filter('get_the_excerpt', 'wp_trim_excerpt');
-			add_filter('the_content', array($this, 'injectIntoTheContent'),11);
-			add_filter('get_the_excerpt', array($this, 'filterGetExcerpt'), 1);
+
+                        add_filter('the_content', array($this, 'injectIntoTheContent'),11);
+                        add_filter('get_the_excerpt', array($this, 'filterGetExcerpt'), 1);
 			if ( get_option('flattr_override_sharethis', 'false') == 'true' ) {
 				add_action('plugins_loaded', array($this, 'overrideShareThis'));
 			}
@@ -200,13 +203,13 @@ class Flattr
 
 	public static function filterGetExcerpt($content)
 	{
-        $excerpt_length = apply_filters('excerpt_length', 55);
-        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
+            $excerpt_length = apply_filters('excerpt_length', 55);
+            $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
 
-		return self::getExcerpt($excerpt_length) . $excerpt_more;
+            return self::getExcerpt($excerpt_length, $excerpt_more);
 	}
 
-	public static function getExcerpt($excerpt_max_length = 1024)
+	public static function getExcerpt($excerpt_max_length = 55, $excerpt_more = ' [...]')
 	{
 		global $post;
 		
@@ -223,11 +226,20 @@ class Flattr
 		// Hacks for various plugins
 		$excerpt = preg_replace('/httpvh:\/\/[^ ]+/', '', $excerpt); // hack for smartyoutube plugin
 		$excerpt = preg_replace('%httpv%', 'http', $excerpt); // hack for youtube lyte plugin
-	
+
+            $excerpt = explode(' ', $excerpt, $excerpt_max_length);
+              if ( count($excerpt) >= $excerpt_max_length) {
+                array_pop($excerpt);
+                $excerpt = implode(" ",$excerpt).' ...';
+              } else {
+                $excerpt = implode(" ",$excerpt);
+              }
+              $excerpt = preg_replace('`\[[^\]]*\]`','',$excerpt);
+
 	    // Try to shorten without breaking words
-	    if ( strlen($excerpt) > $excerpt_max_length )
+	    if ( strlen($excerpt) > 1024 )
 	    {
-			$pos = strpos($excerpt, ' ', $excerpt_max_length);
+			$pos = strpos($excerpt, ' ', 1024);
 			if ($pos !== false)
 			{
 				$excerpt = substr($excerpt, 0, $pos);
@@ -235,9 +247,9 @@ class Flattr
 		}
 
 		// If excerpt still too long
-		if (strlen($excerpt) > $excerpt_max_length)
+		if (strlen($excerpt) > 1024)
 		{
-			$excerpt = substr($excerpt, 0, $excerpt_max_length);
+			$excerpt = substr($excerpt, 0, 1024);
 		}
 
 		return $excerpt;
@@ -297,6 +309,9 @@ class Flattr
 
 	public function injectIntoTheContent($content)
 	{
+            global $post;
+
+            if (in_array(get_post_type(), get_option('flattr_post_types'))) {
 		$button = $this->getButton();
 
 		$button = '<p class="wp-flattr-button">' . apply_filters('flattr_button', $button) . '</p>';
@@ -311,7 +326,9 @@ class Flattr
 		{
 			return $result;
 		}
-		return $content;
+		
+            }
+            return $content;
 	}	
 }
 
@@ -334,3 +351,228 @@ function the_flattr_permalink()
 {
 	echo(get_the_flattr_permalink());
 }
+
+if (file_exists(WP_PLUGIN_DIR . '/' . plugin_basename( dirname(__FILE__) ) . '/flattrwidget.php')) {
+    include WP_PLUGIN_DIR . '/' . plugin_basename( dirname(__FILE__) ) . '/flattrwidget.php';
+}
+
+add_action('admin_init', 'tabber_stylesheet');
+
+/*
+ * Enqueue style-file, if it exists.
+ */
+
+function tabber_stylesheet() {
+    $myStyleUrl = WP_PLUGIN_URL . '/flattr/tabber.css';
+    $myStyleFile = WP_PLUGIN_DIR . '/flattr/tabber.css';
+    if ( file_exists($myStyleFile) ) {
+        wp_register_style('myStyleSheets', $myStyleUrl);
+        wp_enqueue_style( 'myStyleSheets');
+    }
+}
+
+    if(!defined('FLATTRSS_PLUGIN_PATH')) { define(FLATTRSS_PLUGIN_PATH, get_bloginfo('wpurl') . '/wp-content/plugins/flattr'); }
+    add_option('flattrss_api_key', "");
+    add_option('flattrss_autodonate', false);
+    add_option('flattrss_api_secret', "");
+    add_option('flattrss_api_oauth_token',"");
+    add_option('flattrss_api_oauth_token_secret',"");
+    add_option('flattrss_custom_image_url', FLATTRSS_PLUGIN_PATH .'/img/flattr-badge-large.png');
+    add_option('flattrss_clicktrack_since_date', date("r"));
+    add_option('flattrss_clickthrough_n', 0);
+    add_option('flattrss_clicktrack_enabled', true);
+    add_option('flattrss_error_reporting', true);
+    add_option('flattrss_autosubmit', true);
+    add_option('flattr_post_types', array('post','page'));
+
+function flattr_post2rss($content) {
+    global $post;
+
+    $flattr = "";
+    $flattr_post_types = get_option('flattr_post_types');
+
+    if (is_feed() && in_array(get_post_type(), $flattr_post_types)) {
+        $id = $post->ID;
+        $md5 = md5($post->post_title);
+        $permalink = urlencode(get_permalink( $id ));
+
+        $flattr.= ' <p><a href="'. get_bloginfo('wpurl') .'/?flattrss_redirect&amp;id='.$id.'&amp;md5='.$md5.'" title="Flattr" target="_blank"><img src="'. FLATTRSS_PLUGIN_PATH .'/img/flattr-badge-large.png" alt="flattr this!"/></a></p>';
+    }
+    return ($content.$flattr);
+}
+
+if(function_exists('curl_init')) {
+    add_filter('the_content_feed', 'flattr_post2rss',999999);
+}
+function new_flattrss_autosubmit_action () {
+
+    global $call_n;
+
+    $post = $_POST;
+
+    if (((get_option('flattr_hide') == false) && $post['post_status'] == "publish") && ($post['original_post_status'] != "publish" && (strtotime($post['post_date_gmt']) - strtotime(gmdate("Y-m-d H:i:s")) <= 0)) && ($call_n == 1)) {
+
+        $e = error_reporting();
+        error_reporting(E_ERROR);
+
+        $url = get_permalink($post['ID']);
+        $tagsA = get_the_tags($post['ID']);
+        $tags = "";
+
+        if ($tagsA) {
+            foreach ($tagsA as $tag) {
+                if (strlen($tags)!=0){
+                    $tags .=",";
+                }
+                $tags .= $tag->name;
+            }
+        }
+
+        if (trim($tags) == "") {
+            $tags .= "blog";
+        }
+
+        $category = "text";
+        if (get_option('flattr_cat')!= "") {
+            $category = get_option('flattr_cat');
+        }
+
+        $language = "en_EN";
+        if (get_option('flattr_lng')!="") {
+            $language = get_option('flattr_lng');
+        }
+
+        if (!function_exists('getExcerpt')) {
+            function getExcerpt($post, $excerpt_max_length = 1024) {
+
+                $excerpt = $post['post_excerpt'];
+                if (trim($excerpt) == "") {
+                        $excerpt = $post['post_content'];
+                }
+
+                $excerpt = strip_shortcodes($excerpt);
+                $excerpt = strip_tags($excerpt);
+                $excerpt = str_replace(']]>', ']]&gt;', $excerpt);
+
+                // Hacks for various plugins
+                $excerpt = preg_replace('/httpvh:\/\/[^ ]+/', '', $excerpt); // hack for smartyoutube plugin
+                $excerpt = preg_replace('%httpv%', 'http', $excerpt); // hack for youtube lyte plugin
+
+                // Try to shorten without breaking words
+                if ( strlen($excerpt) > $excerpt_max_length ) {
+                    $pos = strpos($excerpt, ' ', $excerpt_max_length);
+                    if ($pos !== false) {
+                            $excerpt = substr($excerpt, 0, $pos);
+                    }
+                }
+
+                // If excerpt still too long
+                if (strlen($excerpt) > $excerpt_max_length) {
+                    $excerpt = substr($excerpt, 0, $excerpt_max_length);
+                }
+
+                return $excerpt;
+            }
+        }
+
+        $content = preg_replace(array('/\<br\s*\/?\>/i',"/\n/","/\r/", "/ +/"), " ", getExcerpt($post));
+        $content = strip_tags($content);
+
+        if (strlen(trim($content)) == 0) {
+            $content = "(no content provided...)";
+        }
+
+        $title = strip_tags($post['post_title']);
+        $title = str_replace(array("\"","\'"), "", $title);
+
+        $api_key = get_option('flattrss_api_key');
+        $api_secret = get_option('flattrss_api_secret');
+        $oauth_token = get_option('flattrss_api_oauth_token');
+        $oauth_token_secret = get_option('flattrss_api_oauth_token_secret');
+
+        if (!class_exists('Flattr_Rest')) {
+            include 'oAuth/flattr_rest.php';
+        }
+        $flattr_user = new Flattr_Rest($api_key, $api_secret, $oauth_token, $oauth_token_secret);
+
+        if ($flattr_user->error()) {
+            return;
+        }
+
+        if(!function_exists("encode")) {
+            function encode($string) {
+                if (function_exists("mb_detect_encoding")) {
+                    $string = (mb_detect_encoding($string, "UTF-8") == "UTF-8" )? $string : utf8_encode($string);
+                } else {
+                    $string = utf8_encode($string);
+                }
+                return $string;
+            }
+        }
+
+        #print_r(array($url, encode($title), $category, encode($content), $tags, $language));
+
+        $flattr_user->submitThing($url, encode($title), $category, encode($content), $tags, $language, get_option('flattr_hide'));
+
+        /*
+        if (get_option('flattrss_autodonate') && !isset($_SESSION['flattrss_autodonate_click'])) {
+            $flattr_user->clickThing("ead246fc95fc401ce69d15f3981da971");
+            $_SESSION['flattrss_autodonate_click'] = true;
+        }*/
+
+        error_reporting($e);
+    }
+    $call_n = 1;
+}
+
+
+if (get_option('flattrss_autosubmit') && function_exists('curl_init')) {
+    add_action('save_post','new_flattrss_autosubmit_action',9999);
+}
+
+add_action('init', 'new_flattrss_redirect');
+add_action('init', 'new_flattrss_callback');
+
+function new_flattrss_redirect() {
+    include_once 'redirect.php';
+}
+
+function new_flattrss_callback() {
+    include_once 'callback.php';
+}
+
+if(is_admin()) {
+    $admin_notice = "";
+
+    $oauth_token = get_option('flattrss_api_oauth_token');
+    $oauth_token_secret = get_option('flattrss_api_oauth_token_secret');
+
+    $active_plugins = get_option('active_plugins');
+    if ( in_array( 'live-blogging/live-blogging.php' , $active_plugins ) && ( get_option('flattr_aut_page', 'off') == 'on' || get_option('flattr_aut', 'off') == 'on' ) ) {
+        $admin_notice .= 'echo \'<div id="message" class="updated"><p><strong>Warning:</strong> There is an <a href="http://wordpress.org/support/topic/plugin-live-blogging-how-to-avoid-the_content-of-live_blog_entries" target="_blank">incompatibility</a> with [Liveblog] plugin and automatic Flattr button injection! Automatic injection is disabled as long as [Liveblog] plugin is enabled. You need to use the manual method to add Flattr buttons to your posts.</p></div>\';';
+    }
+
+    if (defined('LIBXML_VERSION')) {
+        define('LIBXML_TARGET',20616);
+        if (version_compare(LIBXML_VERSION, LIBXML_TARGET, '<')) {
+            $admin_notice .= 'echo \'<div id="message" class="updated"><p><strong>Warning:</strong> There might be an <a href="http://forum.flattr.net/showthread.php?tid=681" target="_blank">incompatibility</a> with your web server running libxml '.LIBXML_VERSION.'. Flattr Plugin requieres at least '.LIBXML_TARGET.'. You can help improve the Flattr experience for everybody, <a href="mailto:flattr@allesblog.de?subject='.rawurlencode("My webserver is running LIBXML Version ".LIBXML_VERSION).'">please contact me</a> :). See Feedback-tab for details.</p></div>\';';
+        }
+    } else {
+        $admin_notice .= 'echo \'<div id="message" class="error"><p><strong>Error:</strong> Your PHP installation must support <strong>libxml</strong> for Flattr plugin to work!</p></div>\';';
+    }
+
+    if (in_array( 'flattrss/flattrss.php' , $active_plugins)) {
+        $admin_notice .= 'echo \'<div id="message" class="error"><p><strong>Error:</strong> It is mandatory for <strong>FlattRSS</strong> plugin to be at least deactivated. Functionality and Settings are merged into the Flattr plugin.</p></div>\';';
+    }
+
+    if (in_array( 'flattrwidget/flattrwidget.php' , $active_plugins)) {
+        $admin_notice .= 'echo \'<div id="message" class="error"><p><strong>Error:</strong> It is mandatory for <strong>Flattr Widget</strong> plugin to be at least deactivated. Functionality and Settings are merged into the Flattr plugin.</p></div>\';';
+    }
+    
+    if ($admin_notice != "") {
+        add_action( 'admin_notices',
+            create_function('', $admin_notice)
+        );
+    }
+
+}
\ No newline at end of file
diff --git a/wp-content/plugins/flattr/flattrwidget.php b/wp-content/plugins/flattr/flattrwidget.php
new file mode 100644
index 0000000000000000000000000000000000000000..ee3e3b97f761f23457ea9aa5dbd28a95bbff5e55
--- /dev/null
+++ b/wp-content/plugins/flattr/flattrwidget.php
@@ -0,0 +1,150 @@
+<?php
+
+if (!function_exists('flattrwidget_control')) {
+
+function new_flattrwidget_control() {
+
+    $options = get_option("flattrwidget");
+
+    if (!is_array( $options )) {
+        $options = array(
+            'title' => 'Flattr',
+            'text' => '',
+            'above' => true,
+            'compact' => false,
+            'html' => false
+        );
+    }
+
+    if ($_POST['flattrwidget-submit']) {
+        $options['title'] = htmlspecialchars($_POST['flattrwidget-title']);
+        if($options['html']) {
+            $options['text'] = $_POST['flattrwidget-text'];
+        } else {
+            $options['text'] = htmlspecialchars($_POST['flattrwidget-text']);
+        };
+        $options['above'] = $_POST['flattrwidget-above'];
+        $options['compact'] = $_POST['flattrwidget-compact'];
+        $options['html'] = $_POST['flattrwidget-html'];
+
+        update_option("flattrwidget", $options);
+    }
+?>
+<p>
+<label for="flattrwidget-title">Title: </label><br />
+<input class="widefat" type="text" id="flattrwidget-title" name="flattrwidget-title" value="<?php echo $options['title'];?>" />
+<label for="flattrwidget-text">Text: </label><br />
+<textarea class="widefat" rows="16" cols="10" type="text" id="flattrwidget-text" name="flattrwidget-text"><?php echo stripslashes($options['text']);?></textarea>
+<input type="checkbox" id="flattrwidget-above" name="flattrwidget-above"<?php if ($options['above']) { echo " checked"; } ?> />
+<label for="flattrwidget-above">Check to display the text above the Flattr button. (leave unchecked to display below)</label><br />
+<input type="checkbox" id="flattrwidget-html" name="flattrwidget-html"<?php if ($options['html']) { echo " checked"; } ?> />
+<label for="flattrwidget-html">Check to allow HTML in text.</label><br />
+<input type="checkbox" id="flattrwidget-compact" name="flattrwidget-compact"<?php if ($options['compact']) { echo " checked"; } ?> />
+<label for="flattrwidget-compact">Check to use compact style Flattr button.</label><br />
+
+<input type="hidden" id="flattrwidget-submit" name="flattrwidget-submit" value="1" />
+<?php
+
+    if (!get_option('flattr_uid')) {
+
+        $url = get_bloginfo('wpurl') .'/wp-admin/plugin-install.php?tab=plugin-information&plugin=flattr&TB_iframe=true&width=640&height=840';
+
+        echo "<p>You need the <a href=\"$url\">official Flattr plugin</a> installed, activated and configured for the widget to work!</p>";
+        echo "<p>Nothing will be displayed in your sidebar right now.</p>";
+    }
+
+}
+
+function new_flattrwidget_widget($args) {
+
+    if (!get_option('flattr_uid')) { return; }
+
+    extract($args);
+
+    $options = get_option("flattrwidget");
+
+    echo $before_widget;
+    echo $before_title;
+    echo $options['title'];
+    echo $after_title;
+    if ($options['above']) { echo "<p>". stripslashes($options['text']) ."</p>"; }
+    echo "<p align=\"center\">";
+
+    $uid = get_option('flattr_uid');
+    $cat = get_option('flattr_cat');
+    $lang = get_option('flattr_lng');
+
+    $category = $cat;
+    $title = get_bloginfo('name');
+    $description = get_bloginfo('description');
+    $tags = 'blog,wordpress,widget';
+    $url = get_bloginfo('url');
+    $language = $lang;
+    $userID = $uid;
+
+    $compact = compact;
+
+    if (!$options['compact']) { $compact = 'large'; }
+
+    $cleaner = create_function('$expression', "return trim(preg_replace('~\r\n|\r|\n~', ' ', addslashes(\$expression)));");
+
+    # button: 	compact | default
+    /*
+     * <a class="FlattrButton" style="display:none;"
+    title="Detta är min post titel"
+    data-flattr-uid="kjell"
+    data-flattr-tags="tag1, tag2"
+    data-flattr-category="text"
+    href="http://wp.local/?p=444">
+
+    Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+	Lorem ipsum dolor sit amet, consectetur adipiscing
+    Maecenas aliquet aliquam leo quis fringilla.
+</a>
+     */
+
+    $output = "<a class='FlattrButton' style='display:none;'".
+                ' href="'.$cleaner($url).'"'.
+                ' title="'.$cleaner($title).'"'.
+                ' data-flattr-uid="'.$cleaner($userID).'"'.
+                ' data-flattr-tags="'.$tags.'"'.
+                ' data-flattr-button="'.$compact.'"'.
+                ' data-flattr-category="'.$cleaner($category).'">'.
+                $cleaner($description).
+                '</a>';
+    /*
+    $output = "<script type=\"text/javascript\">\n";
+    if ( defined('Flattr::VERSION')) {
+        $output .= "var flattr_wp_ver = '" . Flattr::VERSION  . "';\n";
+    }
+    $output .= "var flattr_uid = '" . $cleaner($userID)      . "';\n";
+    $output .= "var flattr_url = '" . $cleaner($url)         . "';\n";
+    $output .= "var flattr_lng = '" . $cleaner($language)    . "';\n";
+    $output .= "var flattr_cat = '" . $cleaner($category)    . "';\n";
+    if($tags) { $output .= "var flattr_tag = '". $cleaner($tags) ."';\n"; }
+    if ($options['compact']) { $output .= "var flattr_btn = 'compact';\n"; } else {
+        $output .= "var flattr_btn = 'large';\n";
+    }
+    $output .= "var flattr_tle = '". $cleaner($title) ."';\n";
+    $output .= "var flattr_dsc = '". $cleaner($description) ."';\n";
+    $output .= "</script>\n";
+    if ( defined('Flattr::API_SCRIPT')) {
+        $output .= '<script src="' . Flattr::API_SCRIPT . '" type="text/javascript"></script>';
+    }
+     *
+     */
+    echo $output;
+
+    echo "</p>";
+    if (!$options['above']) { echo "<p>". stripslashes($options['text']) ."</p>"; }
+    echo $after_widget;
+}
+
+register_sidebar_widget ( "Flattr Widget", new_flattrwidget_widget );
+register_widget_control ( "Flattr Widget", new_flattrwidget_control );
+
+} else {
+
+}
+
+?>
diff --git a/wp-content/plugins/flattr/img/flattr-badge-large.png b/wp-content/plugins/flattr/img/flattr-badge-large.png
new file mode 100644
index 0000000000000000000000000000000000000000..c03a4fa3084f3c7b4109a3c13e657ef0eaccdd53
Binary files /dev/null and b/wp-content/plugins/flattr/img/flattr-badge-large.png differ
diff --git a/wp-content/plugins/flattr/img/flattr-icon_new.png b/wp-content/plugins/flattr/img/flattr-icon_new.png
new file mode 100644
index 0000000000000000000000000000000000000000..9080abc3593cc527ce17cc66d6b97073f786c3f1
Binary files /dev/null and b/wp-content/plugins/flattr/img/flattr-icon_new.png differ
diff --git a/wp-content/plugins/flattr/img/flattr-logo-beta-small.png b/wp-content/plugins/flattr/img/flattr-logo-beta-small.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7cd3f83c455405813ba3333ce8775412d63ae77
Binary files /dev/null and b/wp-content/plugins/flattr/img/flattr-logo-beta-small.png differ
diff --git a/wp-content/plugins/flattr/img/flattr_button.png b/wp-content/plugins/flattr/img/flattr_button.png
new file mode 100644
index 0000000000000000000000000000000000000000..25bbfae5df3cfa197e9e5c3bb1cf074f7dc11947
Binary files /dev/null and b/wp-content/plugins/flattr/img/flattr_button.png differ
diff --git a/wp-content/plugins/flattr/img/loader.gif b/wp-content/plugins/flattr/img/loader.gif
new file mode 100644
index 0000000000000000000000000000000000000000..a5901f9496bfbb258ffc1a5efe5c2bf94a4780f3
Binary files /dev/null and b/wp-content/plugins/flattr/img/loader.gif differ
diff --git a/wp-content/plugins/flattr/oAuth/flattr_rest.php b/wp-content/plugins/flattr/oAuth/flattr_rest.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc60b4b038a945d36ba204060b5ffbb4e398cfc1
--- /dev/null
+++ b/wp-content/plugins/flattr/oAuth/flattr_rest.php
@@ -0,0 +1,514 @@
+<?php
+
+require_once('oauth.php');
+require_once( 'flattr_xml.php' );
+
+class Flattr_Rest
+{
+	public $http_header;
+	public $url;
+	public $http_code;
+	public $http_info;
+	public $signature_method;
+	public $consumer;
+	public $token;
+
+	private $apiVersion = '0.5';
+	private $error;
+	private $baseUrl = 'http://api.flattr.com';
+
+	public function __construct($consumer_key, $consumer_secret, $oauth_token = null, $oauth_token_secret = null)
+	{
+	    if ( defined('LOCAL_DEV_ENV') )
+	    {
+	        $this->baseUrl = 'http://api.flattr.com';
+	    }
+
+		$this->signature_method = new OAuthSignatureMethod_HMAC_SHA1();
+		$this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);
+		if ( !empty($oauth_token) && ! empty($oauth_token_secret) )
+		{
+			$this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);
+		}
+		else
+		{
+			$this->token = null;
+		}
+	}
+
+	// Flattr API methods
+
+	public function browse($params)
+	{
+		$url = $this->actionUrl('/thing/browse');
+		if ( isset($params['query']) && $params['query'] != '' )
+		{
+			$url .= '/query/' . $params['query'];
+		}
+		if ( isset($params['tag']) && $params['tag'] != '' )
+		{
+			if ( ! is_array($params['tag']) )
+			{
+				$params['tag'] = array($params['tag']);
+			}
+			$url .= '/tag/' . implode(',', $params['tag']);
+		}
+		if ( isset($params['category']) && $params['category'] != '' )
+		{
+			if ( ! is_array($params['category']) )
+			{
+				$params['category'] = array($params['category']);
+			}
+			$url .= '/category/' . implode(',', $params['category']);
+		}
+		if ( isset($params['language']) && $params['language'] != '' )
+		{
+			if ( ! is_array($params['language']) )
+			{
+				$params['language'] = array($params['language']);
+			}
+			$url .= '/language/' . implode(',', $params['language']);
+		}
+		if ( isset($params['user']) && $params['user'] != '' )
+		{
+			if ( ! is_array($params['user']) )
+			{
+				$params['user'] = array($params['user']);
+			}
+			$url .= '/user/' . implode(',', $params['user']);
+		}
+
+		$result = $this->get($url);
+		$dom = new DOMDocument();
+		$dom->loadXml($result);
+		$thingXml = $dom->getElementsByTagName('thing');
+		$things = array();
+		foreach ($thingXml as $thing)
+		{
+			$thingdata = Flattr_Xml::toArray($thing);
+			if ( is_array($thingdata) )
+			{
+				$things[] = $thingdata;
+			}
+		}
+		return $things;
+	}
+
+	public function clickThing($id)
+	{
+		$result = $this->get($this->actionUrl('/thing/click/id/' . $id));
+		if ( $this->http_code == 200 )
+		{
+			return true;
+		}
+		else
+		{
+			$this->error = "Click error " . $this->http_code . ', ' . $this->http_info . "<br />";
+			return false;
+		}
+	}
+
+	public function error()
+	{
+		return $this->error;
+	}
+
+	/**
+	 * Returns an array of Flattr's categories...
+	 * 
+	 * @return array
+	 */
+	public function getCategories()
+	{
+		$result = $this->get($this->actionUrl('/feed/categories'));
+
+		$dom = new DOMDocument();
+		$dom->loadXml($result);
+		$catXml = $dom->getElementsByTagName('category');
+		
+		return Flattr_Xml::toArray( $catXml );
+	}
+
+	/**
+	 * Returns an array of clicks made by the authenticated user during the given period. 
+	 *
+	 * @param string $period in the format 'YYYYMM'
+	 */
+	public function getClicks( $period )
+	{
+		$response = $this->get( $this->actionUrl( "/user/clicks/period/{$period}" ) );
+
+		if ( $this->http_code == 200 )
+		{
+			$dom = new DOMDocument();
+			$dom->loadXml( $response );
+			$clicksXml = $dom->getElementsByTagName( 'click' );
+	
+			return Flattr_Xml::toArray( $clicksXml );			
+		}
+		
+		return false;
+	}
+
+	public function getSubscriptions()
+	{
+		$response = $this->get( $this->actionUrl( "/subscription/list" ) );
+		
+		if ( $this->http_code == 200 )
+		{
+			$dom = new DOMDocument();
+			$dom->loadXml( $response );
+			$subsXml = $dom->getElementsByTagName( 'subscription' );
+	
+			return Flattr_Xml::toArray( $subsXml );
+		}
+		
+		return false;
+	}
+	
+	/**
+	 * Returns a thing as an array.
+	 * If a thing could not be found false is returned
+	 * 
+	 * @param string $id
+	 * @return array|false
+	 */
+	public function getThing( $id )
+	{
+		$result = $this->get($this->actionUrl('/thing/get/id/' . $id));
+
+		if ( $this->http_code == 200 )
+		{
+			$dom = new DOMDocument();
+			$dom->loadXml($result);
+			$thingXml = $dom->getElementsByTagName('thing');
+			if ( ( $thingXml = $thingXml->item(0) ) !== null )
+			{
+			    return Flattr_Xml::toArray( $thingXml );
+			}
+		}
+
+		return false;
+	}
+
+	public function getThingByUrl($url)
+	{
+		$result = $this->get($this->actionUrl('/thing/get/'), array('url' => urlencode($url)));
+		if ( $this->http_code == 200 )
+		{
+			$dom = new DOMDocument();
+			$dom->loadXml($result);
+			$thingXml = $dom->getElementsByTagName('thing');
+			$thing = Flattr_Xml::toArray($thingXml->item(0));
+			return $thing;
+		}
+		else
+		{
+			return false;
+		}
+	}
+
+	public function getThingClicks($thingId)
+	{
+		$result = $this->get($this->actionUrl('/thing/clicks/'), array('thing' => $thingId));
+		$return = array();
+		if ( $this->http_code == 200 )
+		{   
+			$dom = new DOMDocument();
+			$dom->loadXml($result);
+
+			$clicks = $dom->getElementsByTagName('clicks')->item(0);
+			$anon = $clicks->getElementsByTagName('anonymous')->item(0);
+			$anonymousClicks = $anon->getElementsByTagName('count')->item(0)->nodeValue;
+
+			$public = $clicks->getElementsByTagName('public')->item(0);
+			$publicClicks = $public->getElementsByTagName('count')->item(0)->nodeValue;
+
+			$userArray = array();
+			$publicUsers = $public->getElementsByTagName('users')->item(0);
+			$nodes = $publicUsers->getElementsByTagName('user');
+			for ($i=0; $i<$nodes->length; $i++)
+			{
+				$userArray[] = Flattr_Xml::toArray($nodes->item($i));
+			}
+
+			return array('public' => $publicClicks, 'anonymous' => $anonymousClicks, 'publicUsers' => $userArray);
+		}
+		else
+		{
+			return false;
+		}
+	}
+
+	/**
+	 * Returns an array of things owned by specified user
+	 * if no userid is given the current authenticated user is used.
+	 *
+	 * @param int $userId
+	 */
+	public function getThingList($userId = null)
+	{
+		$result = $this->get($this->actionUrl('/thing/listbyuser/id/' . $userId));
+		
+		$dom = new DOMDocument();
+		$dom->loadXml($result);
+		$thingXml = $dom->getElementsByTagName('thing');
+		
+		return Flattr_Xml::toArray( $thingXml );
+	}
+
+	/**
+	 * Returns an array of Flattr's langauges
+	 * 
+	 * @return array
+	 */
+	public function getLanguages()
+	{
+		$result = $this->get($this->actionUrl('/feed/languages'));
+
+		$dom = new DOMDocument();
+		$dom->loadXml($result);
+		$langXml = $dom->getElementsByTagName('language');
+
+		return Flattr_Xml::toArray( $langXml );
+	}
+
+	/**
+	 * Returns info about the specified user.
+	 * If no user is given the currently authenticated user is used.
+	 * 
+	 * @param mixed $user string username | int userId | null 
+	 * @return array|false
+	 */
+	public function getUserInfo($user = null)
+	{
+		$result = null;
+
+		if ( !$user )
+		{
+			$result = $this->get($this->actionUrl('/user/me'));
+		}
+		else
+		{
+			if ( is_numeric($user) )
+			{
+				$result = $this->get($this->actionUrl('/user/get/id/' . $user));
+			}
+			else
+			{
+				$result = $this->get($this->actionUrl('/user/get/name/' . $user));
+			}
+		}
+
+		$dom = new DOMDocument();
+		$dom->loadXml($result);
+		$userXml = $dom->getElementsByTagName('user');
+		if ( ( $userXml = $userXml->item(0) ) !== null )
+		{
+		    return Flattr_Xml::toArray( $userXml );
+		}
+
+		return false;
+	}
+	
+	/**
+	 * Will register a new thing on flattr.com
+	 * 
+	 * @param string $url
+	 * @param string $title
+	 * @param string $category
+	 * @param string $description
+	 * @param string $tags
+	 * @param string $language
+	 * @param bool $hidden
+	 * @param bool $temporary
+	 */
+	public function submitThing($url, $title, $category, $description, $tags, $language, $hidden = false, $temporary = false)
+	{
+		$dom = new DOMDocument('1.0', 'utf-8');
+		
+		$node = $dom->appendChild( $dom->createElement('thing') );
+		Flattr_Xml::addElement($node, 'url', $url);
+		Flattr_Xml::addElement($node, 'title', $title);
+		Flattr_Xml::addElement($node, 'category', $category);
+		Flattr_Xml::addElement($node, 'description', $description);
+		Flattr_Xml::addElement($node, 'language', $language);
+		Flattr_Xml::addElement($node, 'hidden', $hidden);
+		Flattr_Xml::addElement($node, 'temporary', $temporary);
+		
+		$tagsNode = $node->appendChild( $dom->createElement('tags') );
+		foreach ( explode(',', $tags) as $tag )
+		{
+		    Flattr_Xml::addElement($tagsNode, 'tag', trim($tag));
+		}
+		
+		$result = $this->post($this->actionUrl('/thing/register'), array('data' => $dom->saveXml()));
+		
+		$dom = new DOMDocument();
+		$dom->loadXml($result);
+		$thingXml = $dom->getElementsByTagName('thing');
+
+		return Flattr_Xml::toArray( $thingXml->item(0) );
+	}
+
+	// Oauth specific
+
+	public function getAccessToken($verifier)
+	{
+		$parameters = array('oauth_verifier' => $verifier);
+
+		$request = $this->oAuthRequest($this->accessTokenUrl(), 'GET', $parameters);
+		$token = OAuthUtil::parse_parameters($request);
+		if ( isset($token['oauth_token']) && isset($token['oauth_token_secret']) )
+		{
+			$this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+			return $token;
+		}
+	}
+
+	public function getAuthorizeUrl($token, $access = 'read')
+	{
+		return $this->authorizeUrl() . '?oauth_token=' . $token['oauth_token'] . '&access_scope=' . $access;
+	}
+
+	/**
+	 * Gets a request token from the API server and returns an oauth token.
+	 *
+	 * @param string $callback a callback url (fully qualified)
+	 * @return array oauth response parameters as array
+	 */
+	public function getRequestToken($callback = null)
+	{
+		$parameters = array();
+
+		if ( !empty($callback) )
+		{
+			$parameters['oauth_callback'] = $callback;
+		}
+
+		$response = $this->oAuthRequest($this->requestTokenUrl(), 'GET', $parameters);
+		$responseParameters = OAuthUtil::parse_parameters($response);
+		if ( isset($responseParameters['oauth_token']) && isset($responseParameters['oauth_token_secret']) )
+		{
+			$this->token = new OAuthConsumer($responseParameters['oauth_token'], $responseParameters['oauth_token_secret']);
+		}
+		else
+		{
+			$this->error = $responseParameters['oauth_problem'];
+		}
+
+		return $responseParameters;
+	}
+
+	// INTERNAL
+
+	private function accessTokenUrl()
+	{
+		return $this->baseUrl . '/oauth/access_token';
+	}
+	
+	private function actionUrl($uri)
+	{
+		return $this->baseUrl . '/rest/' . $this->apiVersion . $uri;
+	}
+		
+	private function authorizeUrl()
+	{
+		return $this->baseUrl . '/oauth/authorize';
+	}
+
+	private function get($url, $parameters = array())
+    {
+        $response = $this->oAuthRequest($url, 'GET', $parameters);
+        return $response;
+    }
+
+	private function requestTokenUrl()
+	{
+		return $this->baseUrl . '/oauth/request_token';
+	}
+	
+	private function getHeader($ch, $header)
+	{
+		$i = strpos($header, ':');
+		if (!empty($i))
+		{
+			$key = str_replace('-', '_', strtolower(substr($header, 0, $i)));
+  			$value = trim(substr($header, $i + 2));
+  			$this->http_header[$key] = $value;
+    	}
+    	
+    	return strlen($header);
+	}
+	
+	private function http($url, $method, $postfields = array(), $headers = array())
+	{
+		$this->http_info = array();
+		$ci = curl_init();
+
+		$headers[] = 'Expect:';
+
+		curl_setopt($ci, CURLOPT_USERAGENT, 'Flattrbot/0.1');
+		curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 10);
+		curl_setopt($ci, CURLOPT_TIMEOUT, 10);
+		curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
+		curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
+		curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, false);
+		curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
+		curl_setopt($ci, CURLOPT_HEADER, FALSE);
+
+		switch ($method)
+		{
+  			case 'POST':
+    			curl_setopt($ci, CURLOPT_POST, TRUE);
+    			if (!empty($postfields))
+    			{
+      				curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
+    			}
+    			break;
+
+  			case 'DELETE':
+    			curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
+    			if (!empty($postfields))
+    			{
+      				$url = "{$url}?{$postfields}";
+    			}
+		}
+
+		curl_setopt($ci, CURLOPT_URL, $url);
+		$response = curl_exec($ci);
+		$this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
+		$this->http_info = array_merge($this->http_info, curl_getinfo($ci));
+		$this->url = $url;
+		curl_close ($ci);
+
+		return $response;
+	}
+
+	private function oAuthRequest($url, $method, $parameters, $headers = array())
+	{
+    	if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0)
+    	{
+      		$url = "{$this->host}{$url}.{$this->format}";
+    	}
+    	
+    	$request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
+    	$request->sign_request($this->signature_method, $this->consumer, $this->token);
+		$headers['Authorization'] = $request->to_header();
+
+		switch ($method)
+		{
+			case 'GET':
+  				return $this->http($request->to_url(), 'GET', null, $headers);
+			default:
+  				return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata(), $headers);
+    	}
+  	}
+
+	private function post($url, $parameters = array())
+    {
+        $response = $this->oAuthRequest($url, 'POST', $parameters);
+        return $response;
+	}
+
+}
diff --git a/wp-content/plugins/flattr/oAuth/flattr_xml.php b/wp-content/plugins/flattr/oAuth/flattr_xml.php
new file mode 100644
index 0000000000000000000000000000000000000000..69631a7534f4220082ab6dbc5424dc14f7724f53
--- /dev/null
+++ b/wp-content/plugins/flattr/oAuth/flattr_xml.php
@@ -0,0 +1,85 @@
+<?php
+
+class Flattr_Xml
+{
+    
+	public static function addElement(DOMNode $node, $name, $value)
+	{
+	    if ( is_bool( $value ) )
+	    {
+	        $value = (int)$value;
+	    }
+	    
+        if ( $value instanceOf DOMNode )
+        {
+            throw new Exception('Construction blocks your path!');
+        }
+        else if ( is_numeric( $value ) )
+        {
+            $node->appendChild( new DOMElement($name, $value) );
+        }
+        else
+        {
+            $elm = $node->appendChild( new DOMElement($name) );
+            $elm->appendChild( $node->ownerDocument->createCDATASection($value) );
+        }
+	}
+	
+	/**
+	 * Checks if node has any children other than just text
+	 *
+	 * @param DOMNode
+	 * @return boolean
+	 */
+	public static function nodeHasChild( $node )
+	{
+		if ( $node->hasChildNodes() )
+		{
+			foreach ( $node->childNodes as $child )
+			{
+				if ( $child->nodeType == XML_ELEMENT_NODE )
+				{
+	    			return true;
+				}
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * Takes a DOMNode (or a DOMNodeList) and returns it as an array
+	 * 
+	 * @param DOMNode|DOMNodeList $item
+	 * @return array
+	 */
+	public static function toArray( $xml )
+	{
+		if ( $xml instanceOf DOMNodeList )
+		{
+			$items = array();
+			foreach ( $xml as $item )
+			{
+				$items[] = self::toArray( $item );
+			}
+	
+			return $items;
+		}
+	
+		$itemData = array();
+		foreach ( $xml->childNodes as $node )
+		{
+			if ( self::nodeHasChild( $node ) )
+			{
+				$itemData[$node->nodeName] = self::toArray( $node );
+			}
+			else
+			{
+				$itemData[$node->nodeName] = $node->nodeValue;
+			}
+		}
+
+		return $itemData;
+	}
+
+}
\ No newline at end of file
diff --git a/wp-content/plugins/flattr/oAuth/oauth.php b/wp-content/plugins/flattr/oAuth/oauth.php
new file mode 100644
index 0000000000000000000000000000000000000000..98f57274f0c9a4591c9b451e38cd151ccbf416ab
--- /dev/null
+++ b/wp-content/plugins/flattr/oAuth/oauth.php
@@ -0,0 +1,869 @@
+<?php
+
+/* Generic exception class
+ */
+
+if(!class_exists('OAuthConsumer')) {
+class OAuthConsumer {
+  public $key;
+  public $secret;
+
+  function __construct($key, $secret, $callback_url=NULL) {
+    $this->key = $key;
+    $this->secret = $secret;
+    $this->callback_url = $callback_url;
+  }
+
+  function __toString() {
+    return "OAuthConsumer[key=$this->key,secret=$this->secret]";
+  }
+}
+
+class OAuthToken {
+  // access tokens and request tokens
+  public $key;
+  public $secret;
+
+  /**
+   * key = the token
+   * secret = the token secret
+   */
+  function __construct($key, $secret) {
+    $this->key = $key;
+    $this->secret = $secret;
+  }
+
+  /**
+   * generates the basic string serialization of a token that a server
+   * would respond to request_token and access_token calls with
+   */
+  function to_string() {
+    return "oauth_token=" .
+           OAuthUtil::urlencode_rfc3986($this->key) .
+           "&oauth_token_secret=" .
+           OAuthUtil::urlencode_rfc3986($this->secret);
+  }
+
+  function __toString() {
+    return $this->to_string();
+  }
+}
+
+/**
+ * A class for implementing a Signature Method
+ * See section 9 ("Signing Requests") in the spec
+ */
+abstract class OAuthSignatureMethod {
+  /**
+   * Needs to return the name of the Signature Method (ie HMAC-SHA1)
+   * @return string
+   */
+  abstract public function get_name();
+
+  /**
+   * Build up the signature
+   * NOTE: The output of this function MUST NOT be urlencoded.
+   * the encoding is handled in OAuthRequest when the final
+   * request is serialized
+   * @param OAuthRequest $request
+   * @param OAuthConsumer $consumer
+   * @param OAuthToken $token
+   * @return string
+   */
+  abstract public function build_signature($request, $consumer, $token);
+
+  /**
+   * Verifies that a given signature is correct
+   * @param OAuthRequest $request
+   * @param OAuthConsumer $consumer
+   * @param OAuthToken $token
+   * @param string $signature
+   * @return bool
+   */
+  public function check_signature($request, $consumer, $token, $signature) {
+    $built = $this->build_signature($request, $consumer, $token);
+    return $built == $signature;
+  }
+}
+
+/**
+ * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104] 
+ * where the Signature Base String is the text and the key is the concatenated values (each first 
+ * encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&' 
+ * character (ASCII code 38) even if empty.
+ *   - Chapter 9.2 ("HMAC-SHA1")
+ */
+
+if(!class_exists('OAuthSignatureMethod_HMAC_SHA1')) {
+class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod {
+  function get_name() {
+    return "HMAC-SHA1";
+  }
+
+  public function build_signature($request, $consumer, $token) {
+    $base_string = $request->get_signature_base_string();
+    $request->base_string = $base_string;
+
+    $key_parts = array(
+      $consumer->secret,
+      ($token) ? $token->secret : ""
+    );
+
+    $key_parts = OAuthUtil::urlencode_rfc3986($key_parts);
+    $key = implode('&', $key_parts);
+
+    return base64_encode(hash_hmac('sha1', $base_string, $key, true));
+  }
+}
+}
+
+/**
+ * The PLAINTEXT method does not provide any security protection and SHOULD only be used 
+ * over a secure channel such as HTTPS. It does not use the Signature Base String.
+ *   - Chapter 9.4 ("PLAINTEXT")
+ */
+if(!class_exists('OAuthSignatureMethod_PLAINTEXT')) {
+class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod {
+  public function get_name() {
+    return "PLAINTEXT";
+  }
+
+  /**
+   * oauth_signature is set to the concatenated encoded values of the Consumer Secret and 
+   * Token Secret, separated by a '&' character (ASCII code 38), even if either secret is 
+   * empty. The result MUST be encoded again.
+   *   - Chapter 9.4.1 ("Generating Signatures")
+   *
+   * Please note that the second encoding MUST NOT happen in the SignatureMethod, as
+   * OAuthRequest handles this!
+   */
+  public function build_signature($request, $consumer, $token) {
+    $key_parts = array(
+      $consumer->secret,
+      ($token) ? $token->secret : ""
+    );
+
+    $key_parts = OAuthUtil::urlencode_rfc3986($key_parts);
+    $key = implode('&', $key_parts);
+    $request->base_string = $key;
+
+    return $key;
+  }
+}
+}
+
+/**
+ * The RSA-SHA1 signature method uses the RSASSA-PKCS1-v1_5 signature algorithm as defined in 
+ * [RFC3447] section 8.2 (more simply known as PKCS#1), using SHA-1 as the hash function for 
+ * EMSA-PKCS1-v1_5. It is assumed that the Consumer has provided its RSA public key in a 
+ * verified way to the Service Provider, in a manner which is beyond the scope of this 
+ * specification.
+ *   - Chapter 9.3 ("RSA-SHA1")
+ */
+abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod {
+  public function get_name() {
+    return "RSA-SHA1";
+  }
+
+  // Up to the SP to implement this lookup of keys. Possible ideas are:
+  // (1) do a lookup in a table of trusted certs keyed off of consumer
+  // (2) fetch via http using a url provided by the requester
+  // (3) some sort of specific discovery code based on request
+  //
+  // Either way should return a string representation of the certificate
+  protected abstract function fetch_public_cert(&$request);
+
+  // Up to the SP to implement this lookup of keys. Possible ideas are:
+  // (1) do a lookup in a table of trusted certs keyed off of consumer
+  //
+  // Either way should return a string representation of the certificate
+  protected abstract function fetch_private_cert(&$request);
+
+  public function build_signature($request, $consumer, $token) {
+    $base_string = $request->get_signature_base_string();
+    $request->base_string = $base_string;
+
+    // Fetch the private key cert based on the request
+    $cert = $this->fetch_private_cert($request);
+
+    // Pull the private key ID from the certificate
+    $privatekeyid = openssl_get_privatekey($cert);
+
+    // Sign using the key
+    $ok = openssl_sign($base_string, $signature, $privatekeyid);
+
+    // Release the key resource
+    openssl_free_key($privatekeyid);
+
+    return base64_encode($signature);
+  }
+
+  public function check_signature($request, $consumer, $token, $signature) {
+    $decoded_sig = base64_decode($signature);
+
+    $base_string = $request->get_signature_base_string();
+
+    // Fetch the public key cert based on the request
+    $cert = $this->fetch_public_cert($request);
+
+    // Pull the public key ID from the certificate
+    $publickeyid = openssl_get_publickey($cert);
+
+    // Check the computed signature against the one passed in the query
+    $ok = openssl_verify($base_string, $decoded_sig, $publickeyid);
+
+    // Release the key resource
+    openssl_free_key($publickeyid);
+
+    return $ok == 1;
+  }
+}
+
+class OAuthRequest {
+  private $parameters;
+  private $http_method;
+  private $http_url;
+  // for debug purposes
+  public $base_string;
+  public static $version = '1.0';
+  public static $POST_INPUT = 'php://input';
+
+  function __construct($http_method, $http_url, $parameters=NULL) {
+    @$parameters or $parameters = array();
+    $parameters = array_merge( OAuthUtil::parse_parameters(parse_url($http_url, PHP_URL_QUERY)), $parameters);
+    $this->parameters = $parameters;
+    $this->http_method = $http_method;
+    $this->http_url = $http_url;
+  }
+
+
+  /**
+   * attempt to build up a request from what was passed to the server
+   */
+  public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) {
+    $scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on")
+              ? 'http'
+              : 'https';
+    @$http_url or $http_url = $scheme .
+                              '://' . $_SERVER['HTTP_HOST'] .
+                              ':' .
+                              $_SERVER['SERVER_PORT'] .
+                              $_SERVER['REQUEST_URI'];
+    @$http_method or $http_method = $_SERVER['REQUEST_METHOD'];
+
+    // We weren't handed any parameters, so let's find the ones relevant to
+    // this request.
+    // If you run XML-RPC or similar you should use this to provide your own
+    // parsed parameter-list
+    if (!$parameters) {
+      // Find request headers
+      $request_headers = OAuthUtil::get_headers();
+
+      // Parse the query-string to find GET parameters
+      $parameters = OAuthUtil::parse_parameters($_SERVER['QUERY_STRING']);
+
+      // It's a POST request of the proper content-type, so parse POST
+      // parameters and add those overriding any duplicates from GET
+      if ($http_method == "POST"
+          && @strstr($request_headers["Content-Type"],
+                     "application/x-www-form-urlencoded")
+          ) {
+        $post_data = OAuthUtil::parse_parameters(
+          file_get_contents(self::$POST_INPUT)
+        );
+        $parameters = array_merge($parameters, $post_data);
+      }
+
+      // We have a Authorization-header with OAuth data. Parse the header
+      // and add those overriding any duplicates from GET or POST
+      if (@substr($request_headers['Authorization'], 0, 6) == "OAuth ") {
+        $header_parameters = OAuthUtil::split_header(
+          $request_headers['Authorization']
+        );
+        $parameters = array_merge($parameters, $header_parameters);
+      }
+
+    }
+
+    return new OAuthRequest($http_method, $http_url, $parameters);
+  }
+
+  /**
+   * pretty much a helper function to set up the request
+   */
+  public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) {
+    @$parameters or $parameters = array();
+    $defaults = array("oauth_version" => OAuthRequest::$version,
+                      "oauth_nonce" => OAuthRequest::generate_nonce(),
+                      "oauth_timestamp" => OAuthRequest::generate_timestamp(),
+                      "oauth_consumer_key" => $consumer->key);
+    if ($token)
+      $defaults['oauth_token'] = $token->key;
+
+    $parameters = array_merge($defaults, $parameters);
+
+    return new OAuthRequest($http_method, $http_url, $parameters);
+  }
+
+  public function set_parameter($name, $value, $allow_duplicates = true) {
+    if ($allow_duplicates && isset($this->parameters[$name])) {
+      // We have already added parameter(s) with this name, so add to the list
+      if (is_scalar($this->parameters[$name])) {
+        // This is the first duplicate, so transform scalar (string)
+        // into an array so we can add the duplicates
+        $this->parameters[$name] = array($this->parameters[$name]);
+      }
+
+      $this->parameters[$name][] = $value;
+    } else {
+      $this->parameters[$name] = $value;
+    }
+  }
+
+  public function get_parameter($name) {
+    return isset($this->parameters[$name]) ? $this->parameters[$name] : null;
+  }
+
+  public function get_parameters() {
+    return $this->parameters;
+  }
+
+  public function unset_parameter($name) {
+    unset($this->parameters[$name]);
+  }
+
+  /**
+   * The request parameters, sorted and concatenated into a normalized string.
+   * @return string
+   */
+  public function get_signable_parameters() {
+    // Grab all parameters
+    $params = $this->parameters;
+
+    // Remove oauth_signature if present
+    // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.")
+    if (isset($params['oauth_signature'])) {
+      unset($params['oauth_signature']);
+    }
+
+    return OAuthUtil::build_http_query($params);
+  }
+
+  /**
+   * Returns the base string of this request
+   *
+   * The base string defined as the method, the url
+   * and the parameters (normalized), each urlencoded
+   * and the concated with &.
+   */
+  public function get_signature_base_string() {
+    $parts = array(
+      $this->get_normalized_http_method(),
+      $this->get_normalized_http_url(),
+      $this->get_signable_parameters()
+    );
+
+    $parts = OAuthUtil::urlencode_rfc3986($parts);
+
+    return implode('&', $parts);
+  }
+
+  /**
+   * just uppercases the http method
+   */
+  public function get_normalized_http_method() {
+    return strtoupper($this->http_method);
+  }
+
+  /**
+   * parses the url and rebuilds it to be
+   * scheme://host/path
+   */
+  public function get_normalized_http_url() {
+    $parts = parse_url($this->http_url);
+
+    $port = @$parts['port'];
+    $scheme = $parts['scheme'];
+    $host = $parts['host'];
+    $path = @$parts['path'];
+
+    $port or $port = ($scheme == 'https') ? '443' : '80';
+
+    if (($scheme == 'https' && $port != '443')
+        || ($scheme == 'http' && $port != '80')) {
+      $host = "$host:$port";
+    }
+    return "$scheme://$host$path";
+  }
+
+  /**
+   * builds a url usable for a GET request
+   */
+  public function to_url() {
+    $post_data = $this->to_postdata();
+    $out = $this->get_normalized_http_url();
+    if ($post_data) {
+      $out .= '?'.$post_data;
+    }
+    return $out;
+  }
+
+  /**
+   * builds the data one would send in a POST request
+   */
+  public function to_postdata() {
+    return OAuthUtil::build_http_query($this->parameters);
+  }
+
+  /**
+   * builds the Authorization: header
+   */
+  public function to_header($realm=null) {
+    $first = true;
+	if($realm) {
+      $out = 'Authorization: OAuth realm="' . OAuthUtil::urlencode_rfc3986($realm) . '"';
+      $first = false;
+    } else
+      $out = 'Authorization: OAuth';
+
+    $total = array();
+    foreach ($this->parameters as $k => $v) {
+      if (substr($k, 0, 5) != "oauth") continue;
+      if (is_array($v)) {
+        throw new Exception('Arrays not supported in headers');
+      }
+      $out .= ($first) ? ' ' : ',';
+      $out .= OAuthUtil::urlencode_rfc3986($k) .
+              '="' .
+              OAuthUtil::urlencode_rfc3986($v) .
+              '"';
+      $first = false;
+    }
+    return $out;
+  }
+
+  public function __toString() {
+    return $this->to_url();
+  }
+
+
+  public function sign_request($signature_method, $consumer, $token) {
+    $this->set_parameter(
+      "oauth_signature_method",
+      $signature_method->get_name(),
+      false
+    );
+    $signature = $this->build_signature($signature_method, $consumer, $token);
+    $this->set_parameter("oauth_signature", $signature, false);
+  }
+
+  public function build_signature($signature_method, $consumer, $token) {
+    $signature = $signature_method->build_signature($this, $consumer, $token);
+    return $signature;
+  }
+
+  /**
+   * util function: current timestamp
+   */
+  private static function generate_timestamp() {
+    return time();
+  }
+
+  /**
+   * util function: current nonce
+   */
+  private static function generate_nonce() {
+    $mt = microtime();
+    $rand = mt_rand();
+
+    return md5($mt . $rand); // md5s look nicer than numbers
+  }
+}
+
+class OAuthServer {
+  protected $timestamp_threshold = 300; // in seconds, five minutes
+  protected $version = '1.0';             // hi blaine
+  protected $signature_methods = array();
+
+  protected $data_store;
+
+  function __construct($data_store) {
+    $this->data_store = $data_store;
+  }
+
+  public function add_signature_method($signature_method) {
+    $this->signature_methods[$signature_method->get_name()] =
+      $signature_method;
+  }
+
+  // high level functions
+
+  /**
+   * process a request_token request
+   * returns the request token on success
+   */
+  public function fetch_request_token(&$request) {
+    $this->get_version($request);
+
+    $consumer = $this->get_consumer($request);
+
+    // no token required for the initial token request
+    $token = NULL;
+
+    $this->check_signature($request, $consumer, $token);
+
+    // Rev A change
+    $callback = $request->get_parameter('oauth_callback');
+    $new_token = $this->data_store->new_request_token($consumer, $callback);
+
+    return $new_token;
+  }
+
+  /**
+   * process an access_token request
+   * returns the access token on success
+   */
+  public function fetch_access_token(&$request) {
+    $this->get_version($request);
+
+    $consumer = $this->get_consumer($request);
+
+    // requires authorized request token
+    $token = $this->get_token($request, $consumer, "request");
+
+    $this->check_signature($request, $consumer, $token);
+
+    // Rev A change
+    $verifier = $request->get_parameter('oauth_verifier');
+    $new_token = $this->data_store->new_access_token($token, $consumer, $verifier);
+
+    return $new_token;
+  }
+
+  /**
+   * verify an api call, checks all the parameters
+   */
+  public function verify_request(&$request) {
+    $this->get_version($request);
+    $consumer = $this->get_consumer($request);
+    $token = $this->get_token($request, $consumer, "access");
+    $this->check_signature($request, $consumer, $token);
+    return array($consumer, $token);
+  }
+
+  // Internals from here
+  /**
+   * version 1
+   */
+  private function get_version(&$request) {
+    $version = $request->get_parameter("oauth_version");
+    if (!$version) {
+      // Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present. 
+      // Chapter 7.0 ("Accessing Protected Ressources")
+      $version = '1.0';
+    }
+    if ($version !== $this->version) {
+      throw new Exception("OAuth version '$version' not supported");
+    }
+    return $version;
+  }
+
+  /**
+   * figure out the signature with some defaults
+   */
+  private function get_signature_method(&$request) {
+    $signature_method =
+        @$request->get_parameter("oauth_signature_method");
+
+    if (!$signature_method) {
+      // According to chapter 7 ("Accessing Protected Ressources") the signature-method
+      // parameter is required, and we can't just fallback to PLAINTEXT
+      throw new Exception('No signature method parameter. This parameter is required');
+    }
+
+    if (!in_array($signature_method,
+                  array_keys($this->signature_methods))) {
+      throw new Exception(
+        "Signature method '$signature_method' not supported " .
+        "try one of the following: " .
+        implode(", ", array_keys($this->signature_methods))
+      );
+    }
+    return $this->signature_methods[$signature_method];
+  }
+
+  /**
+   * try to find the consumer for the provided request's consumer key
+   */
+  private function get_consumer(&$request) {
+    $consumer_key = @$request->get_parameter("oauth_consumer_key");
+    if (!$consumer_key) {
+      throw new Exception("Invalid consumer key");
+    }
+
+    $consumer = $this->data_store->lookup_consumer($consumer_key);
+    if (!$consumer) {
+      throw new Exception("Invalid consumer");
+    }
+
+    return $consumer;
+  }
+
+  /**
+   * try to find the token for the provided request's token key
+   */
+  private function get_token(&$request, $consumer, $token_type="access") {
+    $token_field = @$request->get_parameter('oauth_token');
+    $token = $this->data_store->lookup_token(
+      $consumer, $token_type, $token_field
+    );
+    if (!$token) {
+      throw new Exception("Invalid $token_type token: $token_field");
+    }
+    return $token;
+  }
+
+  /**
+   * all-in-one function to check the signature on a request
+   * should guess the signature method appropriately
+   */
+  private function check_signature(&$request, $consumer, $token) {
+    // this should probably be in a different method
+    $timestamp = @$request->get_parameter('oauth_timestamp');
+    $nonce = @$request->get_parameter('oauth_nonce');
+
+    $this->check_timestamp($timestamp);
+    $this->check_nonce($consumer, $token, $nonce, $timestamp);
+
+    $signature_method = $this->get_signature_method($request);
+
+    $signature = $request->get_parameter('oauth_signature');
+    $valid_sig = $signature_method->check_signature(
+      $request,
+      $consumer,
+      $token,
+      $signature
+    );
+
+    if (!$valid_sig) {
+      throw new Exception("Invalid signature");
+    }
+  }
+
+  /**
+   * check that the timestamp is new enough
+   */
+  private function check_timestamp($timestamp) {
+    if( ! $timestamp )
+      throw new Exception(
+        'Missing timestamp parameter. The parameter is required'
+      );
+    
+    // verify that timestamp is recentish
+    $now = time();
+    if (abs($now - $timestamp) > $this->timestamp_threshold) {
+      throw new Exception(
+        "Expired timestamp, yours $timestamp, ours $now"
+      );
+    }
+  }
+
+  /**
+   * check that the nonce is not repeated
+   */
+  private function check_nonce($consumer, $token, $nonce, $timestamp) {
+    if( ! $nonce )
+      throw new Exception(
+        'Missing nonce parameter. The parameter is required'
+      );
+
+    // verify that the nonce is uniqueish
+    $found = $this->data_store->lookup_nonce(
+      $consumer,
+      $token,
+      $nonce,
+      $timestamp
+    );
+    if ($found) {
+      throw new Exception("Nonce already used: $nonce");
+    }
+  }
+
+}
+
+class OAuthDataStore {
+  function lookup_consumer($consumer_key) {
+    // implement me
+  }
+
+  function lookup_token($consumer, $token_type, $token) {
+    // implement me
+  }
+
+  function lookup_nonce($consumer, $token, $nonce, $timestamp) {
+    // implement me
+  }
+
+  function new_request_token($consumer, $callback = null) {
+    // return a new token attached to this consumer
+  }
+
+  function new_access_token($token, $consumer, $verifier = null) {
+    // return a new access token attached to this consumer
+    // for the user associated with this token if the request token
+    // is authorized
+    // should also invalidate the request token
+  }
+
+}
+
+class OAuthUtil {
+  public static function urlencode_rfc3986($input) {
+  if (is_array($input)) {
+    return array_map(array('OAuthUtil', 'urlencode_rfc3986'), $input);
+  } else if (is_scalar($input)) {
+    return str_replace(
+      '+',
+      ' ',
+      str_replace('%7E', '~', rawurlencode($input))
+    );
+  } else {
+    return '';
+  }
+}
+
+
+  // This decode function isn't taking into consideration the above
+  // modifications to the encoding process. However, this method doesn't
+  // seem to be used anywhere so leaving it as is.
+  public static function urldecode_rfc3986($string) {
+    return urldecode($string);
+  }
+
+  // Utility function for turning the Authorization: header into
+  // parameters, has to do some unescaping
+  // Can filter out any non-oauth parameters if needed (default behaviour)
+  // May 28th, 2010 - method updated to tjerk.meesters for a speed improvement.
+  //                  see http://code.google.com/p/oauth/issues/detail?id=163
+  public static function split_header($header, $only_allow_oauth_parameters = true) {
+    $params = array();
+    if (preg_match_all('/('.($only_allow_oauth_parameters ? 'oauth_' : '').'[a-z_-]*)=(:?"([^"]*)"|([^,]*))/', $header, $matches)) {
+      foreach ($matches[1] as $i => $h) {
+        $params[$h] = OAuthUtil::urldecode_rfc3986(empty($matches[3][$i]) ? $matches[4][$i] : $matches[3][$i]);
+      }
+      if (isset($params['realm'])) {
+        unset($params['realm']);
+      }
+    }
+    return $params;
+  }
+
+  // helper to try to sort out headers for people who aren't running apache
+  public static function get_headers() {
+    if (function_exists('apache_request_headers')) {
+      // we need this to get the actual Authorization: header
+      // because apache tends to tell us it doesn't exist
+      $headers = apache_request_headers();
+
+      // sanitize the output of apache_request_headers because
+      // we always want the keys to be Cased-Like-This and arh()
+      // returns the headers in the same case as they are in the
+      // request
+      $out = array();
+      foreach ($headers AS $key => $value) {
+        $key = str_replace(
+            " ",
+            "-",
+            ucwords(strtolower(str_replace("-", " ", $key)))
+          );
+        $out[$key] = $value;
+      }
+    } else {
+      // otherwise we don't have apache and are just going to have to hope
+      // that $_SERVER actually contains what we need
+      $out = array();
+      if( isset($_SERVER['CONTENT_TYPE']) )
+        $out['Content-Type'] = $_SERVER['CONTENT_TYPE'];
+      if( isset($_ENV['CONTENT_TYPE']) )
+        $out['Content-Type'] = $_ENV['CONTENT_TYPE'];
+
+      foreach ($_SERVER as $key => $value) {
+        if (substr($key, 0, 5) == "HTTP_") {
+          // this is chaos, basically it is just there to capitalize the first
+          // letter of every word that is not an initial HTTP and strip HTTP
+          // code from przemek
+          $key = str_replace(
+            " ",
+            "-",
+            ucwords(strtolower(str_replace("_", " ", substr($key, 5))))
+          );
+          $out[$key] = $value;
+        }
+      }
+    }
+    return $out;
+  }
+
+  // This function takes a input like a=b&a=c&d=e and returns the parsed
+  // parameters like this
+  // array('a' => array('b','c'), 'd' => 'e')
+  public static function parse_parameters( $input ) {
+    if (!isset($input) || !$input) return array();
+
+    $pairs = explode('&', $input);
+
+    $parsed_parameters = array();
+    foreach ($pairs as $pair) {
+      $split = explode('=', $pair, 2);
+      $parameter = OAuthUtil::urldecode_rfc3986($split[0]);
+      $value = isset($split[1]) ? OAuthUtil::urldecode_rfc3986($split[1]) : '';
+
+      if (isset($parsed_parameters[$parameter])) {
+        // We have already recieved parameter(s) with this name, so add to the list
+        // of parameters with this name
+
+        if (is_scalar($parsed_parameters[$parameter])) {
+          // This is the first duplicate, so transform scalar (string) into an array
+          // so we can add the duplicates
+          $parsed_parameters[$parameter] = array($parsed_parameters[$parameter]);
+        }
+
+        $parsed_parameters[$parameter][] = $value;
+      } else {
+        $parsed_parameters[$parameter] = $value;
+      }
+    }
+    return $parsed_parameters;
+  }
+
+  public static function build_http_query($params) {
+    if (!$params) return '';
+
+    // Urlencode both keys and values
+    $keys = OAuthUtil::urlencode_rfc3986(array_keys($params));
+    $values = OAuthUtil::urlencode_rfc3986(array_values($params));
+    $params = array_combine($keys, $values);
+
+    // Parameters are sorted by name, using lexicographical byte value ordering.
+    // Ref: Spec: 9.1.1 (1)
+    uksort($params, 'strcmp');
+
+    $pairs = array();
+    foreach ($params as $parameter => $value) {
+      if (is_array($value)) {
+        // If two or more parameters share the same name, they are sorted by their value
+        // Ref: Spec: 9.1.1 (1)
+        natsort($value);
+        foreach ($value as $duplicate_value) {
+          $pairs[] = $parameter . '=' . $duplicate_value;
+        }
+      } else {
+        $pairs[] = $parameter . '=' . $value;
+      }
+    }
+    // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)
+    // Each name-value pair is separated by an '&' character (ASCII code 38)
+    return implode('&', $pairs);
+  }
+}
+}
\ No newline at end of file
diff --git a/wp-content/plugins/flattr/readme.txt b/wp-content/plugins/flattr/readme.txt
index 5f9aff6aec0addc8dfe288458f12101d1ba74978..a2307f5e9e8fa4411aa6f8b4528b0ce513fee741 100644
--- a/wp-content/plugins/flattr/readme.txt
+++ b/wp-content/plugins/flattr/readme.txt
@@ -1,8 +1,9 @@
 === Flattr ===
-Contributors: flattr.com
+Contributors: aphex3k
+Donate link: https://flattr.com/donation/give/to/der_michael
 Tags: flattr, donate, micropayments
 Requires at least: 2.9.0
-Tested up to: 3.0.1
+Tested up to: 3.0.5
 Stable tag: trunk
 
 This plugin allows you to easily add a Flattr button to your wordpress blog.
@@ -18,11 +19,12 @@ Flattr solves this issue. When you're registered to flattr, you pay a small mont
 == Installation ==
 
 Note that we only support PHP 5 and WordPress 2.9 or above.
+To use advanced features like auto-submission or feed-buttons, your web server needs cURL extension installed.
 
 1. Upload the folder 'flattr' to your server in the folder '/wp-content/plugins/'
 2. Go to the WordPress control panel and find the 'Plugins' section
 3. Activate the plugin 'Flattr'
-4. Go to the 'Options' section and select 'Flattr'
+4. Go to the 'Options' section and authrize your blog against flattr.com
 5. Select your default category (which usually would be 'text' if you have a normal blog), select your default language and type in your Flattr user ID (your user ID can be found on your dashboard on http://flattr.com/ )
 6. If you want the Flattr button to be automagically included at the end of your posts, leave the checkbox checked
 7. If you want to add the Flattr button manually in your theme, uncheck the checkbox and use the following code snippet:
@@ -35,6 +37,36 @@ Note that we only support PHP 5 and WordPress 2.9 or above.
 
 == Changelog ==
 
+`Attention: ` It is mandatory to disable FlattRSS and Flattr Widget standalone plugins before upgrading.
+
+= 0.9.22.2 =
+* Plugin basic functionality will work even though cURL is not available
+
+= 0.9.22.1 =
+* Bugfix release
+* fixed empty admin dashboard
+
+= 0.9.22 =
+* Wordpress 3 MS (ex-MU) support
+* Using latest Flattr REST API 0.5
+
+= 0.9.21.1 =
+* Bugfix release
+* Reauthorizing and Reconnection working.
+
+If you rely on full flattr functionality for your blog you might want to consider skipping this version.
+= 0.9.21 =
+* The Javascript button now validates against w3c html validator. Best regards to Tim Dellas.
+* HTTP/HTTPS callback fix(?)
+* Integrate FlattRSS plugin
+* Integrate Flattr Widegt plugin
+* New Admin Dashboard with tabbed navigation
+
+= 0.9.20 =
+* plugin programmer changed `;)`
+* adressing the borked excerpt behaviour
+* Flattr plugins dashboard pages are moved to a seperate submenu
+
 = 0.9.19 =
 Dont show Flattr button on password protected posts until the password has been accepted.
 
@@ -124,51 +156,13 @@ Fixed tags
 = 0.4 =
 * First public version
 
-== Upgrade Notice ==
-
-= 0.9.9 =
-Fixed empty excerpts
-
-= 0.9.8 =
-Fixed tags
-
-= 0.9.7 =
-Upgrade to get auto excerpts to work for rss feeds.
-
-= 0.9.6 =
-Upgrade if using manual the_flattr_permalink() calls.
-
-= 0.9.5 =
-Upgrade to get rid of flattr buttons from your rss feeds
-
-= 0.9.4 =
-Upgrade to be able to disable button for pages
-
-= 0.9.3 =
-Upgrade to fix language problems
-
-= 0.9 =
-New goodies available. Fun for the whole family!
-
-= 0.71 =
-Short php open tags where used in some places. Upgrade if your host does not support short open tags.
-
-= 0.7 =
-Language support. Upgrade required.
-
-= 0.6 =
-Previous version didnt work with Smart YouTube when no excerpt was entered.
-
-= 0.5 =
-Previous version makes your blog posts display incorrectly if you don't enter an excerpt.
-
-= 0.4 =
-Upgrade notices describe the reason a user should upgrade.  No more than 300 characters.
+== Frequently Asked Questions ==
 
+Q: I recieve an error message when trying to (re-)authorize my blog with flattr, what's wrong?
+A: Please clear session/cookie/browser cache and try again please.
 
 == Support ==
 
-Direct support: https://flattr.com/support/contact
-IRC: #flattr on Freequest 
-Forum: http://forum.flattr.com/
-Twitter: Twitter to #flattr and the community or a friendly developer might help you.
+For support requests regarding the wordpress plugin, please visit the plugin support forum: http://wordpress.org/tags/flattr?forum_id=10
+
+For every other Flattr support request head over to the Flattr forum: http://forum.flattr.com/
diff --git a/wp-content/plugins/flattr/redirect.php b/wp-content/plugins/flattr/redirect.php
new file mode 100644
index 0000000000000000000000000000000000000000..b7606f4197e55c4d01d493740824a8c5fd10b40f
--- /dev/null
+++ b/wp-content/plugins/flattr/redirect.php
@@ -0,0 +1,175 @@
+<?php
+
+if (isset ($_GET['id'])&&
+        isset ($_GET['md5'])&&
+        isset ($_GET['flattrss_redirect'])&&
+        function_exists('curl_init')) {
+
+    $e = error_reporting();
+    if (get_option('flattrss_error_reporting')) {
+        error_reporting(0);
+    }
+
+    $old_charset = ini_get('default_charset');
+    ini_set('default_charset',get_option('blog_charset'));
+
+    $id = intval($_GET['id']);
+    $md5 = $_GET['md5'];
+
+    $post = get_post($id,ARRAY_A);
+
+    function return_error($x) { die(strval($x)); }
+
+    if (md5($post['post_title']) != $md5) {
+        return_error("Post title mismatch");
+    }
+
+    if ($post['post_status'] != "publish") {
+        return_error("Post status not published");
+    }
+
+    if (get_option('flattrss_clicktrack_enabled')) {
+        update_option('flattrss_clickthrough_n', get_option('flattrss_clickthrough_n')+1);
+    }
+
+    $url = get_permalink($post['ID']);
+    $tagsA = get_the_tags($post['ID']);
+    $tags = "";
+
+    if ($tagsA) {
+        foreach ($tagsA as $tag) {
+            if (strlen($tags)!=0){
+                $tags .=",";
+            }
+            $tags .= $tag->name;
+        }
+    }
+
+    if (trim($tags) == "") {
+        $tags .= "blog";
+    }
+
+    $category = "text";
+    if (get_option('flattr_cat')!= "") {
+        $category = get_option('flattr_cat');
+    }
+
+    $language = "en_EN";
+    if (get_option('flattr_lng')!="") {
+        $language = get_option('flattr_lng');
+    }
+
+    function getExcerpt($post, $excerpt_max_length = 1024) {
+
+	$excerpt = $post['post_excerpt'];
+	if (trim($excerpt) == "") {
+        	$excerpt = $post['post_content'];
+	}
+
+        $excerpt = strip_shortcodes($excerpt);
+        $excerpt = strip_tags($excerpt);
+        $excerpt = str_replace(']]>', ']]&gt;', $excerpt);
+
+        // Hacks for various plugins
+        $excerpt = preg_replace('/httpvh:\/\/[^ ]+/', '', $excerpt); // hack for smartyoutube plugin
+        $excerpt = preg_replace('%httpv%', 'http', $excerpt); // hack for youtube lyte plugin
+
+        // Try to shorten without breaking words
+        if ( strlen($excerpt) > $excerpt_max_length ) {
+            $pos = strpos($excerpt, ' ', $excerpt_max_length);
+            if ($pos !== false) {
+                    $excerpt = substr($excerpt, 0, $pos);
+            }
+        }
+
+        // If excerpt still too long
+        if (strlen($excerpt) > $excerpt_max_length) {
+            $excerpt = substr($excerpt, 0, $excerpt_max_length);
+        }
+
+        return $excerpt;
+    }
+
+    $content = preg_replace(array('/\<br\s*\/?\>/i',"/\n/","/\r/", "/ +/"), " ", getExcerpt($post));
+    $content = strip_tags($content);
+
+    if (strlen(trim($content)) == 0) {
+        $content = "(no content provided...)";
+    }
+
+    $title = strip_tags($post['post_title']);
+    $title = str_replace(array("\"","\'"), "", $title);
+
+    include_once 'oAuth/flattr_rest.php';
+    require_once 'oAuth/oauth.php';
+
+    $api_key = get_option('flattrss_api_key');
+    $api_secret = get_option('flattrss_api_secret');
+    $oauth_token = get_option('flattrss_api_oauth_token');
+    $oauth_token_secret = get_option('flattrss_api_oauth_token_secret');
+
+    $flattr_user = new Flattr_Rest($api_key, $api_secret, $oauth_token, $oauth_token_secret);
+
+    if ($flattr_user->error()) {
+        return_error("Flattr User Error!");
+    }
+
+    function encode($string) {
+        if (function_exists("mb_detect_encoding")) {
+            $string = (mb_detect_encoding($string, "UTF-8") == "UTF-8" )? $string : utf8_encode($string);
+        } else {
+            $string = utf8_encode($string);
+        }
+        return $string;
+    }
+
+    if (get_option('flattrss_autodonate') && !isset($_SESSION['flattrss_autodonate_click'])) {
+        $flattr_user->clickThing("ead246fc95fc401ce69d15f3981da971");
+        $_SESSION['flattrss_autodonate_click'] = true;
+    }
+
+    $thing = $flattr_user->submitThing($url, encode($title), $category, encode($content), $tags, $language);
+
+    if($flattr_user->http_code == 500) {
+        /*
+        header('Status-Code: 307');
+        header('LOCATION: '.$url);
+         */
+        /*
+        print_r(array($url, encode($title), $category, encode($content), $tags, $language));
+        print_r($flattr_user);
+        print_r($thing);
+        die();
+
+        break;
+         */
+    }
+
+    if (isset ($thing['int_id'])) {
+        header('LOCATION: https://flattr.com/thing/'.$thing['int_id']);
+    }
+
+    $thingList = $flattr_user->getThingList();
+    $thing_id = 0;
+
+    foreach ($thingList as $thing){
+        if($thing['url'] == $url) {
+            $thing_id = $thing['int_id'];
+        }
+    }
+
+    $location = $url;
+
+    if ($thing_id != 0) {
+        $location = 'https://flattr.com/thing/'.$thing_id;
+    }
+
+    header('Status-Code: 307');
+    header('LOCATION: '. $location);
+
+    ini_set('default_charset',$old_charset);
+
+    error_reporting($e);
+
+    exit ($thing_id);
+}
\ No newline at end of file
diff --git a/wp-content/plugins/flattr/settings-template.php b/wp-content/plugins/flattr/settings-template.php
index a75ec196506f0b5dbb5762919fc2a40165ff998a..6680073583f5a5ebc2e8c691ed6a31d67d17846a 100644
--- a/wp-content/plugins/flattr/settings-template.php
+++ b/wp-content/plugins/flattr/settings-template.php
@@ -1,13 +1,31 @@
-	<div class="wrap">
-		<h2><?php _e('Flattr Settings'); ?></h2>
+<?php
 
-		<h3>User account</h3>
-		<table class="form-table">
+    define(FLATTRSS_PLUGIN_PATH, get_bloginfo('wpurl') . '/wp-content/plugins/flattr');
+
+    include_once 'oAuth/flattr_rest.php';
+    include_once 'oAuth/oauth.php';
+
+    $server = $_SERVER["SERVER_NAME"];
+    $server = preg_split("/:/", $server);
+    $server = $server[0];
+
+    ?>
+<div class="wrap flattr-wrap" style="width:90%">
+            <div>
+            <!-- <h2><?php _e('Flattr Settings'); ?> <img id="loaderanim" onload="javascript:{document.getElementById('loaderanim').style.display='none'};" src="<?php echo get_bloginfo('wpurl') . '/wp-content/plugins/flattr'.'/img/loader.gif' ?>"/></h2> -->
+<div class="tabber">
+    <div style="float:right; margin-top: -31px;"><img src="../wp-content/plugins/flattr/img/flattr-logo-beta-small.png" alt="Flattr Beta Logo"/></div>
+    <div class="tabbertab" title="Flattr Account" style="border-left:0;">
+		<h2><?php _e('Basic Setup'); ?></h2>
+                <p>
+                    The basic account setup enables this plugin to work.
+                </p>
+                <table class="form-table">
 			<tr valign="top">
 				<th scope="row"><?php _e('Your Flattr account'); ?></th>
 				<td>
 					<?php
-					$connect_callback = rawurlencode( ($_SERVER['HTTPS'] ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
+					$connect_callback = rawurlencode( (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
 					if (get_option('flattr_uid')) { ?>
 						Connected as
 							<?php
@@ -27,11 +45,95 @@
 				</td>
 			</tr>
 		</table>
+<?php if (get_option('flattr_uid') && function_exists('curl_init')) { ?>
+                <h2>Advanced Setup</h2>
+                <p>
+                    The advanced account setup enables advanced features like Feed buttons and autosubmit.
+                </p>
+<?php
+    $oauth_token = get_option('flattrss_api_oauth_token');
+    $oauth_token_secret = get_option('flattrss_api_oauth_token_secret');
+    $flattrss_api_key = get_option('flattrss_api_key');
+    $flattrss_api_secret = get_option('flattrss_api_secret');
+
+    if ($oauth_token == $oauth_token_secret || $flattrss_api_key == $flattrss_api_secret) {
+?>
+      <ol>
+          <li>Login to your Flattr Account at <a href="https://flattr.com/" target="_blank">flattr.com</a></li>
+          <li>To get your personal Flattr APP Key and APP Secret you need to <a href="https://flattr.com/apps/new" target="_blank">register your blog</a> as Flattr app. <small><a href="http://developers.flattr.net/doku.php/register_your_application" target="_blank">(More Info)</a></small></li>
+          <li>Choose reasonable values for <em>Application name</em>, <em>Application website</em> and <em>Application description</em></li>
+          <li>It is mandatory to <strong>select BROWSER application type!</strong> This plugin will currently <strong>not work if CLIENT is selected</strong>.</li>
+          <li>You must use <code><?php echo $server; ?></code> as callback domain.</li>
+          <li>Copy 'n Paste your APP Key and APP Secret in the corresponding fields below. Save Changes.</li>
+          <li>As soon as you saved your APP information <a href="#Authorize">authorize</a> your Flattr account with your own application.</li>
+          <li>If everything is done correctly you'll see your <a href="#UserInfo">Flattr username and info</a> on this site.</li>
+      </ol>
+<?php } ?>
+<form method="post" action="options.php">
+<?php settings_fields( 'flattr-settings-group' ); ?>
+    <table class="form-table">
+            <tr valign="top">
+                <th scope="row">Callback Domain</th>
+                <td><input size="30" value="<?php echo $server; ?>" readonly/></td>
+            </tr>
+            <tr valign="top">
+                <th scope="row">APP_KEY</th>
+                <td><input size="70" name="flattrss_api_key" value="<?php echo get_option('flattrss_api_key') ?>"/></td>
+            </tr>
+            <tr valign="top">
+                <th scope="row">APP_SECRET</th>
+                <td><input size="70" name="flattrss_api_secret" value="<?php echo get_option('flattrss_api_secret') ?>"/></td>
+            </tr>
+    </table>
+    <?php
+
+    $api_key = get_option('flattrss_api_key');
+    $api_secret = get_option('flattrss_api_secret');
+
+    if ($api_key != $api_secret) {
+
+    $flattr = new Flattr_Rest($api_key, $api_secret);
+
+    # Do not rawurlencode!
+    $callback_ = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ;
 
-		<h3>Other settings</h3>
-		<form method="post" action="options.php">
-			<?php settings_fields( 'flattr-settings-group' ); ?>
+    $token = $flattr->getRequestToken( $callback_ );
+    $_SESSION['flattrss_current_token'] = $token;
 
+    $url = $flattr->getAuthorizeUrl($token, 'read,readextended,click,publish');
+
+        ?><a name="Authorize"><div id="icon-options-general" class="icon32"><br /></div><h2>Authorize App</h2></a>
+        <p>In order to automatically generate the correct "<em>Things</em>" link for your blog post from the feed, you need to authorize you Flattr app with your Flattr account.</p>
+          <p><a href="<?php echo $url;?>">(re-)Authorize with Flattr</a>.
+<?php
+
+                #print_r($flattr);
+
+    $oauth_token = get_option('flattrss_api_oauth_token');
+    $oauth_token_secret = get_option('flattrss_api_oauth_token_secret');
+
+    if ($oauth_token != $oauth_token_secret) {
+        $flattr_user = new Flattr_Rest($api_key, $api_secret, $oauth_token, $oauth_token_secret);
+        if ( $flattr_user->error() ) {
+            echo( 'Error ' . $flattr_user->error() );
+        }
+        $user = $flattr_user->getUserInfo();
+?>
+    <div style="float:right"><img src="<?php echo $user['gravatar'];?>"></div><a name="UserInfo"><h2><img src="<?php echo FLATTRSS_PLUGIN_PATH .'/img/flattr_button.png' ?>" alt="flattr"/>&nbsp;Advanced Flattr User Info</h2></a>
+    <p><?php echo $user['firstname'];?>&nbsp;<?php echo $user['lastname'];?><br/>
+    <?php echo $user['username'];?>(<?php echo $user['id'];?>)</p>
+    <p>Flattr: <a href="https://flattr.com/profile/<?php echo $user['username'];?>" target="_blank">Profile</a>, <a href="https://flattr.com/dashboard" target="_blank">Dashboard</a>, <a href="https://flattr.com/settings" target="_blank">Settings</a></p>
+        <?php
+        #print_r($flattr_user);
+    }
+  }
+}
+?>
+    </div>
+    <div class="tabbertab" title="Post/Page Buttons">
+		<h2>Post/Page Buttons</h2>
+                <p>These options are for the Flattr buttons automatically generated for posts and pages.</p>
+		
 			<table class="form-table">
 
 				<tr valign="top">
@@ -86,13 +188,17 @@
 
 				<tr valign="top">
 					<th scope="row"><?php _e('Insert Flattr button into posts automagically'); ?></th>
-					<td><input <?php if (get_option('flattr_aut', 'off') == 'on') { echo(' checked="checked"'); } ?> type="checkbox" name="flattr_aut" value="on" /><br />(uncheck this if you would rather use <code>&lt;?php the_flattr_permalink() ?&gt;</code>)</td>
+					<td><input <?php if (get_option('flattr_aut', 'off') == 'on') { echo(' checked="checked"'); } ?> type="checkbox" name="flattr_aut" value="on" /></td>
 				</tr>
 
 				<tr valign="top">
 					<th scope="row"><?php _e('Insert Flattr button into pages automagically'); ?></th>
-					<td><input <?php if (get_option('flattr_aut_page', 'off') == 'on') { echo(' checked="checked"'); } ?> type="checkbox" name="flattr_aut_page" value="on" /><br />(uncheck this if you would rather use <code>&lt;?php the_flattr_permalink() ?&gt;</code>)</td>
+					<td><input <?php if (get_option('flattr_aut_page', 'off') == 'on') { echo(' checked="checked"'); } ?> type="checkbox" name="flattr_aut_page" value="on" /></td>
 				</tr>
+                                <tr valign="top">
+                                    <th scope="row" colspan="2">You can use <code>&lt;?php the_flattr_permalink() ?&gt;</code> in your template/theme to insert a flattr button
+                                    </th>
+                                </tr>
 
 				<?php if ( function_exists('st_add_widget') ) { ?>
 					<tr valign="top">
@@ -101,9 +207,130 @@
 					</tr>
 				<?php } ?>
 			</table>
+    </div>
+    <div class="tabbertab">
+            <h2>Advanced Settings</h2>
+            <?php if (!function_exists('curl_init')) { ?>
+            <p id="message" class="updated" style="padding:10px;"><strong>Attention:</strong>&nbsp;Currently nothing can be autosubmitted. Enable cURL extension for your webserver to use this feature!</p>
+            
+            <?php }?>
+            <table>
+                <tr valign="top">
+                    <th scope="row">Automatic Submission</th>
+                    <td><p><input name="flattrss_autosubmit" type="checkbox"<?php echo get_option('flattrss_autosubmit')? " checked": ""; echo ($oauth_token != $oauth_token_secret && get_option('flattr_hide') == false)? "":" disabled"; ?> />&nbsp;Check this box to automatically submit your blog post when you publish. You need to complete the full advanced setup in order for autosubmission to work.</p>
+                    </td>
+                </tr>
+                <tr valign="top">
+                    <th scope="row">Suppress Warnings</th>
+                    <td><p><input name="flattrss_error_reporting" type="checkbox"<?php echo get_option('flattrss_error_reporting')? " checked": "" ?>/>&nbsp;This is an advanced option for supression of error messages upon redirect from feed to thing. Use with caution, as flattr things might be submitted incomplete. Incomplete things are subject to be hidden on the flattr homepage!<br>If in doubt, leave disabled.</p>
+                    </td>
+                </tr>
+            </table>
+            <h2>Feed Settings</h2>
+            <?php if (!function_exists('curl_init')) { ?>
+            <p id="message" class="updated" style="padding:10px;"><strong>Attention:</strong>&nbsp;Currently no button will be inserted in your RSS feed. Enable cURL extension for your webserver to use this feature.</p>
+            <?php }?>
+            <table>
+                <tr valign="top">
+                <th scope="row">Custom Image URL</th>
+                <td><p>This image is served as static image to be included in the RSS/Atom Feed of your blog.</p><input name="flattrss_custom_image_url" size="70" value="<?php echo get_option('flattrss_custom_image_url');?>"/><br/>
+                    <?php if ( get_option('flattrss_custom_image_url') != FLATTRSS_PLUGIN_PATH .'/img/flattr-badge-large.png') { ?>
+                    Default Value:<br>
+                    <input size="70" value="<?php echo FLATTRSS_PLUGIN_PATH .'/img/flattr-badge-large.png';?>" readonly><br />
+                    <?php } ?>
+                    Preview:<br>
+                    <img src="<?php echo get_option('flattrss_custom_image_url');?>">
+                    <p></p>
+                </td>
+                </tr>
+            </table>
+    </div>
+    <div class="tabbertab">
+        <h2>Expert Settings</h2>
+        <p><strong>WARNING:</strong> Please do not change any value unless you are exactly sure of what you are doing! Settings made on this page will likely override every other behaviour.</p>
+        <table>
+            <tr valign="top">
+                <th scope="row">Post Type</th>
+                <td><p>Append Flattr Button only to selected post types.</p><ul>
+                    <?php $types = get_post_types();
+                          $flattr_post_types = get_option('flattr_post_types');
+                        foreach ($types as $type) {
+                            $selected = (is_array($flattr_post_types) && in_array($type, $flattr_post_types))? " checked" : "";
+                            echo "<li><input name=\"flattr_post_types[]\" value=\"$type\" type=\"checkbox\"$selected/>&nbsp;$type</li>";
+                        }
+                    ?></ul>
+                </td>
+            </tr>
+        </table>
+    </div>
+
+    <div class="tabbertab" title="Feedback">
+        <h2>Feedback</h2>
+        <table>
+            <tr>
+                <td valign="top" style="padding-top:13px;padding-right: 13px;">
+                    <script type="text/javascript">
+        var flattr_uid = "der_michael";
+        var flattr_tle = "Wordpress Flattr plugin";
+        var flattr_dsc = "Give your readers the opportunity to Flattr your effort. See http://wordpress.org/extend/plugins/flattr/ for details.";
+        var flattr_cat = "software";
+        var flattr_tag = "wordpress,plugin,flattr,rss";
+        var flattr_url = "http://wordpress.org/extend/plugins/flattr/";
+    </script><script src="http://api.flattr.com/button/load.js" type="text/javascript"></script>
+    <p><a href="https://flattr.com/donation/give/to/der_michael" style="color:#ffffff;text-decoration:none;background-image: url(https://flattr.com/_img/fluff/bg-boxlinks-green.png);border-radius:3px;text-shadow:#666666 0 1px 1px;width:53px;padding:1px;padding-top: 2px;padding-bottom: 2px;display:block;text-align:center;font-weight: bold;" target="_blank">Donate</a></p>
+                </td>
+                <td>
+                    <p>Please post feedback regarding wordpress integration on <a href="http://wordpress.org/tags/flattr?forum_id=10" target="_blank">the plugins board at wordpress.org</a>. You can use <a href="http://forum.flattr.net/" target="_blank">the official flattr board</a> for every concern regarding flattr.</p>
+                    <p>If you have a certain remark, request or simply something you want to let me know feel free to mail me at <a href="mailto:flattr@allesblog.de?subject=Flattr Wordpress Plugin" title="flattr@allesblog.de">flattr@allesblog.de</a>. Please note that I'm not an official part of the Flattr Dev-Team. So I can only answer questions regarding the flattr wordpress plugin alone.</p>
+                    <p><strong>Spread the word!</strong></p>
+                    <p>You can help getting Flattr out there!</p>
+                </td>
+            </tr>
+        </table>
+        <h2>Debug</h2>
+        <p>
+            Please provide the following information with your support request.
+        </p>
+        <textarea cols="80" rows="10"><?php
+
+            if (time() - $_SESSION['debug_date']>60) {
+                $_SESSION['debug_date'] = time();
+                $_SESSION['debug'] = "";
+                if (function_exists('apache_get_version')) {
+                    $_SESSION['debug'] .= "HTTPSERVER: ".apache_get_version() ."\n";
+                } elseif (function_exists('iis_start_server')) {
+                    $_SESSION['debug'] .= "IIS Server\n";
+                } else {
+                    $_SESSION['debug'] .= "non-Apache web Server\n";
+                }
+                if (function_exists('domxml_version')) {
+                    $_SESSION['debug'] .=  "XML Version: ".domxml_version()." (PHP4!)\n";
+                }
+                if (defined('LIBXML_VERSION')) {
+                    $_SESSION['debug'] .= "LIBXML_VERSION: ". LIBXML_VERSION ."\n";
+                } else {
+                    $modules = get_loaded_extensions();
+                    foreach ($modules as $module) {
+                        $_SESSION['debug'] .=  trim("$module ". phpversion($module)).", ";
+                    }
+                }
+                if (function_exists('curl_init')) {
+                    $v = curl_version();
+                    $_SESSION['debug'] .=  "cURL extension installed. ".$v['version']."\n";
+                } else {
+                    $_SESSION['debug'] .=  "no cURL extension found.\n";
+                }
+            }
+            echo htmlentities($_SESSION['debug']);
+
+        ?></textarea>
+    </div>
+    <p class="submit">
+        <input type="submit" class="button-primary" value="Save Changes" />
+        <input type="reset" class="button" value="Reset" />
+    </p>
+       		</form>
+</div>
+</div>
 
-			<p class="submit">
-				<input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
-			</p>
-		</form>
-	</div>
+        </div><script type="text/javascript" src="<?php echo FLATTRSS_PLUGIN_PATH . '/tabber.js'; ?>"></script>
\ No newline at end of file
diff --git a/wp-content/plugins/flattr/settings.php b/wp-content/plugins/flattr/settings.php
index 247dd457c3493730366f5ca9825cb1d34cb27fa7..85985b2dc97787b0a83a6cae477cc62a5f6d9bba 100644
--- a/wp-content/plugins/flattr/settings.php
+++ b/wp-content/plugins/flattr/settings.php
@@ -10,7 +10,12 @@ class Flattr_Settings
 
     public function init_ui()
     {
-        add_options_page('Flattr Setup', 'Flattr', 'manage_options', __FILE__, array($this, 'render'));
+        $menutitle = __('Flattr', 'flattr');
+	add_menu_page('Flattr',  $menutitle, 1, 'flattr/settings.php', '', get_bloginfo('wpurl') . '/wp-content/plugins/flattr'.'/img/flattr-icon_new.png');
+        
+        add_submenu_page( 'flattr/settings.php', __('Flattr'), __('Flattr'), 'manage_options', 'flattr/settings.php', array($this, 'render'));
+
+
     }
 
     public function register_settings()
@@ -24,6 +29,16 @@ class Flattr_Settings
         register_setting('flattr-settings-group', 'flattr_hide',        array($this, 'sanitize_checkbox'));
         register_setting('flattr-settings-group', 'flattr_top',         array($this, 'sanitize_checkbox'));
         register_setting('flattr-settings-group', 'flattr_override_sharethis', array($this, 'sanitize_checkbox'));
+        register_setting('flattr-settings-group', 'flattrss_api_key');
+        register_setting('flattr-settings-group', 'flattrss_api_secret');
+        register_setting('flattr-settings-group', 'flattrss_autodonate');
+        register_setting('flattr-settings-group', 'flattrss_clicktrack_enabled');
+        register_setting('flattr-settings-group', 'flattrss_error_reporting');
+        register_setting('flattr-settings-group', 'flattrss_custom_image_url');
+        register_setting('flattr-settings-group', 'flattrss_autosubmit');
+        register_setting('flattr-settings-group', 'flattr_post_types');
+        register_setting('flattr-settings-group', 'flattrss_api_oauth_token_secret');
+        register_setting('flattr-settings-group', 'flattrss_api_oauth_token');
     }
 
     public function render()
diff --git a/wp-content/plugins/flattr/tabber.css b/wp-content/plugins/flattr/tabber.css
new file mode 100644
index 0000000000000000000000000000000000000000..5477ab8ae3e8fdf5762fa536bf95b9eae2ba1f2d
--- /dev/null
+++ b/wp-content/plugins/flattr/tabber.css
@@ -0,0 +1,113 @@
+/* $Id: example.css,v 1.5 2006/03/27 02:44:36 pat Exp $ */
+
+/*--------------------------------------------------
+  REQUIRED to hide the non-active tab content.
+  But do not hide them in the print stylesheet!
+  --------------------------------------------------*/
+.tabberlive .tabbertabhide {
+ display:none;
+}
+
+/*--------------------------------------------------
+  .tabber = before the tabber interface is set up
+  .tabberlive = after the tabber interface is set up
+  --------------------------------------------------*/
+.tabber {
+    display:none;
+}
+
+.tabbertab a, .tabbertab a:hover, .tabbertab a:visited {
+    color: #508010;
+}
+.tabberlive {
+ margin-top:2em;
+ 
+}
+
+/*--------------------------------------------------
+  ul.tabbernav = the tab navigation list
+  li.tabberactive = the active tab
+  --------------------------------------------------*/
+ul.tabbernav
+{
+ padding: 3px 0;
+ padding-bottom: 10px;
+ border-bottom: 1px solid #000;
+ font: bold 12px Verdana, sans-serif;
+}
+
+ul.tabbernav li
+{
+ list-style: none;
+ margin: 0px;
+ display: inline;
+ text-shadow:#666666 0 1px 1px;
+ display: inline-block;
+ padding: 0px;
+}
+
+ul.tabbernav li a
+{
+ padding: 12px;
+ margin-left: 0px;
+ border-bottom: none;
+ background-color: #78A931;
+ background-image: url(https://flattr.com/_img/fluff/bg-boxlinks-green.png);
+ color: #fff;
+ border-left: 1px solid #7a3;
+ text-decoration: none;
+}
+
+ul.tabbernav li a:link { color: #fff; }
+ul.tabbernav li a:visited { color: #fff; }
+
+ul.tabbernav li a:hover
+{
+ color: #fff;
+ background-color: #508010;
+ background-image: none;
+ border-color: #227;
+}
+
+ul.tabbernav li.tabberactive a
+{
+ background-color: #F98E29;
+ background-image: none;
+ color: #fff;
+}
+
+ul.tabbernav li.tabberactive a:hover
+{
+ color: #fff;
+ background-color:#Fa4;
+}
+
+/*--------------------------------------------------
+  .tabbertab = the tab content
+  Add style only after the tabber interface is set up (.tabberlive)
+  --------------------------------------------------*/
+.tabberlive .tabbertab {
+ padding:5px;
+ border-top:1px solid #aaa;
+ border-top:0;
+
+ /* If you don't want the tab size changing whenever a tab is changed
+    you can set a fixed height */
+
+ /* height:200px; */
+
+ /* If you set a fix height set overflow to auto and you will get a
+    scrollbar when necessary */
+
+ /* overflow:auto; */
+}
+
+/* Example of using an ID to set different styles for the tabs on the page */
+.tabberlive#tab1 {
+}
+.tabberlive#tab2 {
+}
+.tabberlive#tab2 .tabbertab {
+ height:200px;
+ overflow:auto;
+}
\ No newline at end of file
diff --git a/wp-content/plugins/flattr/tabber.js b/wp-content/plugins/flattr/tabber.js
new file mode 100644
index 0000000000000000000000000000000000000000..34dd2e8daff071064123b012e5d07d13fa8f9152
--- /dev/null
+++ b/wp-content/plugins/flattr/tabber.js
@@ -0,0 +1,40 @@
+/* Copyright (c) 2006 Patrick Fitzgerald */
+
+function tabberObj(argsObj)
+{var arg;this.div=null;this.classMain="tabber";this.classMainLive="tabberlive";this.classTab="tabbertab";this.classTabDefault="tabbertabdefault";this.classNav="tabbernav";this.classTabHide="tabbertabhide";this.classNavActive="tabberactive";this.titleElements=['h2','h3','h4','h5','h6'];this.titleElementsStripHTML=true;this.removeTitle=true;this.addLinkId=false;this.linkIdFormat='<tabberid>nav<tabnumberone>';for(arg in argsObj){this[arg]=argsObj[arg];}
+this.REclassMain=new RegExp('\\b'+this.classMain+'\\b','gi');this.REclassMainLive=new RegExp('\\b'+this.classMainLive+'\\b','gi');this.REclassTab=new RegExp('\\b'+this.classTab+'\\b','gi');this.REclassTabDefault=new RegExp('\\b'+this.classTabDefault+'\\b','gi');this.REclassTabHide=new RegExp('\\b'+this.classTabHide+'\\b','gi');this.tabs=new Array();if(this.div){this.init(this.div);this.div=null;}}
+tabberObj.prototype.init=function(e)
+{var
+childNodes,i,i2,t,defaultTab=0,DOM_ul,DOM_li,DOM_a,aId,headingElement;if(!document.getElementsByTagName){return false;}
+if(e.id){this.id=e.id;}
+this.tabs.length=0;childNodes=e.childNodes;for(i=0;i<childNodes.length;i++){if(childNodes[i].className&&childNodes[i].className.match(this.REclassTab)){t=new Object();t.div=childNodes[i];this.tabs[this.tabs.length]=t;if(childNodes[i].className.match(this.REclassTabDefault)){defaultTab=this.tabs.length-1;}}}
+DOM_ul=document.createElement("ul");DOM_ul.className=this.classNav;for(i=0;i<this.tabs.length;i++){t=this.tabs[i];t.headingText=t.div.title;if(this.removeTitle){t.div.title='';}
+if(!t.headingText){for(i2=0;i2<this.titleElements.length;i2++){headingElement=t.div.getElementsByTagName(this.titleElements[i2])[0];if(headingElement){t.headingText=headingElement.innerHTML;if(this.titleElementsStripHTML){t.headingText.replace(/<br>/gi," ");t.headingText=t.headingText.replace(/<[^>]+>/g,"");}
+break;}}}
+if(!t.headingText){t.headingText=i+1;}
+DOM_li=document.createElement("li");t.li=DOM_li;DOM_a=document.createElement("a");DOM_a.appendChild(document.createTextNode(t.headingText));DOM_a.href="javascript:void(null);";DOM_a.title=t.headingText;DOM_a.onclick=this.navClick;DOM_a.tabber=this;DOM_a.tabberIndex=i;if(this.addLinkId&&this.linkIdFormat){aId=this.linkIdFormat;aId=aId.replace(/<tabberid>/gi,this.id);aId=aId.replace(/<tabnumberzero>/gi,i);aId=aId.replace(/<tabnumberone>/gi,i+1);aId=aId.replace(/<tabtitle>/gi,t.headingText.replace(/[^a-zA-Z0-9\-]/gi,''));DOM_a.id=aId;}
+DOM_li.appendChild(DOM_a);DOM_ul.appendChild(DOM_li);}
+e.insertBefore(DOM_ul,e.firstChild);e.className=e.className.replace(this.REclassMain,this.classMainLive);this.tabShow(defaultTab);if(typeof this.onLoad=='function'){this.onLoad({tabber:this});}
+return this;};tabberObj.prototype.navClick=function(event)
+{var
+rVal,a,self,tabberIndex,onClickArgs;a=this;if(!a.tabber){return false;}
+self=a.tabber;tabberIndex=a.tabberIndex;a.blur();if(typeof self.onClick=='function'){onClickArgs={'tabber':self,'index':tabberIndex,'event':event};if(!event){onClickArgs.event=window.event;}
+rVal=self.onClick(onClickArgs);if(rVal===false){return false;}}
+self.tabShow(tabberIndex);return false;};tabberObj.prototype.tabHideAll=function()
+{var i;for(i=0;i<this.tabs.length;i++){this.tabHide(i);}};tabberObj.prototype.tabHide=function(tabberIndex)
+{var div;if(!this.tabs[tabberIndex]){return false;}
+div=this.tabs[tabberIndex].div;if(!div.className.match(this.REclassTabHide)){div.className+=' '+this.classTabHide;}
+this.navClearActive(tabberIndex);return this;};tabberObj.prototype.tabShow=function(tabberIndex)
+{var div;if(!this.tabs[tabberIndex]){return false;}
+this.tabHideAll();div=this.tabs[tabberIndex].div;div.className=div.className.replace(this.REclassTabHide,'');this.navSetActive(tabberIndex);if(typeof this.onTabDisplay=='function'){this.onTabDisplay({'tabber':this,'index':tabberIndex});}
+return this;};tabberObj.prototype.navSetActive=function(tabberIndex)
+{this.tabs[tabberIndex].li.className=this.classNavActive;return this;};tabberObj.prototype.navClearActive=function(tabberIndex)
+{this.tabs[tabberIndex].li.className='';return this;};function tabberAutomatic(tabberArgs)
+{var
+tempObj,divs,i;if(!tabberArgs){tabberArgs={};}
+tempObj=new tabberObj(tabberArgs);divs=document.getElementsByTagName("div");for(i=0;i<divs.length;i++){if(divs[i].className&&divs[i].className.match(tempObj.REclassMain)){tabberArgs.div=divs[i];divs[i].tabber=new tabberObj(tabberArgs);}}
+return this;}
+function tabberAutomaticOnLoad(tabberArgs)
+{var oldOnLoad;if(!tabberArgs){tabberArgs={};}
+oldOnLoad=window.onload;if(typeof window.onload!='function'){window.onload=function(){tabberAutomatic(tabberArgs);};}else{window.onload=function(){oldOnLoad();tabberAutomatic(tabberArgs);};}}
+if(typeof tabberOptions=='undefined'){tabberAutomaticOnLoad();}else{if(!tabberOptions['manualStartup']){tabberAutomaticOnLoad(tabberOptions);}}
\ No newline at end of file