Index: swizzle-jira/src/main/java/org/codehaus/swizzle/jira/MapObject.java
===================================================================
--- swizzle-jira/src/main/java/org/codehaus/swizzle/jira/MapObject.java	(revision 153)
+++ swizzle-jira/src/main/java/org/codehaus/swizzle/jira/MapObject.java	(working copy)
@@ -17,20 +17,19 @@
 package org.codehaus.swizzle.jira;
 
 import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.Map;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.net.URL;
-import java.net.MalformedURLException;
 
 /**
  * @version $Revision$ $Date$
@@ -158,6 +157,9 @@
             fields.put(key, mapObject);
             return mapObject;
         } catch (Exception e) {
+            // TODO Q: Turn this into a SwizzleJiraException ?
+            // Or use a SwizzleRuntime exception
+            // -- but then that could be used in many other places as well 
             throw new RuntimeException(e);
         }
     }
@@ -195,7 +197,7 @@
         fields.put(key, objects);
     }
 
-    protected List toList(Object[] vector, Class type) throws Exception {
+    protected List toList(Object[] vector, Class type) throws SwizzleJiraException {
         List list = new MapObjectList(vector.length);
 
         for (int i = 0; i < vector.length; i++) {
@@ -206,22 +208,26 @@
         return list;
     }
 
-    private MapObject createMapObject(Class type, Object value) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
-        Constructor constructor = type.getConstructor(new Class[]{Map.class});
-        Map data;
-
-        Object idField = xmlrpcRefs.get(type);
-        if (idField != null && !(value instanceof Map)){
-            data = new HashMap();
-            data.put(idField, value);
-        } else if (value instanceof Map) {
-            data = (Map) value;
-        } else {
-            throw new RuntimeException("Cannot create a "+type.getName()+" from '" + value+"'");
+    private MapObject createMapObject(Class type, Object value) throws SwizzleJiraException  {
+        try {
+            Constructor constructor = type.getConstructor(new Class[]{Map.class});
+            Map data;
+    
+            Object idField = xmlrpcRefs.get(type);
+            if (idField != null && !(value instanceof Map)){
+                data = new HashMap();
+                data.put(idField, value);
+            } else if (value instanceof Map) {
+                data = (Map) value;
+            } else {
+                throw new RuntimeException("Cannot create a "+type.getName()+" from '" + value+"'");
+            }
+    
+            Object object = constructor.newInstance(new Object[]{data});
+            return (MapObject) object;
+        } catch (Exception e) {
+            throw new SwizzleJiraException(e);
         }
-
-        Object object = constructor.newInstance(new Object[]{data});
-        return (MapObject) object;
     }
 
     public Map toMap() {
Index: swizzle-jira/src/main/java/org/codehaus/swizzle/jira/JiraException.java
===================================================================
--- swizzle-jira/src/main/java/org/codehaus/swizzle/jira/JiraException.java	(revision 0)
+++ swizzle-jira/src/main/java/org/codehaus/swizzle/jira/JiraException.java	(revision 0)
@@ -0,0 +1,28 @@
+package org.codehaus.swizzle.jira;
+
+/**
+ * This exception is thrown to signal an error on the server. 
+ * Sometimes the original cause of the error is also transmitted 
+ * and can be obtained by calling the getCause method
+ * (otherwise getCause will return null).
+ */
+public class JiraException extends SwizzleJiraException {
+    private static final long serialVersionUID = 3275473944957354966L;
+
+    public JiraException() {
+        super();
+    }
+
+    public JiraException(String message) {
+        super(message);
+    }
+    
+    public JiraException(Throwable cause) {
+        super(cause);
+    }
+
+    public JiraException(String message, Throwable cause)
+    {
+        super(message, cause);
+    }
+}
Index: swizzle-jira/src/main/java/org/codehaus/swizzle/jira/ProjectFiller.java
===================================================================
--- swizzle-jira/src/main/java/org/codehaus/swizzle/jira/ProjectFiller.java	(revision 153)
+++ swizzle-jira/src/main/java/org/codehaus/swizzle/jira/ProjectFiller.java	(working copy)
@@ -31,14 +31,14 @@
         this.enabled = enabled;
     }
 
