diff --git a/docs/NEWS b/docs/NEWS
index 705971c5..ea5040a8 100644
--- a/docs/NEWS
+++ b/docs/NEWS
@@ -3,6 +3,8 @@
 Version 1.5 ()
 ------------------------------------------------------------------------
 
+    * Added improved Blogger.com importer using the API, thanks to jaa
+    
     * Change password hashing from plain md5 to salted SHA1. Logins
       should continue to work and are migrated to SHA1 keys upon
       first login. MD5-logins will only work successfully once. This
diff --git a/include/admin/importers/blogger.inc.php b/include/admin/importers/blogger.inc.php
index 49cee036..ebf5b296 100644
--- a/include/admin/importers/blogger.inc.php
+++ b/include/admin/importers/blogger.inc.php
@@ -1,257 +1,280 @@
-<?php # $Id$
-# Copyright (c) 2003-2005, Jannis Hermanns (on behalf the Serendipity Developer Team)
-# All rights reserved.  See LICENSE file for licensing details
-
-class Serendipity_Import_Blogger extends Serendipity_Import {
-    var $info        = array('software' => 'Blogger.com');
-    var $data        = array();
-    var $inputFields = array();
-
-    function Serendipity_Import_Blogger($data) {
-        global $serendipity;
-
-        $this->data = $data;
-        $this->inputFields = array(array('text'    => 'Path to your Blogger export file',
-                                         'type'    => 'input',
-                                         'name'    => 'bloggerfile',
-                                         'value'   => $serendipity['serendipityPath']),
-
-                                   array('text'    => 'New author default password (used for non-existing authors on the serendipity backend, as author passwords from Blogger are not migrated)',
-                                         'type'    => 'input',
-                                         'name'    => 'defaultpass',
-                                         'value'   => ''),
-
-                                   array('text'    => CHARSET,
-                                         'type'    => 'list',
-                                         'name'    => 'charset',
-                                         'value'   => 'UTF-8',
-                                         'default' => $this->getCharsets()),
-
-                                    array('text'   => RSS_IMPORT_BODYONLY,
-                                         'type'    => 'bool',
-                                         'name'    => 'bodyonly',
-                                         'value'   => 'false'));
-    }
-
-    function validateData() {
-        return sizeof($this->data);
-    }
-
-    function getInputFields() {
-        return $this->inputFields;
-    }
-
-    function getImportNotes() {
-        $out = '
-<style type="text/css">
-<!--
-.style1 {
-    font-size: large;
-    font-weight: bold;
-    font-family: Arial, Helvetica, sans-serif;
-}
-.style2 {
-    font-family: Arial, Helvetica, sans-serif;
-    font-size: x-small;
-}
--->
-</style>
-
-<p class="style1">BLOGGER.COM to SERENDIPITY IMPORT</p>
-<p class="style2">Version 0.1,( 29/10/2005 )</p>
-<p class="style2"> <br />
-  1. First go to Blogger.com, login.</p>
-<p class="style2">2. Go to the templates section. Set the following as your template. You should backup the current template if you want to reset it back after this operation. Click &quot;Save template changes&quot; button to save this new template.</p>
-<p class="style2">
-  <label>
-  <textarea name="textarea" cols="60" rows="20"><Blogger>
-STARTPOST
-
-TITLE: <PostSubject><$BlogItemSubject$></PostSubject>
-AUTHOR: <$BlogItemAuthor$>
-DATE: <$BlogItemDateTime$>
------
-BODY:
-<$BlogItemBody$>
------
-<BlogItemCommentsEnabled>
-<BlogItemComments>
-COMMENT:
-AUTHOR: <$BlogCommentAuthor$>
-DATE: <$BlogCommentDateTime$>
-BODY: <$BlogCommentBody$>
------
-</BlogItemComments>
-</BlogItemCommentsEnabled>
-ENDPOST
-</Blogger>
-  </textarea>
-  </label>
-</p>
-<p class="style2">3. Go to the &quot;Settings&quot; section of blogger. </p>
-<p class="style2">4. Click the &quot;Formatting&quot; link. From the formatting options, find the &quot;Timestamp Format&quot; option and set it to the top most option. i.e the one with the date and time showing. Find the &quot;Show&quot; option, and set it to 999. Save changes</p>
-<p class="style2">5. Now click the &quot;Comments&quot; link. Find the &quot;Comments Timestamp Format&quot; option and set it to the 2nd option from the list. i.e the one with the date and time showing. Save changes. </p>
-<p class="style2">6. On the server with your Serendipity installation, create a directory called &quot;blogger&quot;. </p>
-<p class="style2">7. Next, back on Blogger.com, go to the &quot;Publishing&quot; section. Set it to publish to an FTP server. Enter the details of the server with your Serendipity installation. Set the FTP path as the path to the &quot;blogger&quot; directory you created in the previous step. </p>
-<p class="style2">8. Go back to Blogger.com and find &quot;Publish Entire Blog&quot; under &quot;Posting&quot; -&gt; &quot;Status&quot;. Click the Publish entire blog button to let blogger publish the blog to your ftp server.</p>
-<p class="style2">9. Now in the box below type in the path to the &quot;index.html&quot; file blogger created under your &quot;blogger&quot; directory.  File path should then look something like &quot;/httpdocs/blogger/index.html&quot;.</p>
-<p class="style2">10. This script will create the users as from the blogger blog being imported. However if a user already exists, then that user will be used instead of creating a new user with similar name. For the new users that this script will create, you need to provide a default password. Type it in the box below.</p>
-<p class="style2">11. Click &quot;Submit&quot;. Your posts and comments should be imported to serendipity!</p>
-<p class="style2"> If you have questions or problems, feel free to drop me a mail at jaa at technova dot com dot mv.<br />
-  <br />
-Jaa<br />
-http://jaa.technova.com.mv</p>';
-        return $out;
-    }
-
-    function import() {
-        global $serendipity;
-
-        if (empty($this->data['bloggerfile']) || !file_exists($this->data['bloggerfile'])) {
-            echo "Path to blogger file empty or path to file wrong! Go back and correct.";
-            return false;
-        }
-
-        # get default pass from request
-        $defaultpass = $this->data['defaultpass'];
-
-        # get blogger uploaded file path from request and load file
-        $html = file_get_contents($this->data['bloggerfile']);
-
-        # find posts using pattern matching
-        preg_match_all("/STARTPOST(.*)ENDPOST/sU", $html, $posts);
-
-        # iterate through all posts
-        foreach($posts[1] as $post) {
-
-            # locate the post title
-            if (preg_match("/TITLE:(.*)/", $post, $title)) {
-                $title = trim($title[1]);
-                echo "<b>" . htmlspecialchars($title) . "</b><br />";
-            } else {
-                $title = "";
-                echo "<b>Empty title</b><br />";
-            }
-
-            # locate the post author
-            if (preg_match("/AUTHOR:(.*)/", $post, $author)) {
-                $author = trim($author[1]);
-                echo "<em>" . htmlspecialchars($author[1]) . "</em><br />";
-            } else {
-                $author = "";
-                echo "<em>Unknown author</em><br />";
-            }
-
-            # locate the post date
-            if (preg_match("/DATE:(.*)/", $post, $date)) {
-                $date = strtotime(trim($date[1]));
-                echo "Posted on " . htmlspecialchars($date[1]) . ".<br />";
-            } else {
-                $date = time();
-                echo "Unknown posting time.<br />";
-            }
-
-            # locate the post body
-            if (preg_match("/BODY:(.*)-----/sU", $post, $body)) {
-                $body = trim($body[1]);
-                echo strlen($body) . " Bytes of text.<br />";
-            } else {
-                $body = "";
-                echo "<strong>Empty Body!</strong><br />";
-            }
-
-            # find all comments for the post using pattern matching
-            if (preg_match_all( "/COMMENT:(.*)----/sU", $post, $commentlist)) {
-                echo count($commentlist[1]) . " comments found.<br />";
-            } else {
-                $commentlist = array();
-                echo "No comments found.<br />";
-            }
-
-            $result = serendipity_db_query("SELECT authorid FROM ". $serendipity['dbPrefix'] ."authors WHERE username = '". serendipity_db_escape_string($author) ."' LIMIT 1", true, 'assoc');
-            if (!is_array($result)) {
-                $data = array('right_publish' => 1,
-                              'realname'      => $author,
-                              'username'      => $author,
-                              'userlevel'     => 0,
-                              'password'      => md5($defaultpass)); // MD5 compatible
-                serendipity_db_insert('authors', $data);
-                $authorid = serendipity_db_insert_id('authors', 'authorid');
-            } else {
-                $authorid = $result['authorid'];
-            }
-
-
-            $entry = array('title'          => $title,
-                           'isdraft'        => 'false',
-                           'allow_comments' => 'true',
-                           'timestamp'      => $date,
-                           'body'           => $body,
-                           'extended'       => '',
-                           'author'            => $author,
-                           'authorid'       => $authorid
-                           );
-
-            echo "Entry insert...<br />";
-            if (!is_int($id = serendipity_updertEntry($entry))) {
-                echo "Inserting entry failed.<br />";
-                return $id;
-            } else {
-                echo "Entry $id inserted.<br />";
-            }
-
-            # iterate through all comments
-            $c = 0;
-            foreach($commentlist[1] as $comment) {
-                $c++;
-
-                # locate the author and author url
-                $curl    = '';
-                $cauthor = '';
-                $cdate   = time();
-                $cbody   = '';
-
-                if (preg_match("/AUTHOR:(.*)/", $comment, $cauthor) && preg_match("/href=\"(.*)\"/", $cauthor[1], $curl)) {
-                    $curl    = (isset($curl[1]) ? trim($curl[1]) : '');
-                    $cauthor = trim(strip_tags($cauthor[1]));
-                }
-
-                # locate the date
-                if (preg_match("/DATE:(.*)/", $comment, $cdate)) {
-                    $cdate = strtotime($cdate[1]);
-                }
-
-                # locate the comment body
-                if (preg_match("/BODY:(.*)/s", $comment, $cbody)) {
-                    $cbody = trim($cbody[1]);
-                }
-
-                $icomment = array('entry_id ' => $id,
-                                 'parent_id' => 0,
-                                 'timestamp' => $cdate,
-                                 'author'    => $cauthor,
-                                 'email'     => '',
-                                 'url'       => $curl,
-                                 'ip'        => '',
-                                 'status'    => 'approved',
-                                 'body'      => $cbody,
-                                 'subscribed'=> 'false',
-                                 'type'      => 'NORMAL');
-
-                serendipity_db_insert('comments', $icomment);
-            }
-
-            serendipity_db_query("UPDATE ". $serendipity['dbPrefix'] ."entries SET comments = ". $c ." WHERE id = ". $id);
-            echo "Comment count set to: ". $c ."<br />";
-        }
-
-        echo "Import finished.<br />";
-
-        return true;
-    }
-}
-
-return 'Serendipity_Import_Blogger';
-
-/* vim: set sts=4 ts=4 expandtab : */
+<?php # $Id$
+# Copyright (c) 2003-2005, Jannis Hermanns (on behalf the Serendipity Developer Team)
+# All rights reserved.  See LICENSE file for licensing details
+
+/****************************************************************
+ *  	Blogger Importer v0.2, by Jawish Hameed (jawish.org)  	*
+ ****************************************************************/
+
+require_once S9Y_PEAR_PATH . 'HTTP/Request.php';
+
+class Serendipity_Import_Blogger extends Serendipity_Import {
+    var $info        = array('software' => 'Blogger.com [using API]');
+    var $data        = array();
+    var $inputFields = array();
+    
+    
+    function Serendipity_Import_Blogger($data) {
+        global $serendipity;
+
+        $this->data = $data;
+        $this->inputFields = array(array('text'    => 'Category',
+                                         'type'    => 'list',
+                                         'name'    => 'bCategory',
+                                         'value'   => 0,
+                                         'default' => $this->_getCategoryList()),
+                                   
+                                   array('text'    => ACTIVATE_AUTODISCOVERY,
+                                         'type'    => 'bool',
+                                         'name'    => 'autodiscovery',
+                                         'default' => 'false'),
+                                   
+                                   array('text'    => CHARSET,
+                                         'type'    => 'list',
+                                         'name'    => 'bCharset',
+                                         'value'   => 'UTF-8',
+                                         'default' => $this->getCharsets())
+								);
+    }
+    
+	function getImportNotes(){
+		if (empty($_REQUEST['token'])) {
+			$msg = 'In order to import your blog on Blogger, Serendipity needs to be able to access it via Google\'s Blogger Data APIs.<br />';
+			$msg .= 'Login to your Google/Blogger account and then click the link below.<br /><br />';
+			$msg .= '<a href="https://www.google.com/accounts/AuthSubRequest?scope=http%3A%2F%2Fwww.blogger.com%2Ffeeds%2F&session=1&secure=0&next='. urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']) .'">Go to Google to grant access</a><br />';
+			return $msg;
+		} else {
+			return '';
+		}
+	}
+    
+    function validateData() {
+        return sizeof($this->data);
+    }
+	
+    function getInputFields() {
+    	// Make sure Google login has been completed
+    	if (!empty($_REQUEST['token'])) {
+    			
+			// Prepare session token request
+			$req = new HTTP_Request('https://www.google.com/accounts/AuthSubSessionToken');
+			$req->addHeader('Authorization', 'AuthSub token="'. $_REQUEST['token'] .'"');
+					
+			// Request token
+			$req->sendRequest();
+			
+			// Handle token reponse
+			if ($req->getResponseCode() != '200') return;
+			
+			// Extract Auth token
+			preg_match_all('/^(.+)=(.+)$/m', $req->getResponseBody(), $matches);
+			$tokens = array_combine($matches[1], $matches[2]);
+			unset($matches);
+						
+			// Add hidden auth token field to input field list
+			array_unshift($this->inputFields, array( 'text'    => 'Google Auth Token (leave alone)',
+			                                         'type'    => 'input',
+			                                         'name'    => 'bAuthToken',
+			                                         'default'   => $tokens['Token']));
+
+			// Prepare blog list request
+			$req = &new HTTP_Request('http://www.blogger.com/feeds/default/blogs');
+			$req->addHeader('GData-Version', 2);
+			$req->addHeader('Authorization', 'AuthSub token="'. $tokens['Token'] .'"');
+			
+			// Fetch blog list
+			$req->sendRequest();
+			
+			// Handle errors
+			if ($req->getResponseCode() != '200') return false;
+			
+			// Load list
+			$bXml = simplexml_load_string($req->getResponseBody());
+			
+			// Generate list of the blogs under the authenticated account
+			$bList = array();
+			foreach ($bXml->entry as $entry) {
+				$bList[substr($entry->id, strpos($entry->id, 'blog-') + 5)] = $entry->title;
+			}
+			
+			// Add blog list to input fields for selection
+			array_unshift($this->inputFields, array('text'    => 'Blog to import',
+													'type'    => 'list',
+													'name'    => 'bId',
+													'value'   => 0,
+													'default' => $bList));
+			
+	        return $this->inputFields;
+	    } else {
+			return array();
+		}
+    }
+	
+	function _getCategoryList() {
+		$res = serendipity_fetchCategories('all');
+		$ret = array(0 => NO_CATEGORY);
+		if (is_array($res)) {
+			foreach ($res as $v) {
+				$ret[$v['categoryid']] = $v['category_name'];
+			}
+		}
+		return $ret;
+	}
+    
+	function import() {
+		global $serendipity;
+		
+		// Force user to select a blog to act on
+		if (empty($this->data['bId']) || $this->data['bId'] == 0) {
+			echo 'Please select a blog to import!';
+			return false;
+		}
+		
+		// Save this so we can return it to its original value at the end of this method.
+        $noautodiscovery = isset($serendipity['noautodiscovery']) ? $serendipity['noautodiscovery'] : false;
+
+        if ($this->data['autodiscovery'] == 'false') {
+            $serendipity['noautodiscovery'] = 1;
+        }
+
+        $this->getTransTable();
+        		
+		// Prepare export request
+		$req = &new HTTP_Request('http://www.blogger.com/feeds/'. $this->data['bId'] .'/archive');
+		$req->addHeader('GData-Version', 2);
+		$req->addHeader('Authorization', 'AuthSub token="'. $this->data['bAuthToken'] .'"');
+				
+		// Attempt fetch blog export
+		$req->sendRequest();
+		
+		// Handle errors
+		if ($req->getResponseCode() != '200') {
+			echo "Error occured while trying to export the blog.";
+			return false;
+		}
+		
+		// Export success
+		echo 'Successfully exported entries from Blogger<br />';
+		
+		// Get Serendipity authors list
+		$authorList = array();
+		$s9y_users = serendipity_fetchUsers();
+		foreach ($s9y_users as $user) {
+			$authorList[$user['authorid']] = $user['username'];
+		}
+		unset($s9y_users);
+		
+		// Load export
+		$bXml = simplexml_load_string($req->getResponseBody());
+		
+		// Process entries
+		$entryList = $entryFailList = array();
+		foreach ($bXml->entry as $bEntry) {
+			
+			// Check entry type
+			switch ($bEntry->category['term']) {
+			case 'http://schemas.google.com/blogger/2008/kind#post':
+				// Process posts:
+				
+				// Create author if not in serendipity
+				$author = (string) $bEntry->author->name;
+				if (!array_search($author, $authorList)) {
+					serendipity_db_insert(	'authors', 
+											array(	'right_publish' => 1,
+													'realname'      => $author,
+													'username'      => $author,
+													'userlevel'     => 0,
+													'password'      => md5($defaultpass))
+											);
+					$authorid = serendipity_db_insert_id('authors', 'authorid');
+					$authorList[$authorid] = $author;
+				}
+				
+				$sEntry = array('title'          => $this->decode((string) $bEntry->title),
+								'isdraft'        => ($bEntry->children('http://purl.org/atom/app#')->control->draft == 'yes') ? 'true' : 'false',
+								'allow_comments' => (count($bEntry->xpath("*[@rel='replies']")) > 0) ? 'true' : 'false',
+								'timestamp'      => strtotime($bEntry->published),
+								'body'           => $this->strtr((string) $bEntry->content),
+								'extended'       => '',
+								'categories'     => $this->data['bCategory'],
+								'author'         => $author,
+								'authorid'       => $authorid
+								);
+				
+				// Add entry to s9y
+				echo '..~.. ';
+			    if (is_int($id = serendipity_updertEntry($sEntry))) {
+			        // Add entry id to processed table for later lookups
+			    	$entryList[(string) $bEntry->id] = array($id, $sEntry['title'], 0);
+			    } else {
+			    	// Add to fail list
+			    	$entryFailList[] = $sEntry['title'];
+			    }
+			    
+				break;
+				
+			case 'http://schemas.google.com/blogger/2008/kind#comment':
+				// Process comments:
+				
+				// Extract entry id for comment
+				$cEntryId = $bEntry->xpath("thr:in-reply-to[@ref]");
+				$cEntryId = (string) $cEntryId[0]['ref'];
+				
+				// Check to make sure the related entry has been added to s9y
+				if (array_key_exists($cEntryId, $entryList)) {
+					// Add to s9y
+					$sComment = array(	'entry_id ' => $entryList[$cEntryId][0],
+										'parent_id' => 0,
+										'timestamp' => strtotime($bEntry->published),
+										'author'    => (string) $bEntry->author->name,
+										'email'     => (string) $bEntry->author->email,
+										'url'       => (string) (isset($bEntry->author->uri)) ? $bEntry->author->uri : '',
+										'ip'        => '',
+										'status'    => 'approved',
+										'body'      => $this->strtr((string) $bEntry->content),
+										'subscribed'=> 'false',
+										'type'      => 'NORMAL'
+										);
+					serendipity_db_insert('comments', $sComment);
+					
+					// Update entry list with comment count
+					$entryList[$cEntryId][2]++;
+				}
+				
+				break;
+			}
+			
+		}
+		
+		// Report on resultant authors
+		echo '<br />Current list of authors: <br />'. join(', ', array_values($authorList)) .'<br /><br />';
+		
+		// Do cleanup and report on entries
+		echo 'The following entries were successfully imported:<br />';
+		foreach ($entryList as $eId => $eDetails) {
+			// Update comment count for entry in s9y
+			serendipity_db_query("UPDATE ". $serendipity['dbPrefix'] ."entries SET comments = ". $eDetails[2] ." WHERE id = ". $eDetails[0]);
+			
+			echo '- '. $eDetails[1] .' comments('. $eDetails[2] .')<br />';
+		}
+		echo '<br />';
+		
+		// Report fails
+		echo 'The following entries ran into trouble and was not imported:<br />';
+		foreach ($entryFailList as $eId => $eDetails) {
+			echo '- '. $eDetails .'<br />';
+		}
+				
+		// Reset autodiscovery
+		$serendipity['noautodiscovery'] = $noautodiscovery;
+		
+		// All done!
+		echo "Import finished.<br />";
+		return true;
+	}
+
+}
+
+return 'Serendipity_Import_Blogger';
+
 ?>
