diff --git a/classes/pluginhost.php b/classes/pluginhost.php
index d97dfa66660a4f36568885d1295088e179b1d58d..e43b39f9dd404fd8ea0443225a4866dc45e66927 100644
--- a/classes/pluginhost.php
+++ b/classes/pluginhost.php
@@ -1,10 +1,17 @@
 <?php
+/* create table ttrss_plugin_storage
+	(id serial not null primary key, name varchar(100) not null,
+		owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE,
+		content text not null) - not in schema yet
+*/
 class PluginHost {
 	private $link;
 	private $hooks = array();
 	private $plugins = array();
 	private $handlers = array();
 	private $commands = array();
+	private $storage = array();
+	private $owner_uid;
 
 	const HOOK_ARTICLE_BUTTON = 1;
 	const HOOK_ARTICLE_FILTER = 2;
@@ -21,6 +28,10 @@ class PluginHost {
 
 	function __construct($link) {
 		$this->link = $link;
+
+		$this->storage = $_SESSION["plugin_storage"];
+
+		if (!$this->storage) $this->storage = array();
 	}
 
 	private function register_plugin($name, $plugin) {
@@ -75,9 +86,11 @@ class PluginHost {
 		$this->load(join(",", $plugins), $kind);
 	}
 
-	function load($classlist, $kind) {
+	function load($classlist, $kind, $owner_uid = false) {
 		$plugins = explode(",", $classlist);
 
+		$this->owner_uid = (int) $owner_uid;
+
 		foreach ($plugins as $class) {
 			$class = trim($class);
 			$class_file = strtolower(basename($class));
@@ -194,5 +207,76 @@ class PluginHost {
 		}
 	}
 
+	function load_data($force = false) {
+		if ($this->owner_uid && (!$_SESSION["plugin_storage"] || $force))  {
+			$plugin = db_escape_string($plugin);
+
+			$result = db_query($this->link, "SELECT name, content FROM ttrss_plugin_storage
+				WHERE owner_uid = '".$this->owner_uid."'");
+
+			while ($line = db_fetch_assoc($result)) {
+				$this->storage[$line["name"]] = unserialize($line["content"]);
+			}
+
+			$_SESSION["plugin_storage"] = $this->storage;
+		}
+	}
+
+	private function save_data($plugin) {
+		if ($this->owner_uid) {
+			$plugin = db_escape_string($plugin);
+
+			db_query($this->link, "BEGIN");
+
+			$result = db_query($this->link,"SELECT id FROM ttrss_plugin_storage WHERE
+				owner_uid= '".$this->owner_uid."' AND name = '$plugin'");
+
+			if (!isset($this->storage[$plugin]))
+				$this->storage[$plugin] = array();
+
+			$content = db_escape_string(serialize($this->storage[$plugin]));
+
+			if (db_num_rows($result) != 0) {
+				db_query($this->link, "UPDATE ttrss_plugin_storage SET content = '$content'
+					WHERE owner_uid= '".$this->owner_uid."' AND name = '$plugin'");
+
+			} else {
+				db_query($this->link, "INSERT INTO ttrss_plugin_storage
+					(name,owner_uid,content) VALUES
+					('$plugin','".$this->owner_uid."','$content')");
+			}
+
+			db_query($this->link, "COMMIT");
+		}
+	}
+
+	function set($sender, $name, $value, $sync = true) {
+		$idx = get_class($sender);
+
+		if (!isset($this->storage[$idx]))
+			$this->storage[$idx] = array();
+
+		$this->storage[$idx][$name] = $value;
+
+		$_SESSION["plugin_storage"] = $this->storage;
+
+		if ($sync) $this->save_data(get_class($sender));
+	}
+
+	function get($sender, $name, $default_value) {
+		$idx = get_class($sender);
+
+		if (isset($this->storage[$idx][$name])) {
+			return $this->storage[$idx][$name];
+		} else {
+			return $default_value;
+		}
+	}
+
+	function get_all($sender) {
+		$idx = get_class($sender);
+
+		return $this->storage[$idx];
+	}
 }
 ?>
diff --git a/include/functions.php b/include/functions.php
index f6ef7c2b370ca02ac9cf302f9824d968c36d305c..b382b4069fb3fb4ceca54122be8c094e28e0db44 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -727,7 +727,8 @@
 			$plugins = get_pref($link, "_ENABLED_PLUGINS", $owner_uid);
 
 			global $pluginhost;
-			$pluginhost->load($plugins, $pluginhost::KIND_USER);
+			$pluginhost->load($plugins, $pluginhost::KIND_USER, $owner_uid);
+			$pluginhost->load_data();
 		}
 	}
 
diff --git a/plugins/example/example.php b/plugins/example/example.php
index eef604b4f599631a3e057a3d9e62be02c642fecc..f3788ae8c6fafec02be2f208d8751f5b349457f0 100644
--- a/plugins/example/example.php
+++ b/plugins/example/example.php
@@ -23,7 +23,9 @@ class Example extends Plugin {
 	function save() {
 		$example_value = db_escape_string($_POST["example_value"]);
 
-		echo "Value set to $example_value (not really)";
+		$this->host->set($this, "example", $example_value);
+
+		echo "Value set to $example_value";
 	}
 
 	function get_prefs_js() {
@@ -35,6 +37,13 @@ class Example extends Plugin {
 
 		print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"".__("Example Pane")."\">";
 
+		print "<br/>";
+
+//		print_r($this->host->set($this, "example", rand(0,100)));
+//		print_r($this->host->get_all($this));
+
+		$value = $this->host->get($this, "example");
+
 		print "<form dojoType=\"dijit.form.Form\">";
 
 		print "<script type=\"dojo/method\" event=\"onSubmit\" args=\"evt\">
@@ -47,7 +56,7 @@ class Example extends Plugin {
 						notify_info(transport.responseText);
 					}
 				});
-				this.reset();
+				//this.reset();
 			}
 			</script>";
 
@@ -58,7 +67,7 @@ class Example extends Plugin {
 		print "<table width=\"100%\" class=\"prefPrefsList\">";
 
 			print "<tr><td width=\"40%\">".__("Sample value")."</td>";
-			print "<td class=\"prefValue\"><input dojoType=\"dijit.form.ValidationTextBox\" required=\"1\" name=\"example_value\"></td></tr>";
+			print "<td class=\"prefValue\"><input dojoType=\"dijit.form.ValidationTextBox\" required=\"1\" name=\"example_value\" value=\"$value\"></td></tr>";
 
 			print "</table>";