-    public void fill(Issue issue){
+    public void fill(Issue issue) throws SwizzleJiraException, JiraException {
         if (!enabled){
             return;
         }
         fill(issue.getProject());
     }
 
-    public void fill(Project dest) {
+    public void fill(Project dest) throws SwizzleJiraException, JiraException {
         Project source = jira.getProject(dest.getKey());
         if (source == null) source = jira.getProject(dest.getId());
         dest.merge(source);
Index: swizzle-jira/src/main/java/org/codehaus/swizzle/jira/AttachmentsFiller.java
===================================================================
--- swizzle-jira/src/main/java/org/codehaus/swizzle/jira/AttachmentsFiller.java	(revision 153)
+++ swizzle-jira/src/main/java/org/codehaus/swizzle/jira/AttachmentsFiller.java	(working copy)
@@ -44,7 +44,7 @@
         this.enabled = enabled;
     }
 
-    public void fill(final Issue issue) {
+    public void fill(final Issue issue) throws SwizzleJiraException, JiraException {
         if (!enabled){
             return;
         }
@@ -55,7 +55,7 @@
         getAttachments(baseUrlString, issue);
     }
 
-    public static List fill(JiraRss jiraRss) throws Exception {
+    public static List fill(JiraRss jiraRss) {
         AttachmentsFiller filler = new AttachmentsFiller(null);
         List issues = jiraRss.getIssues();
         for (int i = 0; i < issues.size(); i++) {
@@ -67,6 +67,7 @@
         return issues;
     }
 
+    // TODO do proper exception handling; no output at least
     private void getAttachments(String baseUrlString, final Issue issue) {
         try {
             final List attachments = new ArrayList();
Index: swizzle-jira/src/main/java/org/codehaus/swizzle/jira/JiraRss.java
===================================================================
--- swizzle-jira/src/main/java/org/codehaus/swizzle/jira/JiraRss.java	(revision 153)
+++ swizzle-jira/src/main/java/org/codehaus/swizzle/jira/JiraRss.java	(working copy)
@@ -16,21 +16,23 @@
  */
 package org.codehaus.swizzle.jira;
 
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.parsers.SAXParser;
-import java.util.Map;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.EmptyStackException;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Stack;
-import java.util.EmptyStackException;
-import java.net.URL;
-import java.io.InputStream;
-import java.lang.reflect.Method;
-import java.lang.reflect.Constructor;
 
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
 /**
  * @version $Revision$ $Date$
  */
@@ -43,26 +45,27 @@
     }
 
     private Map issues = new HashMap();
-    private URL url;
-
-    public JiraRss(String query) throws Exception {
+    
+    public JiraRss(String query) throws SwizzleJiraException, IOException {
         this(new URL(query));
     }
 
-    public JiraRss(URL url) throws Exception {
+    public JiraRss(URL url) throws SwizzleJiraException, IOException {
         this(url.openStream());
-        this.url = url;
     }
 
-    public JiraRss(InputStream in) throws Exception {
-        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
-        SAXParser saxParser = saxParserFactory.newSAXParser();
-        ObjectBuilder objectBuilder = new ObjectBuilder();
+    public JiraRss(InputStream in) throws SwizzleJiraException {
+        ObjectBuilder objectBuilder;
+        try {
+            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
+            SAXParser saxParser = saxParserFactory.newSAXParser();
+            objectBuilder = new ObjectBuilder();
+    
+            saxParser.parse(in, objectBuilder);
+        } catch (Exception e) {
+            throw new SwizzleJiraException(e);
+        }
 
-
-        saxParser.parse(in, objectBuilder);
-
-
         List list = objectBuilder.getIssues();
         for (int i = 0; i < list.size(); i++) {
             Issue issue = (Issue) list.get(i);
@@ -102,21 +105,29 @@
         }
     }
 
-    public List fillVotes() throws Exception {
-        ClassLoader classLoader = this.getClass().getClassLoader();
-        Class clazz = classLoader.loadClass("org.codehaus.swizzle.jira.VotersFiller");
-        Method fill = clazz.getMethod("fill", new Class[]{JiraRss.class});
-        return (List) fill.invoke(null, new Object[]{this});
+    public List fillVotes() throws SwizzleJiraException {
+        try {
+            ClassLoader classLoader = this.getClass().getClassLoader();
+            Class clazz = classLoader.loadClass("org.codehaus.swizzle.jira.VotersFiller");
+            Method fill = clazz.getMethod("fill", new Class[]{JiraRss.class});
+            return (List) fill.invoke(null, new Object[]{this});
+        } catch (Exception e) {
+            throw new SwizzleJiraException(e);
+        }
     }
 
-    public List fillSubTasks() throws Exception {
-        ClassLoader classLoader = this.getClass().getClassLoader();
-        Class clazz = classLoader.loadClass("org.codehaus.swizzle.jira.SubTasksFiller");
-        Method fill = clazz.getMethod("fill", new Class[]{JiraRss.class});
-        return (List) fill.invoke(null, new Object[]{this});
+    public List fillSubTasks() throws SwizzleJiraException {
+        try {
+            ClassLoader classLoader = this.getClass().getClassLoader();
+            Class clazz = classLoader.loadClass("org.codehaus.swizzle.jira.SubTasksFiller");
+            Method fill = clazz.getMethod("fill", new Class[]{JiraRss.class});
+            return (List) fill.invoke(null, new Object[]{this});
+        } catch (Exception e) {
+            throw new SwizzleJiraException(e);
+        }
     }
 
-    public List fillAttachments() throws Exception {
+    public List fillAttachments() {
         autofill("attachments");
         return getIssues();
     }
Index: swizzle-jira/src/main/java/org/codehaus/swizzle/jira/VotersFiller.java
===================================================================
--- swizzle-jira/src/main/java/org/codehaus/swizzle/jira/VotersFiller.java	(revision 153)
+++ swizzle-jira/src/main/java/org/codehaus/swizzle/jira/VotersFiller.java	(working copy)
@@ -42,7 +42,7 @@
         this.enabled = enabled;
     }
 
-    public void fill(final Issue issue) {
+    public void fill(final Issue issue) throws SwizzleJiraException, JiraException {
         if (!enabled){
             return;
         }
@@ -53,7 +53,7 @@
         getVotes(baseUrlString, issue);
     }
 
-    public static List fill(JiraRss jiraRss) throws Exception {
+    public static List fill(JiraRss jiraRss) {
         VotersFiller filler = new VotersFiller(null);
         List issues = jiraRss.getIssues();
         for (int i = 0; i < issues.size(); i++) {
Index: swizzle-jira/src/main/java/org/codehaus/swizzle/jira/CommentsFiller.java
===================================================================
--- swizzle-jira/src/main/java/org/codehaus/swizzle/jira/CommentsFiller.java	(revision 153)
+++ swizzle-jira/src/main/java/org/codehaus/swizzle/jira/CommentsFiller.java	(working copy)
@@ -17,8 +17,6 @@
 package org.codehaus.swizzle.jira;
 
 import java.util.List;
-import java.net.URL;
-import java.net.MalformedURLException;
 
 /**
  * @version $Revision$ $Date$
@@ -35,7 +33,7 @@
         this.enabled = enabled;
     }
 
-    public void fill(Issue issue){
+    public void fill(Issue issue) throws SwizzleJiraException, JiraException {
         if (!enabled){
             return;
         }
Index: swizzle-jira/src/main/java/org/codehaus/swizzle/jira/Jira.java
===================================================================
--- swizzle-jira/src/main/java/org/codehaus/swizzle/jira/Jira.java	(revision 153)
+++ swizzle-jira/src/main/java/org/codehaus/swizzle/jira/Jira.java	(working copy)
@@ -16,22 +16,22 @@
  */
 package org.codehaus.swizzle.jira;
 
-import org.apache.xmlrpc.client.XmlRpcClient;
-import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
-import org.apache.xmlrpc.XmlRpcException;
-
-import java.io.IOException;
 import java.lang.reflect.Constructor;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.client.XmlRpcClient;
+import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
+import org.apache.xmlrpc.client.XmlRpcClientException;
+
 /**
  * @version $Revision$ $Date$
  */
@@ -83,6 +83,8 @@
         autofillProviders.put("subtasks", "org.codehaus.swizzle.jira.SubTasksFiller");
         autofillProviders.put("attachments", "org.codehaus.swizzle.jira.AttachmentsFiller");
         autofillProviders.put("comments", "org.codehaus.swizzle.jira.CommentsFiller");
+        
+        token = ""; // empty token allows anonymous access
     }
 
     /**
@@ -91,13 +93,13 @@
      * @param scheme
      * @param enabled
      */
-    public void autofill(String scheme, boolean enabled){
+    public void autofill(String scheme, boolean enabled) {
         if (!autofillProviders.containsKey(scheme)) {
             throw new UnsupportedOperationException("Autofill Scheme not supported: "+scheme);
         }
 
         IssueFiller filler = (IssueFiller) issueFillers.get(scheme);
-        if (filler == null){
+        if (filler == null) {
             try {
                 ClassLoader classLoader = this.getClass().getClassLoader();
                 Class clazz = classLoader.loadClass((String) autofillProviders.get(scheme));
@@ -115,14 +117,15 @@
     /**
      * Logs the user into JIRA
      */
-    public void login(String username, String password) throws Exception {
+    public void login(String username, String password) throws SwizzleJiraException, JiraException {
+        cache.clear();
         token = (String) call("login", username, password);
     }
 
     /**
      * remove this token from the list of logged in tokens.
      */
-    public boolean logout() throws Exception {
+    public boolean logout() throws SwizzleJiraException, JiraException {
         cache.clear();
         Boolean value = (Boolean) call("logout");
         return value.booleanValue();
@@ -131,11 +134,11 @@
     /**
      * List<{@link Comment}>:  Returns all comments associated with the issue
      */
-    public List getComments(String issueKey) {
+    public List getComments(String issueKey) throws SwizzleJiraException, JiraException {
         return cachedList(new Call("getComments", issueKey), Comment.class);
     }
 
-    public List getComments(Issue issue) {
+    public List getComments(Issue issue) throws SwizzleJiraException, JiraException {
         return getComments(issue.getKey());
     }
     
@@ -143,7 +146,7 @@
      * Adds a comment to an issue
      * TODO: If someone adds a comment to an issue, we should account for that in our caching
      */
-    public boolean addComment(String issueKey, String comment) throws Exception {
+    public boolean addComment(String issueKey, String comment) throws SwizzleJiraException, JiraException {
         Boolean value = (Boolean) call("getComments", issueKey, comment);
         return value.booleanValue();
     }
@@ -152,7 +155,7 @@
      * Creates an issue in JIRA
      * TODO: If someone creates an issue, we should account for that in our caching
      */
-    public Issue createIssue(Issue issue) throws Exception {
+    public Issue createIssue(Issue issue) throws SwizzleJiraException, JiraException {
         Map data = (Map) call("createIssue", issue.toMap());
         return (autofill)? fill(new Issue(data)):new Issue(data);
     }
@@ -161,7 +164,7 @@
      * Updates an issue in JIRA from a HashMap object
      * TODO: If someone updates an issue, we should account for that in our caching
      */
-    public Issue updateIssue(String issueKey, Issue issue) throws Exception {
+    public Issue updateIssue(String issueKey, Issue issue) throws SwizzleJiraException, JiraException {
         Map data = (Map) call("updateIssue", issueKey, issue.toMap());
         return (autofill)? fill(new Issue(data)):new Issue(data);
     }
@@ -170,18 +173,18 @@
     /**
      * Gets an issue from a given issue key.
      */
-    public Issue getIssue(String issueKey) {
+    public Issue getIssue(String issueKey) throws SwizzleJiraException, JiraException {
         return (Issue) cachedObject(new Call("getIssue", issueKey), Issue.class);
     }
 
     /**
      * List<{@link Issue}>:  Executes a saved filter
      */
-    public List getIssuesFromFilter(Filter filter) throws Exception {
+    public List getIssuesFromFilter(Filter filter) throws SwizzleJiraException, JiraException {
         return getIssuesFromFilter(filter.getId());
     }
 
-    public List getIssuesFromFilter(String filterName) throws Exception {
+    public List getIssuesFromFilter(String filterName) throws SwizzleJiraException, JiraException {
         Filter filter = getSavedFilter(filterName);
         if (filter == null){
             return toList(new Object[]{},Issue.class);
@@ -193,7 +196,7 @@
     /**
      * List<{@link Issue}>:  Executes a saved filter
      */
-    public List getIssuesFromFilter(int filterId) throws Exception {
+    public List getIssuesFromFilter(int filterId) throws SwizzleJiraException, JiraException {
         Object[] vector = (Object[]) call("getIssuesFromFilter", filterId+"");
         return toList(vector, Issue.class);
     }
@@ -201,7 +204,7 @@
     /**
      * List<{@link Issue}>:  Find issues using a free text search
      */
-    public List getIssuesFromTextSearch(String searchTerms) throws Exception {
+    public List getIssuesFromTextSearch(String searchTerms) throws SwizzleJiraException, JiraException {
         Object[] vector = (Object[]) call("getIssuesFromTextSearch", searchTerms);
         return toList(vector, Issue.class);
     }
@@ -209,7 +212,7 @@
     /**
      * List<{@link Issue}>:  Find issues using a free text search, limited to certain projects
      */
-    public List getIssuesFromTextSearchWithProject(List projectKeys, String searchTerms, int maxNumResults) throws Exception {
+    public List getIssuesFromTextSearchWithProject(List projectKeys, String searchTerms, int maxNumResults) throws SwizzleJiraException, JiraException {
         Object[] vector = (Object[]) call("getIssuesFromTextSearchWithProject", projectKeys.toArray(), searchTerms, new Integer(maxNumResults));
         return toList(vector, Issue.class);
     }
@@ -217,16 +220,16 @@
     /**
      * List<{@link IssueType}>:  Returns all visible issue types in the system
      */
-    public List getIssueTypes() {
+    public List getIssueTypes() throws SwizzleJiraException, JiraException {
         return cachedList(new Call("getIssueTypes"), IssueType.class);
     }
 
-    public IssueType getIssueType(String name) {
+    public IssueType getIssueType(String name) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getIssueTypes"), IssueType.class, "name");
         return (IssueType) objects.get(name);
     }
 
-    public IssueType getIssueType(int id) {
+    public IssueType getIssueType(int id) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getIssueTypes"), IssueType.class, "id");
         return (IssueType) objects.get(id+"");
     }
@@ -235,16 +238,16 @@
     /**
      * List<{@link Priority}>:  Returns all priorities in the system
      */
-    public List getPriorities() {
+    public List getPriorities() throws SwizzleJiraException, JiraException {
         return cachedList(new Call("getPriorities"), Priority.class);
     }
 
-    public Priority getPriority(String name) {
+    public Priority getPriority(String name) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getPriorities"), Priority.class, "name");
         return (Priority) objects.get(name);
     }
 
-    public Priority getPriority(int id) {
+    public Priority getPriority(int id) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getPriorities"), Priority.class, "id");
         return (Priority) objects.get(id + "");
     }
@@ -252,16 +255,16 @@
     /**
      * List<{@link Project}>:  Returns a list of projects available to the user
      */
-    public List getProjects() {
+    public List getProjects() throws SwizzleJiraException, JiraException {
         return cachedList(new Call("getProjects"), Project.class);
     }
 
-    public Project getProject(String key) {
+    public Project getProject(String key) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getProjects"), Project.class, "key");
         return (Project) objects.get(key);
     }
 
-    public Project getProject(int id) {
+    public Project getProject(int id) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getProjects"), Project.class, "id");
         return (Project) objects.get(id + "");
     }
@@ -269,16 +272,16 @@
     /**
      * List<{@link Resolution}>:  Returns all resolutions in the system
      */
-    public List getResolutions() {
+    public List getResolutions() throws SwizzleJiraException, JiraException {
         return cachedList(new Call("getResolutions"), Resolution.class);
     }
 
-    public Resolution getResolution(String name) {
+    public Resolution getResolution(String name) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getResolutions"), Resolution.class, "name");
         return (Resolution) objects.get(name);
     }
 
-    public Resolution getResolution(int id) {
+    public Resolution getResolution(int id) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getResolutions"), Resolution.class, "id");
         return (Resolution) objects.get(id + "");
     }
@@ -286,16 +289,16 @@
     /**
      * List<{@link Status}>:  Returns all statuses in the system
      */
-    public List getStatuses() {
+    public List getStatuses() throws SwizzleJiraException, JiraException {
         return cachedList(new Call("getStatuses"), Status.class);
     }
 
-    public Status getStatus(String name) {
+    public Status getStatus(String name) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getStatuses"), Status.class, "name");
         return (Status) objects.get(name);
     }
 
-    public Status getStatus(int id) {
+    public Status getStatus(int id) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getStatuses"), Status.class, "id");
         return (Status) objects.get(id + "");
     }
@@ -303,16 +306,16 @@
     /**
      * List<{@link Filter}>:  Gets all saved filters available for the currently logged in user
      */
-    public List getSavedFilters() {
+    public List getSavedFilters() throws SwizzleJiraException, JiraException {
         return cachedList(new Call("getSavedFilters"), Filter.class);
     }
 
-    public Filter getSavedFilter(String name) {
+    public Filter getSavedFilter(String name) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getSavedFilters"), Filter.class, "name");
         return (Filter) objects.get(name);
     }
 
-    public Filter getSavedFilter(int id) {
+    public Filter getSavedFilter(int id) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getSavedFilters"), Filter.class, "id");
         return (Filter) objects.get(id + "");
     }
@@ -320,7 +323,7 @@
     /**
      * Returns the Server information such as baseUrl, version, edition, buildDate, buildNumber.
      */
-    public ServerInfo getServerInfo() {
+    public ServerInfo getServerInfo() throws SwizzleJiraException, JiraException {
         return (ServerInfo) cachedObject(new Call("getServerInfo"), ServerInfo.class);
     }
 
@@ -329,16 +332,16 @@
      *
      * @return list of {@link IssueType}
      */
-    public List getSubTaskIssueTypes() {
+    public List getSubTaskIssueTypes() throws SwizzleJiraException, JiraException {
         return cachedList(new Call("getSubTaskIssueTypes"), IssueType.class);
     }
 
-    public IssueType getSubTaskIssueType(String name) {
+    public IssueType getSubTaskIssueType(String name) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getSubTaskIssueTypes"), IssueType.class, "name");
         return (IssueType) objects.get(name);
     }
 
-    public IssueType getSubTaskIssueType(int id) {
+    public IssueType getSubTaskIssueType(int id) throws SwizzleJiraException, JiraException {
         Map objects = cachedMap(new Call("getSubTaskIssueTypes"), IssueType.class, "id");
         return (IssueType) objects.get(id + "");
     }
@@ -347,7 +350,7 @@
     /**
      * Returns a user's information given a username
      */
-    public User getUser(String username) {
+    public User getUser(String username) throws SwizzleJiraException, JiraException {
         return (User) cachedObject(new Call("getUser", username), User.class);
     }
 
@@ -356,58 +359,58 @@
     /**
      * List<{@link Component}>:  Returns all components available in the specified project
      */
-    public List getComponents(String projectKey) {
+    public List getComponents(String projectKey) throws SwizzleJiraException, JiraException {
         return cachedList(new Call("getComponents", projectKey), Component.class);
     }
 
-    public List getComponents(Project project) {
+    public List getComponents(Project project) throws SwizzleJiraException, JiraException {
         return getComments(project.getKey());
     }
 
-    public Component getComponent(String projectKey, String name) {
+    public Component getComponent(String projectKey, String name) throws SwizzleJiraException, JiraException {
         Map components = cachedMap(new Call("getComponents", projectKey), Component.class, "name");
         return (Component) components.get(name);
     }
 
-    public Component getComponent(Project project, String name) {
+    public Component getComponent(Project project, String name) throws SwizzleJiraException, JiraException {
         return getComponent(project.getKey(), name);
     }
 
-    public Component getComponent(String projectKey, int id) {
+    public Component getComponent(String projectKey, int id) throws SwizzleJiraException, JiraException {
         Map components = cachedMap(new Call("getComponents", projectKey), Component.class, "id");
         return (Component) components.get(id+"");
     }
 
-    public Component getComponent(Project project, int id) {
+    public Component getComponent(Project project, int id) throws SwizzleJiraException, JiraException {
         return getComponent(project.getKey(), id);
     }
 
     /**
      * List<{@link Version}>:  Returns all versions available in the specified project
      */
-    public List getVersions(String projectKey) {
+    public List getVersions(String projectKey) throws SwizzleJiraException, JiraException {
         return cachedList(new Call("getVersions", projectKey), Version.class);
     }
 
-    public List getVersions(Project project) {
+    public List getVersions(Project project) throws SwizzleJiraException, JiraException {
         return getVersions(project.getKey());
     }
 
-    public Version getVersion(String projectKey, String name) {
+    public Version getVersion(String projectKey, String name) throws SwizzleJiraException, JiraException {
         Map versions = cachedMap(new Call("getVersions", projectKey), Version.class, "name");
         return (Version) versions.get(name);
     }
 
-    public Version getVersion(Project project, String name) {
+    public Version getVersion(Project project, String name) throws SwizzleJiraException, JiraException {
         return getVersion(project.getKey(), name);
     }
 
-    public Version getVersion(String projectKey, int id) {
+    public Version getVersion(String projectKey, int id) throws SwizzleJiraException, JiraException {
         Map versions = cachedMap(new Call("getVersions", projectKey), Version.class, "id");
         return (Version) versions.get(id+"");
     }
 
-    public Version getVersion(Project project, int id) {
+    public Version getVersion(Project project, int id) throws SwizzleJiraException, JiraException {
         return getVersion(project.getKey(), id);
     }
 
@@ -431,7 +434,7 @@
         return list;
     }
 
-    private void fill(Class type, Object object) {
+    private void fill(Class type, Object object) throws SwizzleJiraException, JiraException {
         if (autofill && type == Issue.class){
             fill((Issue)object);
         }
@@ -454,40 +457,46 @@
         }
     }
 
-    private Object call(String command) throws Exception {
+    private Object call(String command) throws SwizzleJiraException, JiraException {
         Object[] args = {};
         return call(command, args);
     }
 
-    private Object call(String command, Object arg1) throws Exception {
+    private Object call(String command, Object arg1) throws SwizzleJiraException, JiraException {
         Object[] args = {arg1};
         return call(command, args);
     }
 
-    private Object call(String command, Object arg1, Object arg2) throws Exception {
+    private Object call(String command, Object arg1, Object arg2) throws SwizzleJiraException, JiraException {
         Object[] args = {arg1, arg2};
         return call(command, args);
     }
 
-    private Object call(String command, Object arg1, Object arg2, Object arg3) throws Exception {
+    private Object call(String command, Object arg1, Object arg2, Object arg3) throws SwizzleJiraException, JiraException {
         Object[] args = {arg1, arg2, arg3};
         return call(command, args);
     }
 
-    private Object call(String command, Object[] args) throws XmlRpcException, IOException {
+    private Object call(String command, Object[] args) throws SwizzleJiraException, JiraException {
         Object[] vector;
-        if (token != null) {
+        if (!command.equals("login")) {
             vector = new Object[args.length+1];
             vector[0] = token;
             System.arraycopy(args, 0, vector, 1, args.length);
         } else {
             vector = args;
         }
-        return client.execute("jira1." + command, vector);
+        try {
+            return client.execute("jira1." + command, vector);
+        } catch (XmlRpcClientException e) {
+            throw new SwizzleJiraException(e.getMessage(), e.linkedException);
+        } catch (XmlRpcException e) {
+            throw new JiraException(e.getMessage(), e.linkedException);
+        }
     }
 
 
-    public Issue fill(Issue issue){
+    public Issue fill(Issue issue) throws SwizzleJiraException, JiraException {
         Collection collection = issueFillers.values();
         for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
             IssueFiller issueFiller = (IssueFiller) iterator.next();
@@ -495,29 +504,30 @@
         }
         return issue;
     }
+    
     public static class Call {
         public final String command;
         public final Object[] args;
 
-        public Call(String command){
+        public Call(String command) {
             Object[] args = {};
             this.command = command;
             this.args = args;
         }
 
-        public Call(String command, Object arg1){
+        public Call(String command, Object arg1) {
             Object[] args = {arg1};
             this.command = command;
             this.args = args;
         }
 
-        public Call(String command, Object arg1, Object arg2){
+        public Call(String command, Object arg1, Object arg2) {
             Object[] args = {arg1, arg2};
             this.command = command;
             this.args = args;
         }
 
-        public Call(String command, Object arg1, Object arg2, Object arg3){
+        public Call(String command, Object arg1, Object arg2, Object arg3) {
             Object[] args = {arg1, arg2, arg3};
             this.command = command;
             this.args = args;
@@ -549,31 +559,31 @@
 
     private Map callcache = new HashMap();
 
-    private List cachedList(Call call, Class type) {
+    private List cachedList(Call call, Class type) throws SwizzleJiraException, JiraException {
         Object result = cache(call, type);
 
         Map indexes = (Map) result;
         return (List) indexes.get(List.class);
     }
 
-    private Map cachedMap(Call call, Class type, String field) {
+    private Map cachedMap(Call call, Class type, String field) throws SwizzleJiraException, JiraException {
         Object result = cache(call, type);
 
         Map indexes = (Map) result;
         return (Map) indexes.get(field);
     }
 
-    private Object cachedObject(Call call, Class type) {
+    private Object cachedObject(Call call, Class type) throws SwizzleJiraException, JiraException {
         return cache(call, type);
     }
 
-    private Object cache(Call call, Class type) {
+    private Object cache(Call call, Class type) throws SwizzleJiraException, JiraException {
         Object object = callcache.get(call);
         if (object != null){
             return object;
         }
 
-        Object result = exec(call);
+        Object result = call(call.command, call.args);
         if (result instanceof Object[]) {
             List list = toList((Object[]) result, type);
             Map indexes = new HashMap();
@@ -597,21 +607,4 @@
         callcache.put(call, result);
         return result;
     }
-
-    private Object exec(Call call) {
-        try {
-            Object[] vector;
-            if (token != null) {
-                vector = new Object[call.args.length+1];
-                vector[0] = token;
-                System.arraycopy(call.args, 0, vector, 1, call.args.length);
-            } else {
-                vector = call.args;
-            }
-            return client.execute("jira1." + call.command, vector);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
 }
Index: swizzle-jira/src/main/java/org/codehaus/swizzle/jira/IssueFiller.java
===================================================================
--- swizzle-jira/src/main/java/org/codehaus/swizzle/jira/IssueFiller.java	(revision 153)
+++ swizzle-jira/src/main/java/org/codehaus/swizzle/jira/IssueFiller.java	(working copy)
@@ -20,6 +20,6 @@
  * @version $Revision$ $Date$
  */
 public interface IssueFiller {
-    void fill(Issue issue);
+    void fill(Issue issue) throws SwizzleJiraException, JiraException;
     void setEnabled(boolean enabled);
 }
Index: swizzle-jira/src/main/java/org/codehaus/swizzle/jira/BasicIssueFiller.java
===================================================================
--- swizzle-jira/src/main/java/org/codehaus/swizzle/jira/BasicIssueFiller.java	(revision 153)
+++ swizzle-jira/src/main/java/org/codehaus/swizzle/jira/BasicIssueFiller.java	(working copy)
@@ -35,7 +35,7 @@
         this.enabled = enabled;
     }
 
-    public void fill(Issue issue){
+    public void fill(Issue issue) throws SwizzleJiraException, JiraException {
         if (!enabled){
             return;
         }
@@ -66,23 +66,24 @@
                 URL url = new URL(serverInfo.getBaseUrl()+"/browse/"+issue.getKey());
                 issue.setLink(url.toExternalForm());
             } catch (MalformedURLException e) {
+                throw new SwizzleJiraException(e);
             }
         }
     }
 
-    public void fill(Issue issue, Version dest) {
+    public void fill(Issue issue, Version dest) throws SwizzleJiraException, JiraException {
         Version source = jira.getVersion(issue.getProject().getKey(), dest.getId());
         if (source == null) source = jira.getVersion(issue.getProject().getKey(), dest.getName());
         dest.merge(source);
     }
 
-    public void fill(Issue issue, Component dest) {
+    public void fill(Issue issue, Component dest) throws SwizzleJiraException, JiraException {
         Component source = jira.getComponent(issue.getProject().getKey(), dest.getId());
         if (source == null) source = jira.getComponent(issue.getProject().getKey(), dest.getName());
         dest.merge(source);
     }
 
-    public void fill(User dest) {
+    public void fill(User dest) throws SwizzleJiraException, JiraException {
         if (dest == null){
             return;
         }
@@ -90,7 +91,7 @@
         dest.merge(source);
     }
 
-    public void fill(Priority dest) {
+    public void fill(Priority dest) throws SwizzleJiraException, JiraException {
         if (dest == null){
             return;
         }
@@ -99,7 +100,7 @@
         dest.merge(source);
     }
 
-    public void fill(Status dest) {
+    public void fill(Status dest) throws SwizzleJiraException, JiraException {
         if (dest == null){
             return;
         }
@@ -108,7 +109,7 @@
         dest.merge(source);
     }
 
-    public void fill(Resolution dest) {
+    public void fill(Resolution dest) throws SwizzleJiraException, JiraException {
         if (dest == null){
             return;
         }
@@ -117,7 +118,7 @@
         dest.merge(source);
     }
 
-    public void fill(IssueType dest) {
+    public void fill(IssueType dest) throws SwizzleJiraException, JiraException {
         if (dest == null){
             return;
         }
Index: swizzle-jira/src/main/java/org/codehaus/swizzle/jira/IssueType.java
===================================================================
--- swizzle-jira/src/main/java/org/codehaus/swizzle/jira/IssueType.java	(revision 153)
+++ swizzle-jira/src/main/java/org/codehaus/swizzle/jira/IssueType.java	(working copy)
@@ -17,7 +17,6 @@
 package org.codehaus.swizzle.jira;
 
 import java.util.Map;
-import java.util.HashMap;
 
 /**
  * @version $Revision$ $Date$
Index: swizzle-jira/src/main/java/org/codehaus/swizzle/jira/SwizzleJiraException.java
===================================================================
--- swizzle-jira/src/main/java/org/codehaus/swizzle/jira/SwizzleJiraException.java	(revision 0)
+++ swizzle-jira/src/main/java/org/codehaus/swizzle/jira/SwizzleJiraException.java	(revision 0)
@@ -0,0 +1,27 @@
+package org.codehaus.swizzle.jira;
+
+/**
+ * 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.JiraException},
+ * which is a subclass of SwizzleJiraException.
+ */
+public class SwizzleJiraException extends Exception {
+    private static final long serialVersionUID = 4697548022557085636L;
+
+    public SwizzleJiraException() {
+        super();
+    }
+
+    public SwizzleJiraException(String message) {
+        super(message);
+    }
+
+    public SwizzleJiraException(Throwable cause) {
+        super(cause);
+    }
+
+    public SwizzleJiraException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
Index: swizzle-jira/src/main/java/org/codehaus/swizzle/jira/SubTasksFiller.java
===================================================================
--- swizzle-jira/src/main/java/org/codehaus/swizzle/jira/SubTasksFiller.java	(revision 153)
+++ swizzle-jira/src/main/java/org/codehaus/swizzle/jira/SubTasksFiller.java	(working copy)
@@ -27,6 +27,7 @@
 import java.util.Collection;
 import java.util.regex.Pattern;
 import java.util.regex.Matcher;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.io.InputStream;
 import java.io.BufferedInputStream;
@@ -47,7 +48,7 @@
         this.enabled = enabled;
     }
 
-    public void fill(final Issue issue) {
+    public void fill(final Issue issue) throws SwizzleJiraException, JiraException {
         if (!enabled){
             return;
         }
@@ -63,12 +64,8 @@
             issue.getSubTasks().add(subTask);
         }
     }
-
-    public static void main(String[] args) throws Exception {
-        JiraRss jiraRss = new JiraRss("http://jira.codehaus.org/browse/OPENEJB-90?decorator=none&view=rss");
-        fill(jiraRss);
-    }
-    public static List fill(JiraRss jiraRss) throws Exception {
+    
+    public static List fill(JiraRss jiraRss) throws SwizzleJiraException {
         SubTasksFiller filler = new SubTasksFiller(null);
         MapObjectList issues = (MapObjectList) jiraRss.getIssues();
         issues = issues.ascending("id");
@@ -91,8 +88,13 @@
                     issue.getSubTasks().add(subTask);
                     subTask.setParentTask(issue);
                 } else {
-                    URL issueRssUrl = new URL(link +"browse/"+ issueKey + "?decorator=none&view=rss");
-                    JiraRss subtaskJiraRss = new JiraRss(issueRssUrl);
+                    JiraRss subtaskJiraRss;
+                    try {
+                        URL issueRssUrl = new URL(link +"browse/"+ issueKey + "?decorator=none&view=rss");
+                        subtaskJiraRss = new JiraRss(issueRssUrl);
+                    } catch (IOException e) {
+                        throw new SwizzleJiraException(e);
+                    }
                     subTask = subtaskJiraRss.getIssue(issueKey);
                     if (subTask != null) {
                         issue.getSubTasks().add(subTask);