Index: src/storage.js
===================================================================
--- src/storage.js	(revision 7627)
+++ src/storage.js	(working copy)
@@ -332,8 +332,9 @@
 
 		// FIXME: This should REALLY not be in here, but it fixes a tricky
 		// Flash timing bug
-		if(this.currentProvider.getType() == "dojo.storage.browser.FlashStorageProvider"
-			&& dojo.flash.ready == false){
+		if( 
+      (this.currentProvider.getType() == "dojo.storage.browser.FlashStorageProvider"
+			  && dojo.flash.ready == false) || dojo.storage.initialized === false){
 			return false;
 		}else{
 			return this._initialized;
Index: src/storage/browser.js
===================================================================
--- src/storage/browser.js	(revision 7627)
+++ src/storage/browser.js	(working copy)
@@ -993,11 +993,228 @@
 	}
 });
 
+dojo.storage.browser.IEStorageProvider = function(){
+  // summary: Storage provider that uses native features of Internet Explorer
+  // to achieve permanent storage, with a max of 64KB per page
+	// description:
+  //   MSDN documentation on the underlying technology can be found at
+  //   http://msdn.microsoft.com/workshop/author/persistence/overview.asp
+  //   You can disable this storage provider with the following djConfig 
+  //     var djConfig = { disableIEStorage: true};
+	// Authors of this storage provider-
+	//  Shane O'Sullivan, shaneosullivan1@gmail.com	
+}
+
+dojo.inherits(dojo.storage.browser.IEStorageProvider, dojo.storage);
+
+// instance methods and properties
+dojo.lang.extend(dojo.storage.browser.IEStorageProvider, {
+	namespace: "default",
+                     
+	initialized: false,
+  //the CSS class name to apply to the DOM node used to save the data
+  _cssClassName: "IE_user_data_",
+  
+  //ID of the attribute to fetch that stores a list of all keys for this page
+  //This is necessary as it is not possible to iterate through available keys
+  _keysId: "__ie_storage_keys__",
+	
+	_statusHandler: null,
+  
+  //The list of keys for this page
+  _keys:[],
+  
+  //The node used to store the data. Defaults to the <body> node
+  _storeNode: null,
+  _loaded: false,
+  
+	initialize: function(){
+		if(djConfig["disableIEStorage"] == true){
+			return;
+		}
+    dojo.require("dojo.html.style");
+    
+    // Add a new Css class to the page. Applying this class to a node gives that node
+    // the ability to save it's state
+    dojo.html.insertCssText("."+this._cssClassName+" {behavior:url(#default#userdata);}");
+    
+    var myself = this;
+    function init(){
+      // The <body> tag is used to store data. A new Css class is applied to it
+      // which gives it the ability to store data.  It is not possible to 
+      // dynamically create a new node and use it to store data, as IE doesn't
+      // add the new behaviours to it unless it was loaded with the initial page.
+      // For this reason, we need to pick a node that will always be on the page.
+      // The <body> tag is the only such node
+      if(!myself._storeNode){
+        myself._storeNode = dojo.body();
+      }
+      
+      dojo.html.addClass(myself._storeNode,myself._cssClassName);
+      
+      // indicate that this storage provider is now loaded
+      myself.initialized = true;
+      dojo.storage.manager.loaded();	
+    }
+    // If the body tag has already been created, initialise it. Otherwise wait 
+    // for the page to load
+    if(dojo.body()){
+      init();
+    }else{
+      dojo.addOnLoad(init);
+    }
+	},
+	
+	isAvailable: function(){
+    return dojo.render.html.ie ? true : false;
+	},
+
+	put: function(key, value, resultsHandler){
+		if(this.isValidKey(key) == false){
+			dojo.raise("Invalid key given: " + key);
+		}
+    // get our full key name, which is "__" + key
+		key = this.getFullKey(key);	
+    
+		this._statusHandler = resultsHandler;
+		
+		// serialize the value;
+		// handle strings differently so they have better performance
+		if(dojo.lang.isString(value)){
+			value = "string:" + value;
+		}else{
+			value = dojo.json.serialize(value);
+		}
+    
+		// try to store the value	
+		try{
+      this._storeNode.setAttribute(key, value);
+      
+      // Check the list of keys to see if this is a new key. If it is new,
+      // then replace the list of keys in the store.
+      var found=false;
+      for(var i=0; i< this._keys.length; i++){
+        if(this._keys[i] == key){
+          found=true;
+          break;
+        }
+      }
+      // If it's a new key, add it to the list of keys and put it in the store
+      if(!found){
+        this._keys[this._keys.length]=key;
+        this._storeNode.setAttribute(this._keysId,dojo.json.serialize(this._keys));
+      }
+      
+      // Save the store back to the XML store
+			this._storeNode.save("oXMLBranch");
+		}catch(e){
+			// indicate we failed
+			if(this._statusHandler){
+        this._statusHandler.call(null, dojo.storage.FAILED, key, e.toString());
+      }else{
+        dojo.raise("Error in IEStorageProvider.put",e);
+      }
+		}
+	},
+  
+  // Do the initial load
+  _doLoad: function(){
+    if(!this._loaded && this.initialized){
+      this._storeNode.load("oXMLBranch");
+      this._loaded = true;
+      var keys = this._storeNode.getAttribute(this._keysId);
+      if(keys){
+        this._keys = dojo.json.evalJson(keys);
+      }
+    }
+  },
+
+	get: function(key){
+		key = this.getFullKey(key);
+    this._doLoad();
+    
+		var result = this._storeNode.getAttribute(key);
+		// destringify the content back into a 
+		// real JavaScript object;
+		// handle strings differently so they have better performance
+		if(!dojo.lang.isUndefined(result) && result != null 
+			 && /^string:/.test(result)){
+			result = result.substring("string:".length);
+		}else{
+			result = dojo.json.evalJson(result);
+		}
+		
+		return result;
+	} ,
+
+	getKeys: function(){
+    this._doLoad();
+        
+		var keysArray = new Array();
+    var keys = this._keys;
+    var skip = 2;
+		for(var i=0; i<keys.length;i++){      
+      keysArray[keysArray.length] = keys[i].substring(skip);
+		}
+		return keysArray;
+	} ,
+
+	clear: function(){
+    this._doLoad();
+    
+    for(var i=0; i<this._keys.length; i++){
+      this._storeNode.removeAttribute(this.getFullKey(this._keys[i]));
+      
+    }
+    //remove the list of keys from the store
+    this._storeNode.removeAttribute(this._keysId);
+    this._keys = [];
+    // Save the state of the node back to the XML store
+    this._storeNode.save("oXMLBranch");
+	},
+	
+	remove: function(key){
+    this._doLoad();
+    key=this.getFullKey(key);
+    for(var i=0; i< this._keys.length; i++){
+      if(key == this._keys[i]){
+        this._storeNode.removeAttribute(key);
+        this._keys.splice(i,1);
+        this._storeNode.setAttribute(this._keysId,dojo.json.serialize(this._keys));
+        this._storeNode.save("oXMLBranch");
+        break;
+      }
+    }
+	},
+	
+	isPermanent: function(){
+		return true;
+	},
+
+	getMaximumSize: function(){
+    // IEStorageProvider has a max of 64KB per page
+		return 64;
+	},
+	
+	getType: function(){
+		return "dojo.storage.browser.IEStorageProvider";
+	},
+	
+	getFullKey: function(key){
+		if(this.isValidKey(key) == false){
+			dojo.raise("Invalid key given: " + key);
+		}
+    return "__"+key;
+	}
+});
+
 // register the existence of our storage providers
 dojo.storage.manager.register("dojo.storage.browser.FileStorageProvider",
 								new dojo.storage.browser.FileStorageProvider());
 dojo.storage.manager.register("dojo.storage.browser.WhatWGStorageProvider",
 								new dojo.storage.browser.WhatWGStorageProvider());
