Index: src/main/java/org/codehaus/swizzle/confluence/ConfluenceException.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/ConfluenceException.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/ConfluenceException.java	(working copy)
@@ -6,7 +6,7 @@
  * and can be obtained by calling the getCause method
  * (otherwise getCause will return null).
  */
-public class ConfluenceException extends SwizzleException {
+public class ConfluenceException extends SwizzleConfluenceException {
     private static final long serialVersionUID = 4697548022557085636L;
 
     public ConfluenceException() {
Index: src/main/java/org/codehaus/swizzle/confluence/Comment.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/Comment.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/Comment.java	(working copy)
@@ -17,6 +17,7 @@
 package org.codehaus.swizzle.confluence;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -24,6 +25,34 @@
  */
 public class Comment extends MapObject {
 
+    private static final String ID = "id";
+    private static final String PAGE_ID = "pageId";
+    private static final String TITLE = "title";
+    private static final String CONTENT = "content";
+    private static final String URL = "url";
+    private static final String CREATED = "created";
+    private static final String CREATOR = "creator";
+    
+    // not documented fields!
+    private static final String MODIFIED = "modified";
+    private static final String MODIFIER = "modifier";
+    private static final String PARENT_ID = "parentId";
+
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put(ID, String.class);
+        FIELD_TYPES.put(PAGE_ID, String.class);        
+        FIELD_TYPES.put(TITLE, String.class);
+        FIELD_TYPES.put(CONTENT, String.class);        
+        FIELD_TYPES.put(URL, String.class);
+        FIELD_TYPES.put(CREATED, Date.class);        
+        FIELD_TYPES.put(CREATOR, String.class);
+        FIELD_TYPES.put(MODIFIED, Date.class); // not documented!
+        FIELD_TYPES.put(MODIFIER, String.class); // not documented!
+        FIELD_TYPES.put(PARENT_ID, String.class); // not documented! wtf does it mean?
+    }
+    
     public Comment() {
         super();
     }
@@ -37,77 +66,76 @@
      * numeric id of the comment
      */
     public String getId() {
-        return getString("id");
+        return (String)get(ID);
     }
 
     public void setId(String id) {
-        setString("id", id);
+        put(ID, id);
     }
 
     /**
      * page ID of the comment
      */
     public String getPageId() {
-        return getString("pageId");
+        return (String)get(PAGE_ID);
     }
 
     public void setPageId(String pageId) {
-        setString("pageId", pageId);
+        put(PAGE_ID, pageId);
     }
 
     /**
      * title of the comment
      */
     public String getTitle() {
-        return getString("title");
+        return (String)get(TITLE);
     }
 
     public void setTitle(String title) {
-        setString("title", title);
+        put(TITLE, title);
     }
 
     /**
      * notated content of the comment (use renderContent to render)
      */
     public String getContent() {
-        return getString("content");
+        return (String)get(CONTENT);
     }
 
     public void setContent(String content) {
-        setString("content", content);
+        put(CONTENT, content);
     }
 
     /**
      * url to view the comment online
      */
     public String getUrl() {
-        return getString("url");
+        return (String)get(URL);
     }
 
     public void setUrl(String url) {
-        setString("url", url);
+        put(URL, url);
     }
 
     /**
      * creation date of the attachment
      */
     public Date getCreated() {
-        return getDate("created");
+        return (Date)get(CREATED);
     }
 
     public void setCreated(Date created) {
-        setDate("created", created);
+        put(CREATED, created);
     }
 
     /**
      * creator of the attachment
      */
     public String getCreator() {
-        return getString("creator");
+        return (String)get(CREATOR);
     }
 
     public void setCreator(String creator) {
-        setString("creator", creator);
+        put(CREATOR, creator);
     }
-
 }
Index: src/main/java/org/codehaus/swizzle/confluence/MapObject.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/MapObject.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/MapObject.java	(working copy)
@@ -16,75 +16,52 @@
  */
 package org.codehaus.swizzle.confluence;
 
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
 /**
  * @version $Revision$ $Date$
  */
-public class MapObject {
-
-    private final SimpleDateFormat format;
+public abstract class MapObject {
     private final Map fields;
     
     protected MapObject() {
         fields = new HashMap();
-        format = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy");
     }
 
     protected MapObject(Map data) {
         fields = new HashMap(data);
-        format = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy");
     }
 
-    protected String getString(String key) {
-        return (String) fields.get(key);
+    protected Object get(String key) {
+        return fields.get(key);
     }
 
-    protected boolean getBoolean(String key) {
-        String value = getString(key);
-        return (value.equalsIgnoreCase("true") || value.equals("1") || value.equalsIgnoreCase("yes"));
-    }
-
-    protected int getInt(String key) {
-        String value = getString(key);
-        return Integer.parseInt(value);
-    }
-
-    protected void setString(String key, String value) {
+    protected void put(String key, Object value) {
         fields.put(key, value);
     }
 
-    protected void setInt(String key, int value) {
-        fields.put(key, Integer.toString(value));
+    public Map toMap() {
+        return new HashMap(fields);
     }
 
-    protected void setBoolean(String key, boolean value) {
-        fields.put(key, Boolean.toString(value));
+    public String toString() {
+        return toMap().toString();
     }
-
-    protected void setDate(String key, Date value) {
-        fields.put(key, format.format(value));
+    
+    protected int getInt(String key) {
+        return ((Integer)get(key)).intValue();
     }
 
-    protected Date getDate(String key) {
-        try {
-            return format.parse(getString(key));
-        } catch (ParseException e) {
-            e.printStackTrace();
-            return new Date();
-        }
+    protected void putInt(String key, int value) {
+        put(key, new Integer(value));
     }
-
-    public Map toMap() {
-        return new HashMap(fields);
+    
+    protected boolean getBoolean(String key) {
+        return ((Boolean)get(key)).booleanValue();
     }
 
-
-    public String toString() {
-        return toMap().toString();
+    protected void putBoolean(String key, boolean value) {
+        put(key, new Boolean(value));
     }
 }
Index: src/main/java/org/codehaus/swizzle/confluence/SearchResult.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/SearchResult.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/SearchResult.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package org.codehaus.swizzle.confluence;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -36,55 +37,64 @@
      * the feed's title
      */
     public String getTitle() {
-        return getString("title");
+        return (String)get("title");
     }
 
     public void setTitle(String title) {
-        setString("title", title);
+        put("title", title);
     }
 
     /**
      * the remote URL needed to view this search result online
      */
     public String getUrl() {
-        return getString("url");
+        return (String)get("url");
     }
 
     public void setUrl(String url) {
-        setString("url", url);
+        put("url", url);
     }
 
     /**
      * a short excerpt of this result if it makes sense
      */
     public String getExcerpt() {
-        return getString("excerpt");
+        return (String)get("excerpt");
     }
 
     public void setExcerpt(String excerpt) {
-        setString("excerpt", excerpt);
+        put("excerpt", excerpt);
     }
 
     /**
      * the type of this result - page, comment, spacedesc, attachment, userinfo, blogpost
      */
     public String getType() {
-        return getString("type");
+        return (String)get("type");
     }
 
     public void setType(String type) {
-        setString("type", type);
+        put("type", type);
     }
 
     /**
      * the long ID of this result (if the type has one)
      */
     public String getId() {
-        return getString("id");
+        return (String)get("id");
     }
 
     public void setId(String id) {
-        setString("id", id);
+        put("id", id);
     }
 
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put("title", String.class);
+        FIELD_TYPES.put("url", String.class);
+        FIELD_TYPES.put("excerpt", String.class);
+        FIELD_TYPES.put("type", String.class);
+        FIELD_TYPES.put("id", String.class);        
+    }
 }
Index: src/main/java/org/codehaus/swizzle/confluence/BlogEntry.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/BlogEntry.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/BlogEntry.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package org.codehaus.swizzle.confluence;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -36,44 +37,44 @@
      * the id of the blog entry
      */
     public String getId() {
-        return getString("id");
+        return (String)get("id");
     }
 
     public void setId(String id) {
-        setString("id", id);
+        put("id", id);
     }
 
     /**
      * the key of the space that this blog entry belongs to
      */
     public String getSpace() {
-        return getString("space");
+        return (String)get("space");
     }
 
     public void setSpace(String space) {
-        setString("space", space);
+        put("space", space);
     }
 
     /**
      * the title of the page
      */
     public String getTitle() {
-        return getString("title");
+        return (String)get("title");
     }
 
     public void setTitle(String title) {
-        setString("title", title);
+        put("title", title);
     }
 
     /**
      * the url to view this blog entry online
      */
     public String getUrl() {
-        return getString("url");
+        return (String)get("url");
     }
 
     public void setUrl(String url) {
-        setString("url", url);
+        put("url", url);
     }
 
     /**
@@ -84,18 +85,18 @@
     }
 
     public void setVersion(int version) {
-        setInt("version", version);
+        putInt("version", version);
     }
 
     /**
      * the blog entry content
      */
     public String getContent() {
-        return getString("content");
+        return (String)get("content");
     }
 
     public void setContent(String content) {
-        setString("content", content);
+        put("content", content);
     }
 
     /**
@@ -106,7 +107,18 @@
     }
 
     public void setLocks(int locks) {
-        setInt("locks", locks);
+        putInt("locks", locks);
     }
 
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put("id", String.class);
+        FIELD_TYPES.put("space", String.class);
+        FIELD_TYPES.put("title", String.class);
+        FIELD_TYPES.put("url", String.class);
+        FIELD_TYPES.put("version", Integer.class);
+        FIELD_TYPES.put("content", String.class);
+        FIELD_TYPES.put("locks", Integer.class);
+    }
 }
Index: src/main/java/org/codehaus/swizzle/confluence/SpaceSummary.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/SpaceSummary.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/SpaceSummary.java	(working copy)
@@ -16,13 +16,31 @@
  */
 package org.codehaus.swizzle.confluence;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
+ * Represents the details of a Space (SpaceSummary) as described in the <a href="Confluence
+ * specification"> http://confluence.atlassian.com/display/DOC/Remote+API+Specification</a>.
+ * 
  * @version $Revision$ $Date$
  */
 public class SpaceSummary extends MapObject {
     
+    protected static final String KEY = "key";
+    protected static final String NAME = "name";
+    protected static final String TYPE = "type";
+    protected static final String URL = "url";
+
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put(KEY, String.class);
+        FIELD_TYPES.put(NAME, String.class);
+        FIELD_TYPES.put(TYPE, String.class);
+        FIELD_TYPES.put(URL, String.class);
+    }
+    
     public SpaceSummary() {
         super();
     }
@@ -33,36 +51,48 @@
 
 
     /**
-     * the space key
+     * @return the key of the space, i.e. the unique space name
      */
     public String getKey() {
-        return getString("key");
+        return (String)get(KEY);
     }
 
     public void setKey(String key) {
-        setString("key", key);
+        put(KEY, key);
     }
 
     /**
-     * the name of the space
+     * @return a more descriptive name of the space
+     * In XWiki this can (an often will) be empty.
      */
     public String getName() {
-        return getString("name");
+        return (String)get(NAME);
     }
 
     public void setName(String name) {
-        setString("name", name);
+        put(NAME, name);
     }
+    
+    /**
+     * @return The type of the space
+     */
+    public String getType() {
+        return (String)get(TYPE);
+    }
 
+    public void setType(String type) {
+        put(TYPE, type);
+    }
+
     /**
-     * the url to view this space online
+     * @return The url to view this space online.
+     * Example: "http://server/xwiki/bin/view/Space/WebHome"
      */
     public String getUrl() {
-        return getString("url");
+        return (String)get(URL);
     }
 
     public void setUrl(String url) {
-        setString("url", url);
+        put(URL, url);
     }
-
 }
Index: src/main/java/org/codehaus/swizzle/confluence/Page.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/Page.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/Page.java	(working copy)
@@ -17,6 +17,7 @@
 package org.codehaus.swizzle.confluence;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -24,6 +25,37 @@
  */
 public class Page extends PageSummary {
 
+    private static final String VERSION = "version";
+    private static final String CONTENT = "content";
+    private static final String CREATED = "created";
+    private static final String CREATOR = "creator";
+    private static final String MODIFIED = "modified";
+    private static final String MODIFIER = "modifier";
+    private static final String HOME_PAGE = "homePage";
+    private static final String CONTENT_STATUS = "contentStatus";
+    private static final String CURRENT = "current";
+
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put(ID, String.class);
+        FIELD_TYPES.put(SPACE, String.class);
+        FIELD_TYPES.put(PARENT_ID, String.class);
+        FIELD_TYPES.put(TITLE, String.class);
+        FIELD_TYPES.put(URL, String.class);
+        FIELD_TYPES.put(VERSION, Integer.class);
+        FIELD_TYPES.put(CONTENT, String.class);
+        FIELD_TYPES.put(CREATED, Date.class);
+        FIELD_TYPES.put(CREATOR, String.class);
+        FIELD_TYPES.put(MODIFIED, Date.class);
+        FIELD_TYPES.put(MODIFIER, String.class);
+        FIELD_TYPES.put(HOME_PAGE, Boolean.class);
+        FIELD_TYPES.put(LOCKS, Integer.class);
+        FIELD_TYPES.put(CONTENT_STATUS, String.class);
+        FIELD_TYPES.put(CURRENT, Boolean.class);
+        FIELD_TYPES.put(PERMISSIONS, Integer.class); // not documented!
+    }
+
     public Page() {
         super();
     }
@@ -36,99 +68,98 @@
      * the version number of this page
      */
     public int getVersion() {
-        return getInt("version");
+        return getInt(VERSION);
     }
 
     public void setVersion(int version) {
-        setInt("version", version);
+        putInt(VERSION, version);
     }
 
     /**
      * the page content
      */
     public String getContent() {
-        return getString("content");
+        return (String)get(CONTENT);
     }
 
     public void setContent(String content) {
-        setString("content", content);
+        put(CONTENT, content);
     }
 
     /**
      * timestamp page was created
      */
     public Date getCreated() {
-        return getDate("created");
+        return (Date)get(CREATED);
     }
 
     public void setCreated(Date created) {
-        setDate("created", created);
+        put(CREATED, created);
     }
 
     /**
      * username of the creator
      */
     public String getCreator() {
-        return getString("creator");
+        return (String)get(CREATOR);
     }
 
     public void setCreator(String creator) {
-        setString("creator", creator);
+        put(CREATOR, creator);
     }
 
     /**
      * timestamp page was modified
      */
     public Date getModified() {
-        return getDate("modified");
+        return (Date)get(MODIFIED);
     }
 
     public void setModified(Date modified) {
-        setDate("modified", modified);
+        put(MODIFIED, modified);
     }
 
     /**
      * username of the page's last modifier
      */
     public String getModifier() {
-        return getString("modifier");
+        return (String)get(MODIFIER);
     }
 
     public void setModifier(String modifier) {
-        setString("modifier", modifier);
+        put(MODIFIER, modifier);
     }
 
     /**
      * whether or not this page is the space's homepage
      */
     public boolean isHomePage() {
-        return getBoolean("homePage");
+        return getBoolean(HOME_PAGE);
     }
 
     public void setHomePage(boolean homePage) {
-        setBoolean("homePage", homePage);
+        putBoolean(HOME_PAGE, homePage);
     }
 
     /**
      * status of the page (eg current or deleted)
      */
     public String getContentStatus() {
-        return getString("contentStatus");
+        return (String)get(CONTENT_STATUS);
     }
 
     public void setContentStatus(String contentStatus) {
-        setString("contentStatus", contentStatus);
+        put(CONTENT_STATUS, contentStatus);
     }
 
     /**
      * whether the page is current and not deleted
      */
     public boolean isCurrent() {
-        return getBoolean("current");
+        return getBoolean(CURRENT);
     }
 
     public void setCurrent(boolean current) {
-        setBoolean("current", current);
+        putBoolean(CURRENT, current);
     }
-
 }
Index: src/main/java/org/codehaus/swizzle/confluence/PageHistorySummary.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/PageHistorySummary.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/PageHistorySummary.java	(working copy)
@@ -17,6 +17,7 @@
 package org.codehaus.swizzle.confluence;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -24,6 +25,20 @@
  */
 public class PageHistorySummary extends MapObject {
 
+    private static final String ID = "id";
+    private static final String VERSION = "version";
+    private static final String MODIFIER = "modifier";
+    private static final String MODIFIED = "modified";
+
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put(ID, String.class);
+        FIELD_TYPES.put(VERSION, Integer.class);
+        FIELD_TYPES.put(MODIFIER, String.class);
+        FIELD_TYPES.put(MODIFIED, Date.class);
+    }
+    
     public PageHistorySummary() {
         super();
     }
@@ -37,44 +52,43 @@
      * the id of the historical page
      */
     public String getId() {
-        return getString("id");
+        return (String)get(ID);
     }
 
     public void setId(String id) {
-        setString("id", id);
+        put(ID, id);
     }
 
     /**
      * the version of this historical page
      */
     public int getVersion() {
-        return getInt("version");
+        return getInt(VERSION);
     }
 
     public void setVersion(int version) {
-        setInt("version", version);
+        putInt(VERSION, version);
     }
 
     /**
      * the user who made this change
      */
     public String getModifier() {
-        return getString("modifier");
+        return (String)get(MODIFIER);
     }
 
     public void setModifier(String modifier) {
-        setString("modifier", modifier);
+        put(MODIFIER, modifier);
     }
 
     /**
      * timestamp change was made
      */
     public Date getModified() {
-        return getDate("modified");
+        return (Date)get(MODIFIED);
     }
 
     public void setModified(Date modified) {
-        setDate("modified", modified);
+        put(MODIFIED, modified);
     }
-
 }
Index: src/main/java/org/codehaus/swizzle/confluence/User.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/User.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/User.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package org.codehaus.swizzle.confluence;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -23,6 +24,20 @@
  */
 public class User extends MapObject {
 
+    private static final String NAME = "name";
+    private static final String FULLNAME = "fullname";
+    private static final String EMAIL = "email";
+    private static final String URL = "url";
+
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put(NAME, String.class);
+        FIELD_TYPES.put(FULLNAME, String.class);
+        FIELD_TYPES.put(EMAIL, String.class);
+        FIELD_TYPES.put(URL, String.class);
+    }
+    
     public User() {
         super();
     }
@@ -35,44 +50,43 @@
      * the username of this user
      */
     public String getName() {
-        return getString("name");
+        return (String)get(NAME);
     }
 
     public void setName(String name) {
-        setString("name", name);
+        put(NAME, name);
     }
 
     /**
      * the full name of this user
      */
     public String getFullname() {
-        return getString("fullname");
+        return (String)get(FULLNAME);
     }
 
     public void setFullname(String fullname) {
-        setString("fullname", fullname);
+        put(FULLNAME, fullname);
     }
 
     /**
      * the email address of this user
      */
     public String getEmail() {
-        return getString("email");
+        return (String)get(EMAIL);
     }
 
     public void setEmail(String email) {
-        setString("email", email);
+        put(EMAIL, email);
     }
 
     /**
      * the url to view this user online
      */
     public String getUrl() {
-        return getString("url");
+        return (String)get(URL);
     }
 
     public void setUrl(String url) {
-        setString("url", url);
+        put(URL, url);
     }
-
 }
Index: src/main/java/org/codehaus/swizzle/confluence/Label.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/Label.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/Label.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package org.codehaus.swizzle.confluence;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -33,47 +34,55 @@
 
 
     /**
-     * the nameof the label
+     * the name of the label
      */
     public String getName() {
-        return getString("name");
+        return (String)get("name");
     }
 
     public void setName(String name) {
-        setString("name", name);
+        put("name", name);
     }
 
     /**
      * the username of the owner
      */
     public String getOwner() {
-        return getString("owner");
+        return (String)get("owner");
     }
 
     public void setOwner(String owner) {
-        setString("owner", owner);
+        put("owner", owner);
     }
 
     /**
      * the namespace of the label
      */
     public String getNamespace() {
-        return getString("namespace");
+        return (String)get("namespace");
     }
 
     public void setNamespace(String namespace) {
-        setString("namespace", namespace);
+        put("namespace", namespace);
     }
 
     /**
      * the ID of the label
      */
     public String getId() {
-        return getString("id");
+        return (String)get("id");
     }
 
     public void setId(String id) {
-        setString("id", id);
+        put("id", id);
     }
-
+    
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put("name", String.class);
+        FIELD_TYPES.put("owner", String.class);
+        FIELD_TYPES.put("namespace", String.class);
+        FIELD_TYPES.put("id", String.class);
+    }
 }
Index: src/main/java/org/codehaus/swizzle/confluence/Confluence.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/Confluence.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/Confluence.java	(working copy)
@@ -18,34 +18,41 @@
  */
 public class Confluence {
     private final XmlRpcClient client;
-    private String token;
+    protected String token;
+    private MapConvertor mapConvertor;
 
-    public Confluence(String endpoint) throws MalformedURLException {
+    public Confluence(String endpoint) throws SwizzleConfluenceException {
         if (endpoint.endsWith("/")) {
             endpoint = endpoint.substring(0, endpoint.length() - 1);
         }
 
-        if (! endpoint.endsWith("/rpc/xmlrpc")) {
-            endpoint += "/rpc/xmlrpc";
-        }
+//        if (! endpoint.endsWith("/rpc/xmlrpc")) {
+//            endpoint += "/rpc/xmlrpc";
+//        }
 
         XmlRpcClientConfigImpl clientConfig = new XmlRpcClientConfigImpl();
-        clientConfig.setServerURL(new URL(endpoint));
+        try {
+            clientConfig.setServerURL(new URL(endpoint));
+        } catch (MalformedURLException e) {
+            throw new SwizzleConfluenceException(e);
+        }
 
         client = new XmlRpcClient();
         client.setConfig(clientConfig);
         
         token = ""; // empty token allows anonymous access
+        
+        setConvertor(new ConfluenceObjectConvertor());
     }
 
-    public void login(String username, String password) throws SwizzleException, ConfluenceException {
+    public void login(String username, String password) throws SwizzleConfluenceException, ConfluenceException {
         token = (String) call("login", username, password);
     }
 
     /**
      * remove this token from the list of logged in tokens. Returns true if the user was logged out, false if they were not logged in in the first place (we don't really need this return, but void seems to kill XML-RPC for me)
      */
-    public boolean logout() throws SwizzleException, ConfluenceException {
+    public boolean logout() throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("logout");
         return value.booleanValue();
     }
@@ -53,22 +60,22 @@
     /**
      * exports a Confluence instance and returns a String holding the URL for the download. The boolean argument indicates whether or not attachments ought to be included in the export.
      */
-    public String exportSite(boolean exportAttachments) throws SwizzleException, ConfluenceException {
+    public String exportSite(boolean exportAttachments) throws SwizzleConfluenceException, ConfluenceException {
         return (String) call("exportSite", new Boolean(exportAttachments));
     }
 
     /**
      * retrieve some basic information about the server being connected to. Useful for clients that need to turn certain features on or off depending on the version of the server. (Since 1.0.3)
      */
-    public ServerInfo getServerInfo() throws SwizzleException, ConfluenceException {
+    public ServerInfo getServerInfo() throws SwizzleConfluenceException, ConfluenceException {
         Map data = (Map) call("getServerInfo");
-        return new ServerInfo(data);
+        return new ServerInfo(revert(data, ServerInfo.FIELD_TYPES));
     }
 
     /**
      * returns all the {@link SpaceSummary} instances that the current user can see.
      */
-    public List getSpaces() throws SwizzleException, ConfluenceException {
+    public List getSpaces() throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getSpaces");
         return toList(vector, SpaceSummary.class);
     }
@@ -76,37 +83,38 @@
     /**
      * returns a single Space.
      */
-    public Space getSpace(String spaceKey) throws SwizzleException, ConfluenceException {
+    public Space getSpace(String spaceKey) throws SwizzleConfluenceException, ConfluenceException {
         Map data = (Map) call("getSpace", spaceKey);
-        return new Space(data);
+        return new Space(revert(data, Space.FIELD_TYPES));
     }
 
     /**
      * exports a space and returns a String holding the URL for the download. The export type argument indicates whether or not to export in XML, PDF, or HTML format - use "TYPE_XML", "TYPE_PDF", or "TYPE_HTML" respectively. Also, using "all" will select TYPE_XML.
      */
-    public String exportSpace(String spaceKey, String exportType) throws SwizzleException, ConfluenceException {
+    public String exportSpace(String spaceKey, String exportType) throws SwizzleConfluenceException, ConfluenceException {
         return (String) call("exportSpace", spaceKey, exportType);
     }
 
     /**
      * create a new space, passing in name, key and description.
      */
-    public Space addSpace(Space space) throws SwizzleException, ConfluenceException {
-        Map data = (Map) call("addSpace", space.toMap());
-        return new Space(data);
+    public Space addSpace(Space space) throws SwizzleConfluenceException, ConfluenceException {
+        Map data = (Map) call("addSpace", convert(space));
+        return new Space(revert(data, Space.FIELD_TYPES));
     }
 
     /**
      * remove a space completely.
      */
-    public Boolean removeSpace(String spaceKey) throws SwizzleException, ConfluenceException {
-        return (Boolean) call("removeSpace", spaceKey);
+    public boolean removeSpace(String spaceKey) throws SwizzleConfluenceException, ConfluenceException {
+        Boolean value =  (Boolean) call("removeSpace", spaceKey);
+        return value.booleanValue();
     }
 
     /**
      * returns all the {@link PageSummary} instances in the space. Doesn't include pages which are in the Trash. Equivalent to calling {{Space.getCurrentPages()}}.
      */
-    public List getPages(String spaceKey) throws SwizzleException, ConfluenceException {
+    public List getPages(String spaceKey) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getPages", spaceKey);
         return toList(vector, PageSummary.class);
     }
@@ -114,23 +122,23 @@
     /**
      * returns a single Page
      */
-    public Page getPage(String pageId) throws SwizzleException, ConfluenceException {
+    public Page getPage(String pageId) throws SwizzleConfluenceException, ConfluenceException {
         Map data = (Map) call("getPage", pageId);
-        return new Page(data);
+        return new Page(revert(data, Page.FIELD_TYPES));
     }
 
     /**
      * returns a single Page
      */
-    public Page getPage(String spaceKey, String pageTitle) throws SwizzleException, ConfluenceException {
+    public Page getPage(String spaceKey, String pageTitle) throws SwizzleConfluenceException, ConfluenceException {
         Map data = (Map) call("getPage", spaceKey, pageTitle);
-        return new Page(data);
+        return new Page(revert(data, Page.FIELD_TYPES));
     }
 
     /**
      * returns all the {@link PageHistorySummary} instances - useful for looking up the previous versions of a page, and who changed them.
      */
-    public List getPageHistory(String pageId) throws SwizzleException, ConfluenceException {
+    public List getPageHistory(String pageId) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getPageHistory", pageId);
         return toList(vector, PageHistorySummary.class);
     }
@@ -138,7 +146,7 @@
     /**
      * returns all the {@link Attachment}s for this page (useful to point users to download them with the full file download URL returned).
      */
-    public List getAttachments(String pageId) throws SwizzleException, ConfluenceException {
+    public List getAttachments(String pageId) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getAttachments", pageId);
         return toList(vector, Attachment.class);
     }
@@ -146,7 +154,7 @@
     /**
      * returns all the ancestors (as {@link PageSummary} instances) of this page (parent, parent's parent etc).
      */
-    public List getAncestors(String pageId) throws SwizzleException, ConfluenceException {
+    public List getAncestors(String pageId) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getAncestors", pageId);
         return toList(vector, PageSummary.class);
     }
@@ -154,7 +162,7 @@
     /**
      * returns all the direct children (as {@link PageSummary} instances) of this page.
      */
-    public List getChildren(String pageId) throws SwizzleException, ConfluenceException {
+    public List getChildren(String pageId) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getChildren", pageId);
         return toList(vector, PageSummary.class);
     }
@@ -162,7 +170,7 @@
     /**
      * returns all the descendents (as {@link PageSummary} instances) of this page (children, children's children etc).
      */
-    public List getDescendents(String pageId) throws SwizzleException, ConfluenceException {
+    public List getDescendents(String pageId) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getDescendents", pageId);
         return toList(vector, PageSummary.class);
     }
@@ -170,7 +178,7 @@
     /**
      * returns all the {@link Comment}s for this page.
      */
-    public List getComments(String pageId) throws SwizzleException, ConfluenceException {
+    public List getComments(String pageId) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getComments", pageId);
         return toList(vector, Comment.class);
     }
@@ -178,23 +186,23 @@
     /**
      * returns an individual comment.
      */
-    public Comment getComment(String commentId) throws SwizzleException, ConfluenceException {
+    public Comment getComment(String commentId) throws SwizzleConfluenceException, ConfluenceException {
         Map data = (Map) call("getComment", commentId);
-        return new Comment(data);
+        return new Comment(revert(data, Comment.FIELD_TYPES));
     }
 
     /**
      * adds a comment to the page.
      */
-    public Comment addComment(Comment comment) throws SwizzleException, ConfluenceException {
-        Map data = (Map) call("addComment", comment.toMap());
-        return new Comment(data);
+    public Comment addComment(Comment comment) throws SwizzleConfluenceException, ConfluenceException {
+        Map data = (Map) call("addComment", convert(comment));
+        return new Comment(revert(data, Comment.FIELD_TYPES));
     }
 
     /**
      * removes a comment from the page.
      */
-    public boolean removeComment(String commentId) throws SwizzleException, ConfluenceException {
+    public boolean removeComment(String commentId) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("removeComment", commentId);
         return value.booleanValue();
     }
@@ -202,83 +210,83 @@
     /**
      * add or update a page. For adding, the Page given as an argument should have space, title and content fields at a minimum. For updating, the Page given should have id, space, title, content and version fields at a minimum. The parentId field is always optional. All other fields will be ignored.
      */
-    public Page storePage(Page page) throws SwizzleException, ConfluenceException {
-        Map data = (Map) call("storePage", page.toMap());
-        return new Page(data);
+    public Page storePage(Page page) throws SwizzleConfluenceException, ConfluenceException {
+        Map data = (Map) call("storePage", convert(page));
+        return new Page(revert(data, Page.FIELD_TYPES));
     }
 
     /**
      * returns the HTML rendered content for this page. If 'content' is provided, then that is rendered as if it were the body of the page (useful for a 'preview page' function). If it's not provided, then the existing content of the page is used instead (ie useful for 'view page' function).
      */
-    public String renderContent(String spaceKey, String pageId, String content) throws SwizzleException, ConfluenceException {
+    public String renderContent(String spaceKey, String pageId, String content) throws SwizzleConfluenceException, ConfluenceException {
         return (String) call("renderContent", spaceKey, pageId, content);
     }
 
-    public String renderContent(String spaceKey, String pageId) throws SwizzleException, ConfluenceException {
+    public String renderContent(String spaceKey, String pageId) throws SwizzleConfluenceException, ConfluenceException {
         return renderContent(spaceKey, pageId, "");
     }
 
-    public String renderContent(PageSummary page) throws SwizzleException, ConfluenceException {
+    public String renderContent(PageSummary page) throws SwizzleConfluenceException, ConfluenceException {
         return renderContent(page.getSpace(), page.getId());
     }
 
     /**
      * Like the above renderContent(), but you can supply an optional hash (map, dictionary, etc) containing additional instructions for the renderer. Currently, only one such parameter is supported:
      */
-    public String renderContent(String spaceKey, String pageId, String content, Map parameters) throws SwizzleException, ConfluenceException {
+    public String renderContent(String spaceKey, String pageId, String content, Map parameters) throws SwizzleConfluenceException, ConfluenceException {
         return (String) call("renderContent", spaceKey, pageId, content, parameters);
     }
 
     /**
      * remove a page
      */
-    public void removePage(String pageId) throws SwizzleException, ConfluenceException {
+    public void removePage(String pageId) throws SwizzleConfluenceException, ConfluenceException {
         call("removePage", pageId);
     }
 
     /**
      * get information about an attachment.
      */
-    public Attachment getAttachment(String pageId, String fileName, String versionNumber) throws SwizzleException, ConfluenceException {
+    public Attachment getAttachment(String pageId, String fileName, String versionNumber) throws SwizzleConfluenceException, ConfluenceException {
         Map data = (Map) call("getAttachment", pageId, fileName, versionNumber);
-        return new Attachment(data);
+        return new Attachment(revert(data, Attachment.FIELD_TYPES));
     }
 
     /**
      * get the contents of an attachment.
      */
-    public byte[] getAttachmentData(String pageId, String fileName, String versionNumber) throws SwizzleException, ConfluenceException {
+    public byte[] getAttachmentData(String pageId, String fileName, String versionNumber) throws SwizzleConfluenceException, ConfluenceException {
         return (byte[]) call("getAttachmentData", pageId, fileName, versionNumber);
     }
 
     /**
      * add a new attachment to a content entity object. *Note that this uses a lot of memory -- about 4 times the size of the attachment.*
      */
-    public Attachment addAttachment(long contentId, Attachment attachment, byte[] attachmentData) throws SwizzleException, ConfluenceException {
-        Map data = (Map) call("addAttachment", new Long(contentId), attachment.toMap(), attachmentData);
-        return new Attachment(data);
+    public Attachment addAttachment(String pageId, Attachment attachment, byte[] attachmentData) throws SwizzleConfluenceException, ConfluenceException {
+        Map data = (Map) call("addAttachment", pageId, convert(attachment), attachmentData);
+        return new Attachment(revert(data, Attachment.FIELD_TYPES));
     }
 
     /**
      * remove an attachment from a content entity object.
      */
-    public boolean removeAttachment(String contentId, String fileName) throws SwizzleException, ConfluenceException {
-        Boolean value = (Boolean) call("removeAttachment", contentId, fileName);
+    public boolean removeAttachment(String pageId, String fileName) throws SwizzleConfluenceException, ConfluenceException {
+        Boolean value = (Boolean) call("removeAttachment", pageId, fileName);
         return value.booleanValue();
     }
 
     /**
      * move an attachment to a different content entity object and/or give it a new name.
      */
-    public boolean moveAttachment(String originalContentId, String originalName, String newContentEntityId, String newName) throws SwizzleException, ConfluenceException {
-        Boolean value = (Boolean) call("moveAttachment", originalContentId, originalName, newContentEntityId, newName);
+    public boolean moveAttachment(String originalPageId, String originalName, String newPageId, String newName) throws SwizzleConfluenceException, ConfluenceException {
+        Boolean value = (Boolean) call("moveAttachment", originalPageId, originalName, newPageId, newName);
         return value.booleanValue();
     }
 
     /**
      * returns all the {@link BlogEntrySummary} instances in the space.
      */
-    public List getBlogEntries(String spaceKey) throws SwizzleException, ConfluenceException {
+    public List getBlogEntries(String spaceKey) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getBlogEntries", spaceKey);
         return toList(vector, BlogEntrySummary.class);
     }
@@ -286,31 +294,31 @@
     /**
      * returns a single BlogEntry.
      */
-    public BlogEntry getBlogEntry(String pageId) throws SwizzleException, ConfluenceException {
+    public BlogEntry getBlogEntry(String pageId) throws SwizzleConfluenceException, ConfluenceException {
         Map data = (Map) call("getBlogEntry", pageId);
-        return new BlogEntry(data);
+        return new BlogEntry(revert(data, BlogEntry.FIELD_TYPES));
     }
 
     /**
      * add or update a blog entry. For adding, the BlogEntry given as an argument should have space, title and content fields at a minimum. For updating, the BlogEntry given should have id, space, title, content and version fields at a minimum. All other fields will be ignored.
      */
-    public BlogEntry storeBlogEntry(BlogEntry entry) throws SwizzleException, ConfluenceException {
-        Map data = (Map) call("storeBlogEntry", entry.toMap());
-        return new BlogEntry(data);
+    public BlogEntry storeBlogEntry(BlogEntry entry) throws SwizzleConfluenceException, ConfluenceException {
+        Map data = (Map) call("storeBlogEntry", convert(entry));
+        return new BlogEntry(revert(data, BlogEntry.FIELD_TYPES));
     }
 
     /**
      * Retrieves a blog post in the Space with the given spaceKey, with the title 'postTitle' and posted on the day 'dayOfMonth'.
      */
-    public BlogEntry getBlogEntryByDayAndTitle(String spaceKey, int dayOfMonth, String postTitle) throws SwizzleException, ConfluenceException {
+    public BlogEntry getBlogEntryByDayAndTitle(String spaceKey, int dayOfMonth, String postTitle) throws SwizzleConfluenceException, ConfluenceException {
         Map data = (Map) call("getBlogEntryByDayAndTitle", spaceKey, new Integer(dayOfMonth), postTitle);
-        return new BlogEntry(data);
+        return new BlogEntry(revert(data, BlogEntry.FIELD_TYPES));
     }
 
     /**
      * return a list of {@link SearchResult}s which match a given search query (including pages and other content types). This is the same as a performing a parameterised search (see below) with an empty parameter map.
      */
-    public List search(String query, int maxResults) throws SwizzleException, ConfluenceException {
+    public List search(String query, int maxResults) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("search", query, new Integer(maxResults));
         return toList(vector, SearchResult.class);
     }
@@ -318,7 +326,7 @@
     /**
      * Returns a list of {@link SearchResult}s like the previous search, but you can optionally limit your search by adding parameters to the parameter map. If you do not include a parameter, the default is used instead.
      */
-    public List search(String query, Map parameters, int maxResults) throws SwizzleException, ConfluenceException {
+    public List search(String query, Map parameters, int maxResults) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("search", query, parameters, new Integer(maxResults));
         return toList(vector, SearchResult.class);
     }
@@ -326,7 +334,7 @@
     /**
      * Returns a List of {@link Permission}s representing the permissions the current user has for this space (a list of "view", "modify", "comment" and / or "admin").
      */
-    public List getPermissions(String spaceKey) throws SwizzleException, ConfluenceException {
+    public List getPermissions(String spaceKey) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getPermissions", spaceKey);
         return toList(vector, Permission.class);
     }
@@ -334,7 +342,7 @@
     /**
      * Returns a List of {@link Permission}s representing the permissions the given user has for this space. (since 2.1.4)
      */
-    public List getPermissionsForUser(String spaceKey, String userName) throws SwizzleException, ConfluenceException {
+    public List getPermissionsForUser(String spaceKey, String userName) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getPermissionsForUser", spaceKey, userName);
         return toList(vector, Permission.class);
     }
@@ -342,7 +350,7 @@
     /**
      * Returns a List of {@link Permission}s representing the permissions set on the given page.
      */
-    public List getPagePermissions(String pageId) throws SwizzleException, ConfluenceException {
+    public List getPagePermissions(String pageId) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getPagePermissions", pageId);
         return toList(vector, Permission.class);
     }
@@ -350,7 +358,7 @@
     /**
      * returns List of the space level {@link Permission}s which may be granted. This is a list of possible permissions to use with {{addPermissionToSpace}}, below, not a list of current permissions on a Space.
      */
-    public List getSpaceLevelPermissions() throws SwizzleException, ConfluenceException {
+    public List getSpaceLevelPermissions() throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getSpaceLevelPermissions");
         return toList(vector, Permission.class);
     }
@@ -358,7 +366,7 @@
     /**
      * Give the entity named {{remoteEntityName}} (either a group or a user) the permission {{permission}} on the space with the key {{spaceKey}}.
      */
-    public boolean addPermissionToSpace(String permission, String remoteEntityName, String spaceKey) throws SwizzleException, ConfluenceException {
+    public boolean addPermissionToSpace(String permission, String remoteEntityName, String spaceKey) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("addPermissionToSpace", permission, remoteEntityName, spaceKey);
         return value.booleanValue();
     }
@@ -366,15 +374,15 @@
     /**
      * Give the entity named {{remoteEntityName}} (either a group or a user) the permissions {{permissions}} on the space with the key {{spaceKey}}.
      */
-    public boolean addPermissionsToSpace(List permissions, String remoteEntityName, String spaceKey) throws SwizzleException, ConfluenceException {
-        Boolean value = (Boolean) call("addPermissionsToSpace", permissions.toArray(), remoteEntityName, spaceKey);
+    public boolean addPermissionsToSpace(List permissions, String remoteEntityName, String spaceKey) throws SwizzleConfluenceException, ConfluenceException {
+        Boolean value = (Boolean) call("addPermissionsToSpace", toArray(permissions), remoteEntityName, spaceKey);
         return value.booleanValue();
     }
 
     /**
      * Remove the permission {{permission} from the entity named {{remoteEntityName}} (either a group or a user) on the space with the key {{spaceKey}}.
      */
-    public boolean removePermissionFromSpace(String permission, String remoteEntityName, String spaceKey) throws SwizzleException, ConfluenceException {
+    public boolean removePermissionFromSpace(String permission, String remoteEntityName, String spaceKey) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("removePermissionFromSpace", permission, remoteEntityName, spaceKey);
         return value.booleanValue();
     }
@@ -382,7 +390,7 @@
     /**
      * Give anonymous users the permission {{permission}} on the space with the key {{spaceKey}}. (since 2.0)
      */
-    public boolean addAnonymousPermissionToSpace(String permission, String spaceKey) throws SwizzleException, ConfluenceException {
+    public boolean addAnonymousPermissionToSpace(String permission, String spaceKey) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("addAnonymousPermissionToSpace", permission, spaceKey);
         return value.booleanValue();
     }
@@ -390,15 +398,15 @@
     /**
      * Give anonymous users the permissions {{permissions}} on the space with the key {{spaceKey}}. (since 2.0)
      */
-    public boolean addAnonymousPermissionsToSpace(List permissions, String spaceKey) throws SwizzleException, ConfluenceException {
-        Boolean value = (Boolean) call("addAnonymousPermissionsToSpace", permissions.toArray(), spaceKey);
+    public boolean addAnonymousPermissionsToSpace(List permissions, String spaceKey) throws SwizzleConfluenceException, ConfluenceException {
+        Boolean value = (Boolean) call("addAnonymousPermissionsToSpace", toArray(permissions), spaceKey);
         return value.booleanValue();
     }
 
     /**
      * Remove the permission {{permission} from anonymous users on the space with the key {{spaceKey}}. (since 2.0)
      */
-    public boolean removeAnonymousPermissionFromSpace(String permission, String spaceKey) throws SwizzleException, ConfluenceException {
+    public boolean removeAnonymousPermissionFromSpace(String permission, String spaceKey) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("removeAnonymousPermissionFromSpace", permission, spaceKey);
         return value.booleanValue();
     }
@@ -406,7 +414,7 @@
     /**
      * Remove all the global and space level permissions for {{groupname}}.
      */
-    public boolean removeAllPermissionsForGroup(String groupname) throws SwizzleException, ConfluenceException {
+    public boolean removeAllPermissionsForGroup(String groupname) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("removeAllPermissionsForGroup", groupname);
         return value.booleanValue();
     }
@@ -414,29 +422,29 @@
     /**
      * get a single user
      */
-    public User getUser(String username) throws SwizzleException, ConfluenceException {
+    public User getUser(String username) throws SwizzleConfluenceException, ConfluenceException {
         Map data = (Map) call("getUser", username);
-        return new User(data);
+        return new User(revert(data, User.FIELD_TYPES));
     }
 
     /**
      * add a new user with the given password
      */
-    public void addUser(User user, String password) throws SwizzleException, ConfluenceException {
-        call("addUser", user.toMap(), password);
+    public void addUser(User user, String password) throws SwizzleConfluenceException, ConfluenceException {
+        call("addUser", convert(user), password);
     }
 
     /**
      * add a new group
      */
-    public void addGroup(String group) throws SwizzleException, ConfluenceException {
+    public void addGroup(String group) throws SwizzleConfluenceException, ConfluenceException {
         call("addGroup", group);
     }
 
     /**
      * get a user's current groups as a list of {@link String}s
      */
-    public List getUserGroups(String username) throws SwizzleException, ConfluenceException {
+    public List getUserGroups(String username) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getUserGroups", username);
         return Arrays.asList(vector);
     }
@@ -444,14 +452,14 @@
     /**
      * add a user to a particular group
      */
-    public void addUserToGroup(String username, String groupname) throws SwizzleException, ConfluenceException {
+    public void addUserToGroup(String username, String groupname) throws SwizzleConfluenceException, ConfluenceException {
         call("addUserToGroup", username, groupname);
     }
 
     /**
      * remove a user from a group.
      */
-    public boolean removeUserFromGroup(String username, String groupname) throws SwizzleException, ConfluenceException {
+    public boolean removeUserFromGroup(String username, String groupname) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("removeUserFromGroup", username, groupname);
         return value.booleanValue();
     }
@@ -459,7 +467,7 @@
     /**
      * delete a user.
      */
-    public boolean removeUser(String username) throws SwizzleException, ConfluenceException {
+    public boolean removeUser(String username) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("removeUser", username);
         return value.booleanValue();
     }
@@ -467,7 +475,7 @@
     /**
      * remove a group. If {{defaultGroupName}} is specified, users belonging to {{groupname}} will be added to {{defaultGroupName}}.
      */
-    public boolean removeGroup(String groupname, String defaultGroupName) throws SwizzleException, ConfluenceException {
+    public boolean removeGroup(String groupname, String defaultGroupName) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("removeGroup", groupname, defaultGroupName);
         return value.booleanValue();
     }
@@ -475,7 +483,7 @@
     /**
      * gets all groups as a list of {@link String}s
      */
-    public List getGroups() throws SwizzleException, ConfluenceException {
+    public List getGroups() throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getGroups");
         return Arrays.asList(vector);
     }
@@ -483,7 +491,7 @@
     /**
      * checks if a user exists
      */
-    public boolean hasUser(String username) throws SwizzleException, ConfluenceException {
+    public boolean hasUser(String username) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("hasUser", username);
         return value.booleanValue();
     }
@@ -491,7 +499,7 @@
     /**
      * checks if a group exists
      */
-    public boolean hasGroup(String groupname) throws SwizzleException, ConfluenceException {
+    public boolean hasGroup(String groupname) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("hasGroup", groupname);
         return value.booleanValue();
     }
@@ -499,15 +507,15 @@
     /**
      * edits the details of a user
      */
-    public boolean editUser(User remoteUser) throws SwizzleException, ConfluenceException {
-        Boolean value = (Boolean) call("editUser", remoteUser.toMap());
+    public boolean editUser(User remoteUser) throws SwizzleConfluenceException, ConfluenceException {
+        Boolean value = (Boolean) call("editUser", convert(remoteUser));
         return value.booleanValue();
     }
 
     /**
      * deactivates the specified user
      */
-    public boolean deactivateUser(String username) throws SwizzleException, ConfluenceException {
+    public boolean deactivateUser(String username) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("deactivateUser", username);
         return value.booleanValue();
     }
@@ -515,7 +523,7 @@
     /**
      * reactivates the specified user
      */
-    public boolean reactivateUser(String username) throws SwizzleException, ConfluenceException {
+    public boolean reactivateUser(String username) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("reactivateUser", username);
         return value.booleanValue();
     }
@@ -523,7 +531,7 @@
     /**
      * returns all registered users as Strings
      */
-    public List getActiveUsers(boolean viewAll) throws SwizzleException, ConfluenceException {
+    public List getActiveUsers(boolean viewAll) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getActiveUsers", new Boolean(viewAll));
         return Arrays.asList(vector);
     }
@@ -531,23 +539,23 @@
     /**
      * updates user information
      */
-    public boolean setUserInformation(UserInformation userInfo) throws SwizzleException, ConfluenceException {
-        Boolean value = (Boolean) call("setUserInformation", userInfo.toMap());
+    public boolean setUserInformation(UserInformation userInfo) throws SwizzleConfluenceException, ConfluenceException {
+        Boolean value = (Boolean) call("setUserInformation", convert(userInfo));
         return value.booleanValue();
     }
 
     /**
      * Retrieves user information
      */
-    public UserInformation getUserInformation(String username) throws SwizzleException, ConfluenceException {
+    public UserInformation getUserInformation(String username) throws SwizzleConfluenceException, ConfluenceException {
         Map data = (Map) call("getUserInformation", username);
-        return new UserInformation(data);
+        return new UserInformation(revert(data, UserInformation.FIELD_TYPES));
     }
 
     /**
      * changes the current user's password
      */
-    public boolean changeMyPassword(String oldPass, String newPass) throws SwizzleException, ConfluenceException {
+    public boolean changeMyPassword(String oldPass, String newPass) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("changeMyPassword", oldPass, newPass);
         return value.booleanValue();
     }
@@ -555,7 +563,7 @@
     /**
      * changes the specified user's password
      */
-    public boolean changeUserPassword(String username, String newPass) throws SwizzleException, ConfluenceException {
+    public boolean changeUserPassword(String username, String newPass) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("changeUserPassword", username, newPass);
         return value.booleanValue();
     }
@@ -563,7 +571,7 @@
     /**
      * Returns all {@link Label}s for the given ContentEntityObject ID
      */
-    public List getLabelsById(long objectId) throws SwizzleException, ConfluenceException {
+    public List getLabelsById(long objectId) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getLabelsById", new Long(objectId));
         return toList(vector, Label.class);
     }
@@ -571,7 +579,7 @@
     /**
      * Returns the most popular {@link Label}s for the Confluence instance, with a specified maximum number.
      */
-    public List getMostPopularLabels(int maxCount) throws SwizzleException, ConfluenceException {
+    public List getMostPopularLabels(int maxCount) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getMostPopularLabels", new Integer(maxCount));
         return toList(vector, Label.class);
     }
@@ -579,7 +587,7 @@
     /**
      * Returns the most popular {@link Label}s for the given {{spaceKey}}, with a specified maximum number of results.
      */
-    public List getMostPopularLabelsInSpace(String spaceKey, int maxCount) throws SwizzleException, ConfluenceException {
+    public List getMostPopularLabelsInSpace(String spaceKey, int maxCount) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getMostPopularLabelsInSpace", spaceKey, new Integer(maxCount));
         return toList(vector, Label.class);
     }
@@ -587,7 +595,7 @@
     /**
      * Returns the recently used {@link Label}s for the Confluence instance, with a specified maximum number of results.
      */
-    public List getRecentlyUsedLabels(int maxResults) throws SwizzleException, ConfluenceException {
+    public List getRecentlyUsedLabels(int maxResults) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getRecentlyUsedLabels", new Integer(maxResults));
         return toList(vector, Label.class);
     }
@@ -595,15 +603,15 @@
     /**
      * Returns the recently used {@link Label}s for the given {{spaceKey}}, with a specified maximum number of results.
      */
-    public List getRecentlyUsedLabelsInSpace(String spaceKey, int maxResults) throws SwizzleException, ConfluenceException {
+    public List getRecentlyUsedLabelsInSpace(String spaceKey, int maxResults) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getRecentlyUsedLabelsInSpace", spaceKey, new Integer(maxResults));
         return toList(vector, Label.class);
     }
 
     /**
-     * Returns an array of {@link Space}s that have been labelled with {{labelName}}.
+     * Returns a list of {@link Space}s that have been labeled with {{labelName}}.
      */
-    public List getSpacesWithLabel(String labelName) throws SwizzleException, ConfluenceException {
+    public List getSpacesWithLabel(String labelName) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getSpacesWithLabel", labelName);
         return toList(vector, Space.class);
     }
@@ -611,7 +619,7 @@
     /**
      * Returns the {@link Label}s related to the given label name, with a specified maximum number of results.
      */
-    public List getRelatedLabels(String labelName, int maxResults) throws SwizzleException, ConfluenceException {
+    public List getRelatedLabels(String labelName, int maxResults) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getRelatedLabels", labelName, new Integer(maxResults));
         return toList(vector, Label.class);
     }
@@ -619,7 +627,7 @@
     /**
      * Returns the {@link Label}s related to the given label name for the given {{spaceKey}}, with a specified maximum number of results.
      */
-    public List getRelatedLabelsInSpace(String labelName, String spaceKey, int maxResults) throws SwizzleException, ConfluenceException {
+    public List getRelatedLabelsInSpace(String labelName, String spaceKey, int maxResults) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getRelatedLabelsInSpace", labelName, spaceKey, new Integer(maxResults));
         return toList(vector, Label.class);
     }
@@ -627,7 +635,7 @@
     /**
      * Retrieves the {@link Label}s matching the given {{labelName}}, {{namespace}}, {{spaceKey}} or {{owner}}.
      */
-    public List getLabelsByDetail(String labelName, String namespace, String spaceKey, String owner) throws SwizzleException, ConfluenceException {
+    public List getLabelsByDetail(String labelName, String namespace, String spaceKey, String owner) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getLabelsByDetail", labelName, namespace, spaceKey, owner);
         return toList(vector, Label.class);
     }
@@ -635,7 +643,7 @@
     /**
      * Returns the content for a given label ID
      */
-    public List getLabelContentById(long labelId) throws SwizzleException, ConfluenceException {
+    public List getLabelContentById(long labelId) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getLabelContentById", new Long(labelId));
         return Arrays.asList(vector);
     }
@@ -643,7 +651,7 @@
     /**
      * Returns the content for a given label name.
      */
-    public List getLabelContentByName(String labelName) throws SwizzleException, ConfluenceException {
+    public List getLabelContentByName(String labelName) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getLabelContentByName", labelName);
         return Arrays.asList(vector);
     }
@@ -651,15 +659,15 @@
     /**
      * Returns the content for a given Label object.
      */
-    public List getLabelContentByObject(Label labelObject) throws SwizzleException, ConfluenceException {
-        Object[] vector = (Object[]) call("getLabelContentByObject", labelObject.toMap());
+    public List getLabelContentByObject(Label labelObject) throws SwizzleConfluenceException, ConfluenceException {
+        Object[] vector = (Object[]) call("getLabelContentByObject", convert(labelObject));
         return toList(vector, Label.class);
     }
 
     /**
-     * Returns all Spaces that have content labelled with {{labelName}}.
+     * Returns all Spaces that have content labeled with {{labelName}}.
      */
-    public List getSpacesContainingContentWithLabel(String labelName) throws SwizzleException, ConfluenceException {
+    public List getSpacesContainingContentWithLabel(String labelName) throws SwizzleConfluenceException, ConfluenceException {
         Object[] vector = (Object[]) call("getSpacesContainingContentWithLabel", labelName);
         return toList(vector, Space.class);
     }
@@ -667,7 +675,7 @@
     /**
      * Adds a label to the object with the given ContentEntityObject ID.
      */
-    public boolean addLabelByName(String labelName, long objectId) throws SwizzleException, ConfluenceException {
+    public boolean addLabelByName(String labelName, long objectId) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("addLabelByName", labelName, new Long(objectId));
         return value.booleanValue();
     }
@@ -675,7 +683,7 @@
     /**
      * Adds a label with the given ID to the object with the given ContentEntityObject ID.
      */
-    public boolean addLabelById(long labelId, long objectId) throws SwizzleException, ConfluenceException {
+    public boolean addLabelById(long labelId, long objectId) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("addLabelById", new Long(labelId), new Long(objectId));
         return value.booleanValue();
     }
@@ -683,15 +691,15 @@
     /**
      * Adds the given label object to the object with the given ContentEntityObject ID.
      */
-    public boolean addLabelByObject(Label labelObject, long objectId) throws SwizzleException, ConfluenceException {
-        Boolean value = (Boolean) call("addLabelByObject", labelObject.toMap(), new Long(objectId));
+    public boolean addLabelByObject(Label labelObject, long objectId) throws SwizzleConfluenceException, ConfluenceException {
+        Boolean value = (Boolean) call("addLabelByObject", convert(labelObject), new Long(objectId));
         return value.booleanValue();
     }
 
     /**
      * Adds a label to the object with the given ContentEntityObject ID.
      */
-    public boolean addLabelByNameToSpace(String labelName, String spaceKey) throws SwizzleException, ConfluenceException {
+    public boolean addLabelByNameToSpace(String labelName, String spaceKey) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("addLabelByNameToSpace", labelName, spaceKey);
         return value.booleanValue();
     }
@@ -699,7 +707,7 @@
     /**
      * Removes the given label from the object with the given ContentEntityObject ID.
      */
-    public boolean removeLabelByName(String labelName, long objectId) throws SwizzleException, ConfluenceException {
+    public boolean removeLabelByName(String labelName, long objectId) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("removeLabelByName", labelName, new Long(objectId));
         return value.booleanValue();
     }
@@ -707,7 +715,7 @@
     /**
      * Removes the label with the given ID from the object with the given ContentEntityObject ID.
      */
-    public boolean removeLabelById(long labelId, long objectId) throws SwizzleException, ConfluenceException {
+    public boolean removeLabelById(long labelId, long objectId) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("removeLabelById", new Long(labelId), new Long(objectId));
         return value.booleanValue();
     }
@@ -715,63 +723,45 @@
     /**
      * Removes the given label object from the object with the given ContentEntityObject ID.
      */
-    public boolean removeLabelByObject(Label labelObject, long objectId) throws SwizzleException, ConfluenceException {
-        Boolean value = (Boolean) call("removeLabelByObject", labelObject.toMap(), new Long(objectId));
+    public boolean removeLabelByObject(Label labelObject, long objectId) throws SwizzleConfluenceException, ConfluenceException {
+        Boolean value = (Boolean) call("removeLabelByObject", convert(labelObject), new Long(objectId));
         return value.booleanValue();
     }
 
     /**
      * Removes the given label from the given {{spaceKey}}.
      */
-    public boolean removeLabelByNameFromSpace(String labelName, String spaceKey) throws SwizzleException, ConfluenceException {
+    public boolean removeLabelByNameFromSpace(String labelName, String spaceKey) throws SwizzleConfluenceException, ConfluenceException {
         Boolean value = (Boolean) call("removeLabelByNameFromSpace", labelName, spaceKey);
         return value.booleanValue();
     }
 
-    private List toList(Object[] vector, Class type) throws SwizzleException  {
-        try {
-            List list = new ArrayList(vector.length);
-            
-            Constructor constructor = type.getConstructor(new Class[]{Map.class});
-            for (int i = 0; i < vector.length; i++) {
-                Map data = (Map) vector[i];
-                Object object = constructor.newInstance(new Object[]{data});
-                list.add(object);
-            }
-            
-            return list;
-
-        } catch (Exception e) {
-            throw new SwizzleException(e);
-        }
-    }
-
-    private Object call(String command) throws SwizzleException, ConfluenceException {
+    protected Object call(String command) throws SwizzleConfluenceException, ConfluenceException {
         Object[] args = {};
         return call(command, args);
     }
 
-    private Object call(String command, Object arg1) throws SwizzleException, ConfluenceException {
+    protected Object call(String command, Object arg1) throws SwizzleConfluenceException, ConfluenceException {
         Object[] args = {arg1};
         return call(command, args);
     }
 
-    private Object call(String command, Object arg1, Object arg2) throws SwizzleException, ConfluenceException {
+    protected Object call(String command, Object arg1, Object arg2) throws SwizzleConfluenceException, ConfluenceException {
         Object[] args = {arg1, arg2};
         return call(command, args);
     }
 
-    private Object call(String command, Object arg1, Object arg2, Object arg3) throws SwizzleException, ConfluenceException {
+    protected Object call(String command, Object arg1, Object arg2, Object arg3) throws SwizzleConfluenceException, ConfluenceException {
         Object[] args = {arg1, arg2, arg3};
         return call(command, args);
     }
 
-    private Object call(String command, Object arg1, Object arg2, Object arg3, Object arg4) throws SwizzleException, ConfluenceException {
+    protected Object call(String command, Object arg1, Object arg2, Object arg3, Object arg4) throws SwizzleConfluenceException, ConfluenceException {
         Object[] args = {arg1, arg2, arg3, arg4};
         return call(command, args);
     }
 
-    private Object call(String command, Object[] args) throws SwizzleException {
+    protected Object call(String command, Object[] args) throws SwizzleConfluenceException {
         Object[] vector;
         if (!command.equals("login")) {
             vector = new Object[args.length+1];
@@ -783,9 +773,48 @@
         try {
             return client.execute("confluence1." + command, vector);
         } catch (XmlRpcClientException e) {
-            throw new SwizzleException(e.getMessage(), e.linkedException);
+            throw new SwizzleConfluenceException(e.getMessage(), e.linkedException);
         } catch (XmlRpcException e) {
             throw new ConfluenceException(e.getMessage(), e.linkedException);
         }
     }
+
+    public void setConvertor(ObjectConvertor convertor) {
+        mapConvertor = new MapConvertor(convertor);
+    }
+    
+    protected Map convert(MapObject mo) {
+        return mapConvertor.convert(mo.toMap());
+    }
+    
+    protected Map revert(Map map, Map typeMap) throws SwizzleConversionException {
+        return mapConvertor.revert(map, typeMap);
+    }
+    
+    protected List toList(Object[] vector, Class type) throws SwizzleConversionException  {
+        try {
+            List list = new ArrayList(vector.length);
+            
+            Constructor constructor = type.getConstructor(new Class[]{Map.class});
+            for (int i = 0; i < vector.length; i++) {
+                Map data = revert((Map) vector[i], (Map)type.getField("FIELD_TYPES").get(null));
+                Object object = constructor.newInstance(new Object[]{data});
+                list.add(object);
+            }
+            
+            return list;
+
+        } catch (Exception e) {
+            throw new SwizzleConversionException(e);
+        }
+    }
+    
+    protected Object[] toArray(List list) throws SwizzleConfluenceException  {
+        Object[] array = new Object[list.size()];
+        for (int i = 0; i < list.size(); i++) {
+            MapObject mo = (MapObject)list.get(i);
+            array[i] = convert(mo);
+        }
+        return array;
+    }
 }
Index: src/main/java/org/codehaus/swizzle/confluence/ServerInfo.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/ServerInfo.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/ServerInfo.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package org.codehaus.swizzle.confluence;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -23,6 +24,24 @@
  */
 public class ServerInfo extends MapObject {
 
+    private static final String MAJOR_VERSION = "majorVersion";
+    private static final String MINOR_VERSION = "minorVersion";
+    private static final String PATCH_LEVEL = "patchLevel";
+    private static final String BUILD_ID = "buildId";
+    private static final String DEVELOPMENT_BUILD = "developmentBuild";
+    private static final String BASE_URL = "baseUrl";
+    
+    public static final Map FIELD_TYPES = new HashMap();
+
+    static {
+        FIELD_TYPES.put(MAJOR_VERSION, Integer.class);
+        FIELD_TYPES.put(MINOR_VERSION, Integer.class);
+        FIELD_TYPES.put(PATCH_LEVEL, Integer.class);
+        FIELD_TYPES.put(BUILD_ID, String.class);
+        FIELD_TYPES.put(DEVELOPMENT_BUILD, Boolean.class);
+        FIELD_TYPES.put(BASE_URL, String.class);
+    }
+    
     public ServerInfo() {
         super();
     }
@@ -35,66 +54,65 @@
      * the major version number of the Confluence instance
      */
     public int getMajorVersion() {
-        return getInt("majorVersion");
+        return getInt(MAJOR_VERSION);
     }
 
     public void setMajorVersion(int majorVersion) {
-        setInt("majorVersion", majorVersion);
+        putInt(MAJOR_VERSION, majorVersion);
     }
 
     /**
      * the minor version number of the Confluence instance
      */
     public int getMinorVersion() {
-        return getInt("minorVersion");
+        return getInt(MINOR_VERSION);
     }
 
     public void setMinorVersion(int minorVersion) {
-        setInt("minorVersion", minorVersion);
+        putInt(MINOR_VERSION, minorVersion);
     }
 
     /**
      * the patch-level of the Confluence instance
      */
     public int getPatchLevel() {
-        return getInt("patchLevel");
+        return getInt(PATCH_LEVEL);
     }
 
     public void setPatchLevel(int patchLevel) {
-        setInt("patchLevel", patchLevel);
+        putInt(PATCH_LEVEL, patchLevel);
     }
 
     /**
      * the build ID of the Confluence instance (usually a number)
      */
     public String getBuildId() {
-        return getString("buildId");
+        return (String)get(BUILD_ID);
     }
 
     public void setBuildId(String buildId) {
-        setString("buildId", buildId);
+        put(BUILD_ID, buildId);
     }
 
     /**
      * Whether the build is a developer-only release or not
      */
     public boolean isDevelopmentBuild() {
-        return getBoolean("developmentBuild");
+        return getBoolean(DEVELOPMENT_BUILD);
     }
 
     public void setDevelopmentBuild(boolean developmentBuild) {
-        setBoolean("developmentBuild", developmentBuild);
+        putBoolean(DEVELOPMENT_BUILD, developmentBuild);
     }
 
     /**
      * The base URL for the confluence instance
      */
     public String getBaseUrl() {
-        return getString("baseUrl");
+        return (String)get(BASE_URL);
     }
 
     public void setBaseUrl(String baseUrl) {
-        setString("baseUrl", baseUrl);
+        put(BASE_URL, baseUrl);
     }
-
 }
Index: src/main/java/org/codehaus/swizzle/confluence/BlogEntrySummary.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/BlogEntrySummary.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/BlogEntrySummary.java	(working copy)
@@ -17,6 +17,7 @@
 package org.codehaus.swizzle.confluence;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -37,44 +38,44 @@
      * the id of the blog entry
      */
     public String getId() {
-        return getString("id");
+        return (String)get("id");
     }
 
     public void setId(String id) {
-        setString("id", id);
+        put("id", id);
     }
 
     /**
      * the key of the space that this blog entry belongs to
      */
     public String getSpace() {
-        return getString("space");
+        return (String)get("space");
     }
 
     public void setSpace(String space) {
-        setString("space", space);
+        put("space", space);
     }
 
     /**
      * the title of the blog entry
      */
     public String getTitle() {
-        return getString("title");
+        return (String)get("title");
     }
 
     public void setTitle(String title) {
-        setString("title", title);
+        put("title", title);
     }
 
     /**
      * the url to view this blog entry online
      */
     public String getUrl() {
-        return getString("url");
+        return (String)get("url");
     }
 
     public void setUrl(String url) {
-        setString("url", url);
+        put("url", url);
     }
 
     /**
@@ -85,18 +86,28 @@
     }
 
     public void setLocks(int locks) {
-        setInt("locks", locks);
+        putInt("locks", locks);
     }
 
     /**
      * the date the blog post was published
      */
     public Date getPublishDate() {
-        return getDate("publishDate");
+        return (Date)get("publishDate");
     }
 
     public void setPublishDate(Date publishDate) {
-        setDate("publishDate", publishDate);
+        put("publishDate", publishDate);
     }
-
+    
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put("id", String.class);
+        FIELD_TYPES.put("space", String.class);
+        FIELD_TYPES.put("title", String.class);
+        FIELD_TYPES.put("url", String.class);
+        FIELD_TYPES.put("locks", Integer.class);
+        FIELD_TYPES.put("publishDate", Date.class);        
+    }
 }
Index: src/main/java/org/codehaus/swizzle/confluence/UserInformation.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/UserInformation.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/UserInformation.java	(working copy)
@@ -17,6 +17,7 @@
 package org.codehaus.swizzle.confluence;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -36,44 +37,44 @@
      * the username of this user
      */
     public String getUsername() {
-        return getString("username");
+        return (String)get("username");
     }
 
     public void setUsername(String username) {
-        setString("username", username);
+        put("username", username);
     }
 
     /**
      * the user description
      */
     public String getContent() {
-        return getString("content");
+        return (String)get("content");
     }
 
     public void setContent(String content) {
-        setString("content", content);
+        put("content", content);
     }
 
     /**
      * the creator of the user
      */
     public String getCreatorName() {
-        return getString("creatorName");
+        return (String)get("creatorName");
     }
 
     public void setCreatorName(String creatorName) {
-        setString("creatorName", creatorName);
+        put("creatorName", creatorName);
     }
 
     /**
      * the url to view this user online
      */
     public String getLastModifierName() {
-        return getString("lastModifierName");
+        return (String)get("lastModifierName");
     }
 
     public void setLastModifierName(String lastModifierName) {
-        setString("lastModifierName", lastModifierName);
+        put("lastModifierName", lastModifierName);
     }
 
     /**
@@ -84,39 +85,52 @@
     }
 
     public void setVersion(int version) {
-        setInt("version", version);
+        putInt("version", version);
     }
 
     /**
      * the ID of the user
      */
     public String getId() {
-        return getString("id");
+        return (String)get("id");
     }
 
     public void setId(String id) {
-        setString("id", id);
+        put("id", id);
     }
 
     /**
      * the date the user was created
      */
     public Date getCreationDate() {
-        return getDate("creationDate");
+        return (Date)get("creationDate");
     }
 
     public void setCreationDate(Date creationDate) {
-        setDate("creationDate", creationDate);
+        put("creationDate", creationDate);
     }
 
     /**
      * the date the user was last modified
      */
     public Date getLastModificationDate() {
-        return getDate("lastModificationDate");
+        return (Date)get("lastModificationDate");
     }
 
     public void setLastModificationDate(Date lastModificationDate) {
-        setDate("lastModificationDate", lastModificationDate);
+        put("lastModificationDate", lastModificationDate);
     }
+    
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put("username", String.class);
+        FIELD_TYPES.put("content", String.class);
+        FIELD_TYPES.put("creatorName", String.class);
+        FIELD_TYPES.put("lastModifierName", String.class);
+        FIELD_TYPES.put("version", Integer.class);
+        FIELD_TYPES.put("id", String.class);
+        FIELD_TYPES.put("creationDate", Date.class);
+        FIELD_TYPES.put("lastModificationDate", Date.class);
+    }
 }
Index: src/main/java/org/codehaus/swizzle/confluence/SwizzleException.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/SwizzleException.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/SwizzleException.java	(working copy)
@@ -1,27 +0,0 @@
-package org.codehaus.swizzle.confluence;
-
-/**
- * This is the exception thrown by the Swizzle to signal errors.
- * Errors that occurred on the server are indicated by throwing a
- * {@link org.codehaus.swizzle.confluence.ConfluenceException},
- * which is a subclass of SwizzleException.
- */
-public class SwizzleException extends Exception {
-    private static final long serialVersionUID = 4697548022557085636L;
-
-    public SwizzleException() {
-        super();
-    }
-
-    public SwizzleException(String message) {
-        super(message);
-    }
-
-    public SwizzleException(Throwable cause) {
-        super(cause);
-    }
-
-    public SwizzleException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
Index: src/main/java/org/codehaus/swizzle/confluence/Permission.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/Permission.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/Permission.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package org.codehaus.swizzle.confluence;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -36,22 +37,28 @@
      * The type of permission. One of 'View' or 'Edit'
      */
     public String getLockType() {
-        return getString("lockType");
+        return (String)get("lockType");
     }
 
     public void setLockType(String lockType) {
-        setString("lockType", lockType);
+        put("lockType", lockType);
     }
 
     /**
      * The user or group name of the permission's owner
      */
     public String getLockedBy() {
-        return getString("lockedBy");
+        return (String)get("lockedBy");
     }
 
     public void setLockedBy(String lockedBy) {
-        setString("lockedBy", lockedBy);
+        put("lockedBy", lockedBy);
     }
 
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put("lockType", String.class);
+        FIELD_TYPES.put("lockedBy", String.class);
+    }
 }
Index: src/main/java/org/codehaus/swizzle/confluence/Attachment.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/Attachment.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/Attachment.java	(working copy)
@@ -17,17 +17,53 @@
 package org.codehaus.swizzle.confluence;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
+ * Represents an Attachment as described in the <a href="Confluence specification">
+ * http://confluence.atlassian.com/display/DOC/Remote+API+Specification</a>.
+ * 
  * @version $Revision$ $Date$
  */
 public class Attachment extends MapObject {
 
+    private static final String ID = "id";
+    private static final String PAGE_ID = "pageId";
+    private static final String TITLE = "title";
+    private static final String FILE_NAME = "fileName";
+    private static final String FILE_SIZE = "fileSize";
+    private static final String CONTENT_TYPE = "contentType";
+    private static final String CREATED = "created";
+    private static final String CREATOR = "creator";
+    private static final String URL = "url";
+    private static final String COMMENT = "comment";
+
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put(ID, String.class);
+        FIELD_TYPES.put(PAGE_ID, String.class);
+        FIELD_TYPES.put(TITLE, String.class);
+        FIELD_TYPES.put(FILE_NAME, String.class);
+        FIELD_TYPES.put(FILE_SIZE, Integer.class); // spec says string (spec is stupid)
+        FIELD_TYPES.put(CONTENT_TYPE, String.class);
+        FIELD_TYPES.put(CREATED, Date.class);
+        FIELD_TYPES.put(CREATOR, String.class);
+        FIELD_TYPES.put(URL, String.class);
+        FIELD_TYPES.put(COMMENT, String.class);
+    }
+    
+    /**
+     * Creates an Attachment with none of its fields set.
+     */
     public Attachment() {
         super();
     }
     
+    /**
+     * @param data A Map<String,Object> used to initialize the Attachment.
+     */
     public Attachment(Map data) {
         super(data);
     }
@@ -37,110 +73,123 @@
      * numeric id of the attachment
      */
     public String getId() {
-        return getString("id");
+        return (String)get(ID);
     }
 
     public void setId(String id) {
-        setString("id", id);
+        put(ID, id);
     }
 
     /**
      * page ID of the attachment
      */
+    
     public String getPageId() {
-        return getString("pageId");
+        return (String)get(PAGE_ID);
     }
 
     public void setPageId(String pageId) {
-        setString("pageId", pageId);
+        put(PAGE_ID, pageId);
     }
 
     /**
-     * title of the attachment
+     * @return the title of the attachment
      */
     public String getTitle() {
-        return getString("title");
+        return (String)get(TITLE);
     }
 
     public void setTitle(String title) {
-        setString("title", title);
+        put(TITLE, title);
     }
 
     /**
-     * file name of the attachment {color:#cc3300}(Required){color}
+     * @return The file name of the attachment.
      */
     public String getFileName() {
-        return getString("fileName");
+        return (String)get(FILE_NAME);
     }
 
+    /**
+     * @param fileName The file name of the attachment {color:#cc3300}(Required){color}.
+     * For example "picture.jpg".
+     */
     public void setFileName(String fileName) {
-        setString("fileName", fileName);
+        put(FILE_NAME, fileName);
     }
 
     /**
-     * numeric file size of the attachment in bytes
+     * @return the size of the attachment in bytes
      */
-    public String getFileSize() {
-        return getString("fileSize");
+    public int getFileSize() {
+        return getInt(FILE_SIZE);
     }
 
-    public void setFileSize(String fileSize) {
-        setString("fileSize", fileSize);
+    /**
+     * @param fileSize the size of the attachment in bytes (encoded as a String)
+     * Confluence expects this number encoded as a String and swizzle takes care of the encoding.
+     */
+    public void setFileSize(int fileSize) {
+        putInt(FILE_SIZE, fileSize);
     }
 
     /**
-     * mime content type of the attachment {color:#cc0000}(Required){color}
+     * @return the MIME content type of the attachment.
      */
     public String getContentType() {
-        return getString("contentType");
+        return (String)get(CONTENT_TYPE);
     }
 
+    /**
+     * @param contentType the MIME content type of the attachment.
+     * {color:#cc0000}Required{color} by Confluence.
+     * Ignored by XWiki which computes the content type from the file extension. 
+     */
     public void setContentType(String contentType) {
-        setString("contentType", contentType);
+        put(CONTENT_TYPE, contentType);
     }
 
     /**
-     * creation date of the attachment
+     * @return the creation date of the attachment
      */
     public Date getCreated() {
-        return getDate("created");
+        return (Date)get(CREATED);
     }
 
     public void setCreated(Date created) {
-        setDate("created", created);
+        put(CREATED, created);
     }
 
     /**
-     * creator of the attachment
+     * @return the name of the user that created of the attachment
      */
     public String getCreator() {
-        return getString("creator");
+        return (String)get(CREATOR);
     }
 
     public void setCreator(String creator) {
-        setString("creator", creator);
+        put(CREATOR, creator);
     }
 
     /**
-     * url to download the attachment online
+     * @return the url to download the attachment
      */
     public String getUrl() {
-        return getString("url");
+        return (String)get(URL);
     }
 
     public void setUrl(String url) {
-        setString("url", url);
+        put(URL, url);
     }
 
     /**
-     * comment for the attachment {color:#cc3300}(Required){color}
+     * @return comment for the attachment {color:#cc3300}(Required){color}
      */
     public String getComment() {
-        return getString("comment");
+        return (String)get(COMMENT);
     }
 
     public void setComment(String comment) {
-        setString("comment", comment);
+        put(COMMENT, comment);
     }
-
 }
Index: src/main/java/org/codehaus/swizzle/confluence/PageSummary.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/PageSummary.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/PageSummary.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package org.codehaus.swizzle.confluence;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -23,6 +24,26 @@
  */
 public class PageSummary extends MapObject {
 
+    protected static final String ID = "id";
+    protected static final String SPACE = "space";
+    protected static final String PARENT_ID = "parentId";
+    protected static final String TITLE = "title";
+    protected static final String URL = "url";
+    protected static final String LOCKS = "locks";
+    protected static final String PERMISSIONS = "permissions"; // not documented!
+
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put(ID, String.class);
+        FIELD_TYPES.put(SPACE, String.class);
+        FIELD_TYPES.put(PARENT_ID, String.class);
+        FIELD_TYPES.put(TITLE, String.class);
+        FIELD_TYPES.put(URL, String.class);
+        FIELD_TYPES.put(LOCKS, Integer.class);
+        FIELD_TYPES.put(PERMISSIONS, Integer.class); // not documented!
+    }
+    
     public PageSummary() {
         super();
     }
@@ -36,66 +57,65 @@
      * the id of the page
      */
     public String getId() {
-        return getString("id");
+        return (String)get(ID);
     }
 
     public void setId(String id) {
-        setString("id", id);
+        put(ID, id);
     }
 
     /**
      * the key of the space that this page belongs to
      */
     public String getSpace() {
-        return getString("space");
+        return (String)get(SPACE);
     }
 
     public void setSpace(String space) {
-        setString("space", space);
+        put(SPACE, space);
     }
 
     /**
      * the id of the parent page
      */
     public String getParentId() {
-        return getString("parentId");
+        return (String)get(PARENT_ID);
     }
 
     public void setParentId(String parentId) {
-        setString("parentId", parentId);
+        put(PARENT_ID, parentId);
     }
 
     /**
      * the title of the page
      */
     public String getTitle() {
-        return getString("title");
+        return (String)get(TITLE);
     }
 
     public void setTitle(String title) {
-        setString("title", title);
+        put(TITLE, title);
     }
 
     /**
      * the url to view this page online
      */
     public String getUrl() {
-        return getString("url");
+        return (String)get(URL);
     }
 
     public void setUrl(String url) {
-        setString("url", url);
+        put(URL, url);
     }
 
     /**
      * the number of locks current on this page
      */
     public int getLocks() {
-        return getInt("locks");
+        return getInt(LOCKS);
     }
 
     public void setLocks(int locks) {
-        setInt("locks", locks);
+        putInt(LOCKS, locks);
     }
-
 }
Index: src/main/java/org/codehaus/swizzle/confluence/RSSFeed.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/RSSFeed.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/RSSFeed.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package org.codehaus.swizzle.confluence;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -36,22 +37,28 @@
      * the URL of the RSS feed
      */
     public String getUrl() {
-        return getString("url");
+        return (String)get("url");
     }
 
     public void setUrl(String url) {
-        setString("url", url);
+        put("url", url);
     }
 
     /**
      * the feed's title
      */
     public String getTitle() {
-        return getString("title");
+        return (String)get("title");
     }
 
     public void setTitle(String title) {
-        setString("title", title);
+        put("title", title);
     }
 
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put("url", String.class);
+        FIELD_TYPES.put("title", String.class);
+    }
 }
Index: src/main/java/org/codehaus/swizzle/confluence/Space.java
===================================================================
--- src/main/java/org/codehaus/swizzle/confluence/Space.java	(revision 153)
+++ src/main/java/org/codehaus/swizzle/confluence/Space.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package org.codehaus.swizzle.confluence;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -35,55 +36,76 @@
      * the space key
      */
     public String getKey() {
-        return getString("key");
+        return (String)get("key");
     }
 
     public void setKey(String key) {
-        setString("key", key);
+        put("key", key);
     }
 
     /**
      * the name of the space
      */
     public String getName() {
-        return getString("name");
+        return (String)get("name");
     }
 
     public void setName(String name) {
-        setString("name", name);
+        put("name", name);
     }
+    
+    /**
+     * type of the space (not documented) 
+     */
+    public String getType() {
+        return (String)get("type");
+    }
 
+    public void setType(String type) {
+        put("type", type);
+    }
+
     /**
      * the url to view this space online
      */
     public String getUrl() {
-        return getString("url");
+        return (String)get("url");
     }
 
     public void setUrl(String url) {
-        setString("url", url);
+        put("url", url);
     }
 
     /**
      * the id of the space homepage
      */
     public String getHomepage() {
-        return getString("homepage");
+        return (String)get("homePage");
     }
 
     public void setHomepage(String homepage) {
-        setString("homepage", homepage);
+        put("homePage", homepage);
     }
 
     /**
      * the HTML rendered space description
      */
     public String getDescription() {
-        return getString("description");
+        return (String)get("description");
     }
 
     public void setDescription(String description) {
-        setString("description", description);
+        put("description", description);
     }
 
+    public static final Map FIELD_TYPES = new HashMap();
+    
+    static {
+        FIELD_TYPES.put("key", String.class);
+        FIELD_TYPES.put("name", String.class);
+        FIELD_TYPES.put("type", String.class);
+        FIELD_TYPES.put("url", String.class);
+        FIELD_TYPES.put("homePage", String.class); // badly documented
+        FIELD_TYPES.put("description", String.class);
+    }
 }