\ No newline at end of file
diff --git a/include/admin/importers/old_blogger.inc.php b/include/admin/importers/old_blogger.inc.php
new file mode 100644
index 00000000..2b42bd73
--- /dev/null
+++ b/include/admin/importers/old_blogger.inc.php
@@ -0,0 +1,257 @@
+<?php # $Id$
+# Copyright (c) 2003-2005, Jannis Hermanns (on behalf the Serendipity Developer Team)
+# All rights reserved.  See LICENSE file for licensing details
+
+class Serendipity_Import_OldBlogger extends Serendipity_Import {
+    var $info        = array('software' => 'Blogger.com [OLD]');
+    var $data        = array();
+    var $inputFields = array();
+
+    function Serendipity_Import_OldBlogger($data) {
+        global $serendipity;
+
+        $this->data = $data;
+        $this->inputFields = array(array('text'    => 'Path to your Blogger export file',
+                                         'type'    => 'input',
+                                         'name'    => 'bloggerfile',
+                                         'value'   => $serendipity['serendipityPath']),
+
+                                   array('text'    => 'New author default password (used for non-existing authors on the serendipity backend, as author passwords from Blogger are not migrated)',
+                                         'type'    => 'input',
+                                         'name'    => 'defaultpass',
+                                         'value'   => ''),
+
+                                   array('text'    => CHARSET,
+                                         'type'    => 'list',
+                                         'name'    => 'charset',
+                                         'value'   => 'UTF-8',
+                                         'default' => $this->getCharsets()),
+
+                                    array('text'   => RSS_IMPORT_BODYONLY,
+                                         'type'    => 'bool',
+                                         'name'    => 'bodyonly',
+                                         'value'   => 'false'));
+    }
+
+    function validateData() {
+        return sizeof($this->data);
+    }
+
+    function getInputFields() {
+        return $this->inputFields;
+    }
+
+    function getImportNotes() {
+        $out = '
+<style type="text/css">
+<!--
+.style1 {
+    font-size: large;
+    font-weight: bold;
+    font-family: Arial, Helvetica, sans-serif;
+}
+.style2 {
+    font-family: Arial, Helvetica, sans-serif;
+    font-size: x-small;
+}
+-->
+</style>
+
+<p class="style1">BLOGGER.COM to SERENDIPITY IMPORT</p>
+<p class="style2">Version 0.1,( 29/10/2005 )</p>
+<p class="style2"> <br />
+  1. First go to Blogger.com, login.</p>
+<p class="style2">2. Go to the templates section. Set the following as your template. You should backup the current template if you want to reset it back after this operation. Click &quot;Save template changes&quot; button to save this new template.</p>
+<p class="style2">
+  <label>
+  <textarea name="textarea" cols="60" rows="20"><Blogger>
+STARTPOST
+
+TITLE: <PostSubject><$BlogItemSubject$></PostSubject>
+AUTHOR: <$BlogItemAuthor$>
+DATE: <$BlogItemDateTime$>
+-----
+BODY:
+<$BlogItemBody$>
+-----
+<BlogItemCommentsEnabled>
+<BlogItemComments>
+COMMENT:
+AUTHOR: <$BlogCommentAuthor$>
+DATE: <$BlogCommentDateTime$>
+BODY: <$BlogCommentBody$>
+-----
+</BlogItemComments>
+</BlogItemCommentsEnabled>
+ENDPOST
+</Blogger>
+  </textarea>
+  </label>
+</p>
+<p class="style2">3. Go to the &quot;Settings&quot; section of blogger. </p>
+<p class="style2">4. Click the &quot;Formatting&quot; link. From the formatting options, find the &quot;Timestamp Format&quot; option and set it to the top most option. i.e the one with the date and time showing. Find the &quot;Show&quot; option, and set it to 999. Save changes</p>
+<p class="style2">5. Now click the &quot;Comments&quot; link. Find the &quot;Comments Timestamp Format&quot; option and set it to the 2nd option from the list. i.e the one with the date and time showing. Save changes. </p>
+<p class="style2">6. On the server with your Serendipity installation, create a directory called &quot;blogger&quot;. </p>
+<p class="style2">7. Next, back on Blogger.com, go to the &quot;Publishing&quot; section. Set it to publish to an FTP server. Enter the details of the server with your Serendipity installation. Set the FTP path as the path to the &quot;blogger&quot; directory you created in the previous step. </p>
+<p class="style2">8. Go back to Blogger.com and find &quot;Publish Entire Blog&quot; under &quot;Posting&quot; -&gt; &quot;Status&quot;. Click the Publish entire blog button to let blogger publish the blog to your ftp server.</p>
+<p class="style2">9. Now in the box below type in the path to the &quot;index.html&quot; file blogger created under your &quot;blogger&quot; directory.  File path should then look something like &quot;/httpdocs/blogger/index.html&quot;.</p>
+<p class="style2">10. This script will create the users as from the blogger blog being imported. However if a user already exists, then that user will be used instead of creating a new user with similar name. For the new users that this script will create, you need to provide a default password. Type it in the box below.</p>
+<p class="style2">11. Click &quot;Submit&quot;. Your posts and comments should be imported to serendipity!</p>
+<p class="style2"> If you have questions or problems, feel free to drop me a mail at jaa at technova dot com dot mv.<br />
+  <br />
+Jaa<br />
+http://jaa.technova.com.mv</p>';
+        return $out;
+    }
+
+    function import() {
+        global $serendipity;
+
+        if (empty($this->data['bloggerfile']) || !file_exists($this->data['bloggerfile'])) {
+            echo "Path to blogger file empty or path to file wrong! Go back and correct.";
+            return false;
+        }
+
+        # get default pass from request
+        $defaultpass = $this->data['defaultpass'];
+
+        # get blogger uploaded file path from request and load file
+        $html = file_get_contents($this->data['bloggerfile']);
+
+        # find posts using pattern matching
+        preg_match_all("/STARTPOST(.*)ENDPOST/sU", $html, $posts);
+
+        # iterate through all posts
+        foreach($posts[1] as $post) {
+
+            # locate the post title
+            if (preg_match("/TITLE:(.*)/", $post, $title)) {
+                $title = trim($title[1]);
+                echo "<b>" . htmlspecialchars($title) . "</b><br />";
+            } else {
+                $title = "";
+                echo "<b>Empty title</b><br />";
+            }
+
+            # locate the post author
+            if (preg_match("/AUTHOR:(.*)/", $post, $author)) {
+                $author = trim($author[1]);
+                echo "<em>" . htmlspecialchars($author[1]) . "</em><br />";
+            } else {
+                $author = "";
+                echo "<em>Unknown author</em><br />";
+            }
+
+            # locate the post date
+            if (preg_match("/DATE:(.*)/", $post, $date)) {
+                $date = strtotime(trim($date[1]));
+                echo "Posted on " . htmlspecialchars($date[1]) . ".<br />";
+            } else {
+                $date = time();
+                echo "Unknown posting time.<br />";
+            }
+
+            # locate the post body
+            if (preg_match("/BODY:(.*)-----/sU", $post, $body)) {
+                $body = trim($body[1]);
+                echo strlen($body) . " Bytes of text.<br />";
+            } else {
+                $body = "";
+                echo "<strong>Empty Body!</strong><br />";
+            }
+
+            # find all comments for the post using pattern matching
+            if (preg_match_all( "/COMMENT:(.*)----/sU", $post, $commentlist)) {
+                echo count($commentlist[1]) . " comments found.<br />";
+            } else {
+                $commentlist = array();
+                echo "No comments found.<br />";
+            }
+
+            $result = serendipity_db_query("SELECT authorid FROM ". $serendipity['dbPrefix'] ."authors WHERE username = '". serendipity_db_escape_string($author) ."' LIMIT 1", true, 'assoc');
+            if (!is_array($result)) {
+                $data = array('right_publish' => 1,
+                              'realname'      => $author,
+                              'username'      => $author,
+                              'userlevel'     => 0,
+                              'password'      => md5($defaultpass)); // MD5 compatible
+                serendipity_db_insert('authors', $data);
+                $authorid = serendipity_db_insert_id('authors', 'authorid');
+            } else {
+                $authorid = $result['authorid'];
+            }
+
+
+            $entry = array('title'          => $title,
+                           'isdraft'        => 'false',
+                           'allow_comments' => 'true',
+                           'timestamp'      => $date,
+                           'body'           => $body,
+                           'extended'       => '',
+                           'author'            => $author,
+                           'authorid'       => $authorid
+                           );
+
+            echo "Entry insert...<br />";
+            if (!is_int($id = serendipity_updertEntry($entry))) {
+                echo "Inserting entry failed.<br />";
+                return $id;
+            } else {
+                echo "Entry $id inserted.<br />";
+            }
+
+            # iterate through all comments
+            $c = 0;
+            foreach($commentlist[1] as $comment) {
+                $c++;
+
+                # locate the author and author url
+                $curl    = '';
+                $cauthor = '';
+                $cdate   = time();
+                $cbody   = '';
+
+                if (preg_match("/AUTHOR:(.*)/", $comment, $cauthor) && preg_match("/href=\"(.*)\"/", $cauthor[1], $curl)) {
+                    $curl    = (isset($curl[1]) ? trim($curl[1]) : '');
+                    $cauthor = trim(strip_tags($cauthor[1]));
+                }
+
+                # locate the date
+                if (preg_match("/DATE:(.*)/", $comment, $cdate)) {
+                    $cdate = strtotime($cdate[1]);
+                }
+
+                # locate the comment body
+                if (preg_match("/BODY:(.*)/s", $comment, $cbody)) {
+                    $cbody = trim($cbody[1]);
+                }
+
+                $icomment = array('entry_id ' => $id,
+                                 'parent_id' => 0,
+                                 'timestamp' => $cdate,
+                                 'author'    => $cauthor,
+                                 'email'     => '',
+                                 'url'       => $curl,
+                                 'ip'        => '',
+                                 'status'    => 'approved',
+                                 'body'      => $cbody,
+                                 'subscribed'=> 'false',
+                                 'type'      => 'NORMAL');
+
+                serendipity_db_insert('comments', $icomment);
+            }
+
+            serendipity_db_query("UPDATE ". $serendipity['dbPrefix'] ."entries SET comments = ". $c ." WHERE id = ". $id);
+            echo "Comment count set to: ". $c ."<br />";
+        }
+
+        echo "Import finished.<br />";
+
+        return true;
+    }
+}
+
+return 'Serendipity_Import_OldBlogger';
+
+/* vim: set sts=4 ts=4 expandtab : */
+?>
\ No newline at end of file