+dojo.storage.manager.register("dojo.storage.browser.IEStorageProvider",
+								new dojo.storage.browser.IEStorageProvider());
 dojo.storage.manager.register("dojo.storage.browser.FlashStorageProvider",
 								new dojo.storage.browser.FlashStorageProvider());
 
Index: tests/storage/test_IE_Storage.html
===================================================================
--- tests/storage/test_IE_Storage.html	(revision 0)
+++ tests/storage/test_IE_Storage.html	(revision 0)
@@ -0,0 +1,87 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    <link type="text/css" rel="stylesheet" href="tree_default.css" />
+    <script type="text/javascript">
+      djConfig={
+        isDebug:true,
+        parseWidgets:false,
+        forceStorageProvider: "dojo.storage.browser.IEStorageProvider"
+      };
+    
+    </script>
+    <script src="../../dojo.js" type="text/javascript">// script</script>
+    <script src="../../src/storage.js" type="text/javascript">// script</script>
+    <script src="../../src/storage/browser.js" type="text/javascript">// script</script>
+        
+    <script type="text/javascript">
+      dojo.require("dojo.debug.console");
+      dojo.require("dojo.json");
+      dojo.require("dojo.html.style");
+      dojo.require("dojo.storage.*");
+      if(!dojo.render.html.ie){
+        alert("This page will only function on Internet Explorer");
+      }
+     
+      function saveInput(){
+        try{
+          var value = dojo.byId("inputText").value;
+          if(value){dojo.storage.put(dojo.byId("keyText").value,value);}
+        }catch(e){
+          dojo.raise("Caught save exception ",e);
+        }
+      }
+      function clearData(){
+        dojo.storage.clear();
+      }
+      function removeKey(){
+        dojo.storage.remove(dojo.byId("keyText").value);
+      }
+      function updateOutput(){
+        var string = "The following key.value pairs are available<br/>";
+        var arr = [];
+        var keys = dojo.storage.getKeys();
+        
+        var value;
+        for(var i = 0; i< keys.length; i++){
+          value = dojo.storage.get(keys[i]);
+          arr[arr.length] = "("+keys[i]+" / " + value+")";
+        }
+        string += arr.join("<br/>");
+        dojo.byId("output").innerHTML = string;
+      }
+      
+      if(dojo.storage.manager.isInitialized()){
+        dojo.debug("storage manager is initialized straight away");
+        updateOutput();
+      }else if(dojo.storage.manager.addOnLoad){
+        dojo.storage.manager.addOnLoad(updateOutput);
+      }else{
+        dojo.event.connect(dojo.storage.manager,"loaded",updateOutput);
+      }
+
+    </script>
+    
+    <title>Testing the IE Storage Facility</title>
+  </head>
+  <body class="toc">
+    <h2>
+      Testing the IE Storage Facility
+    </h2>
+    
+    <button onclick="saveInput();updateOutput();return false;">Save Value</button>
+    <button onclick="clearData();updateOutput();return false;">Clear Data</button>
+    <button onclick="removeKey();updateOutput();return false;">Remove Key</button>
+   <br/>
+    Text To Load/Save<input type="text" id="inputText"/>
+    <br/>
+    Key to use <input type="text" id="keyText" value="savedData"/>
+    
+    <div id="output">
+    
+    </div>
+  </body>
+</html>
+
