Merge branch 'master' of ssh://ase.cs.columbia.edu/halo

Miriam Melnick [2011-10-11 14:52:03]
Merge branch 'master' of ssh://ase.cs.columbia.edu/halo
Filename
halo-EJB/ejbModule/META-INF/persistence.xml
halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AbstractFacade.java
halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AdminService.java
halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/UserService.java
halo-auth/src/edu/columbia/cs/psl/halo/server/auth/HALOLoginModule.java
halo-ear/.project
halo-ear/.settings/org.eclipse.wst.common.component
halo-ear/EarContent/META-INF/application.xml
halo-ear/EarContent/lib-disabled/activation-1.1.jar
halo-ear/EarContent/lib-disabled/commons-logging-1.1.1.jar
halo-ear/EarContent/lib-disabled/jaxb-api-2.1.jar
halo-ear/EarContent/lib-disabled/jaxb-impl-2.1.9.jar
halo-ear/EarContent/lib-disabled/stax-api-1.0-2.jar
halo-ear/EarContent/lib/jira-soap-client-0.1.0-jar-with-dependencies.jar
halo-se-admin/META-INF/MANIFEST.MF
halo-se-admin/MyMailServer.txt
halo-se-admin/lib/halo-common.jar
halo-se-admin/plugin.xml
halo-se-admin/src/edu/columbia/cs/psl/halo/admin/UserLoader.java
halo-se-admin/src/edu/columbia/cs/psl/halo/admin/editor/TaskEditor.java
halo-se-admin/students.csv
halo-se-common/makeStubs.sh
halo-se-common/src/edu/columbia/cs/psl/halo/HALOServiceFactory.java
halo-se-common/src/edu/columbia/cs/psl/halo/entity/User.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AchievementRecord.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUser.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUserResponse.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminService.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/Assignment.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/Enrollment.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/GetLeadersStr.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/GetLeadersStrResponse.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/MarkTaskCompletedResponse.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/QuestProgress.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/UserService.java
halo-se-feature/.project
halo-se-feature/build.properties
halo-se-feature/feature.xml
halo-se-web/.classpath
halo-se-web/.project
halo-se-web/.settings/.jsdtscope
halo-se-web/.settings/org.eclipse.jdt.core.prefs
halo-se-web/.settings/org.eclipse.wst.common.component
halo-se-web/.settings/org.eclipse.wst.common.project.facet.core.xml
halo-se-web/.settings/org.eclipse.wst.jsdt.ui.superType.container
halo-se-web/.settings/org.eclipse.wst.jsdt.ui.superType.name
halo-se-web/.settings/org.eclipse.wst.ws.service.policy.prefs
halo-se-web/WebContent/META-INF/MANIFEST.MF
halo-se-web/WebContent/WEB-INF/sun-web.xml
halo-se-web/WebContent/index.jsp
halo-se-web/bin/.project
halo-se-web/build/classes/edu/columbia/cs/psl/halo/web/FacebookCallback.class
halo-se-web/src/edu/columbia/cs/psl/halo/web/FacebookCallback.java
halo-se/META-INF/MANIFEST.MF
halo-se/lib/halo-common.jar
halo-se/plugin.xml
halo-se/src/edu/columbia/cs/psl/halo/client/Activator.java
halo-se/src/edu/columbia/cs/psl/halo/client/FBTokenChecker.java
halo-se/src/edu/columbia/cs/psl/halo/client/Util.java
halo-se/src/edu/columbia/cs/psl/halo/client/fbTester.java
halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardComposite.java
halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardView.java
halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java
halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java
halo-se/src/edu/columbia/cs/psl/halo/client/views/SampleView.java
halo-se/src/edu/columbia/cs/psl/halo/client/wrapper/QuestWrapper.java
halo-update-site/.project
halo-update-site/artifacts.jar
halo-update-site/content.jar
halo-update-site/edu.columbia.cs.psl.halo.client_1.0.0.201110091459/@dot.log
halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.4.jar
halo-update-site/index.html
halo-update-site/install.html
halo-update-site/logs.zip
halo-update-site/next.jpg
halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110102242.jar
halo-update-site/select-install.png
halo-update-site/site.xml
halo-update-site/untitled.jpg
halo-update-site/update site.jpg
halo-update-site/web/site.css
halo-update-site/web/site.xsl
diff --git a/halo-EJB/ejbModule/META-INF/persistence.xml b/halo-EJB/ejbModule/META-INF/persistence.xml
index 6002b13..ad8e6b3 100644
--- a/halo-EJB/ejbModule/META-INF/persistence.xml
+++ b/halo-EJB/ejbModule/META-INF/persistence.xml
@@ -29,7 +29,7 @@
         <property name="eclipselink.create-ddl-jdbc-file-name" value="create.sql"/>
         <property name="eclipselink.ddl-generation.output-mode" value="sql-script" />
         <property name="eclipselink.ddl-generation.table-creation-suffix" value=" engine=InnoDB;" />
-  	    <property name="eclipselink.application-location" value="/Users/miriammelnick/git/halo/"/>
+  	    <property name="eclipselink.application-location" value="/Users/jon/Documents/PSL/Projects/halo-eclipse/"/>
            </properties>
      </persistence-unit>
 </persistence>
diff --git a/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AbstractFacade.java b/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AbstractFacade.java
index 350656a..c0aae32 100644
--- a/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AbstractFacade.java
+++ b/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AbstractFacade.java
@@ -74,15 +74,13 @@ public abstract class AbstractFacade<T> {
 //    	System.out.println("Req from " + ctx.getCallerPrincipal().getName());
     	if(ctx.getCallerPrincipal().getName().equalsIgnoreCase("anonymous"))
     		return null;
-    	//TODO remove this once we re-assemble the entire FB auth piece
-    	em.getEntityManagerFactory().getCache().evictAll();
+
     	Query q = getEntityManager().createQuery("select object(c) from User as c where c.email=:user");
 		q.setParameter("user", ctx.getCallerPrincipal().getName());
 		User r = null;
 		try
 		{
 		r = (User) q.getSingleResult();
-		System.out.println(r.getFacebookSessionKey());
 		r.setFBKeyFlag(r.getFacebookSessionKey() != null && !r.getFacebookSessionKey().equals(""));
 		}
 		catch(NoResultException e)
diff --git a/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AdminService.java b/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AdminService.java
index 4f6891d..3fe7399 100644
--- a/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AdminService.java
+++ b/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AdminService.java
@@ -1,5 +1,6 @@
 package edu.columbia.cs.psl.halo.server;

+import java.util.Date;
 import java.util.List;

 import javax.annotation.security.RolesAllowed;
@@ -10,7 +11,9 @@ import javax.persistence.criteria.CriteriaQuery;
 import edu.columbia.cs.psl.halo.entity.Assignment;
 import edu.columbia.cs.psl.halo.entity.Course;
 import edu.columbia.cs.psl.halo.entity.Enrollment;
+import edu.columbia.cs.psl.halo.entity.EnrollmentType;
 import edu.columbia.cs.psl.halo.entity.Quest;
+import edu.columbia.cs.psl.halo.entity.QuestProgress;
 import edu.columbia.cs.psl.halo.entity.Task;
 import edu.columbia.cs.psl.halo.entity.User;

@@ -19,6 +22,40 @@ import edu.columbia.cs.psl.halo.entity.User;
 @RolesAllowed("ADMIN")
 public class AdminService extends AbstractFacade<User> {

+	public void addUser(String first, String last, String email, String password)
+	{
+		Course c = getEntityManager().find(Course.class, 1);
+
+		User u = new User();
+		u.setFirstName(first);
+		u.setLastName(last);
+		u.setEmail(email);
+		u.setPassword(UserService.getEncryptedPassword(password));
+		u.setXp(0);
+		getEntityManager().persist(u);
+
+		Enrollment e = new Enrollment();
+		e.setUser(u);
+		e.setCourse(c);
+		e.setType(EnrollmentType.STUDENT);
+
+		getEntityManager().persist(e);
+
+		javax.persistence.criteria.CriteriaQuery<Task> cq = getEntityManager().getCriteriaBuilder().createQuery(Task.class);
+        cq.select(cq.from(Task.class));
+        for(Task t : getEntityManager().createQuery(cq).getResultList())
+		{
+			QuestProgress p = new QuestProgress();
+			p.setUser(u);
+			p.setTask(t);
+			p.setQuest(t.getQuest());
+			p.setUpdated(new Date());
+			p.setCompleted(false);
+			getEntityManager().persist(p);
+
+
+		}
+	}
 	@SuppressWarnings({ "rawtypes", "unchecked" })
 	public List<Course> getCourses()
 	{
diff --git a/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/UserService.java b/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/UserService.java
index 36fa011..b79f35f 100644
--- a/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/UserService.java
+++ b/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/UserService.java
@@ -1,5 +1,9 @@
 package edu.columbia.cs.psl.halo.server;

+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.security.NoSuchAlgorithmException;
 import java.util.Date;
 import java.util.HashSet;
@@ -9,11 +13,23 @@ import java.util.Set;
 import javax.annotation.security.PermitAll;
 import javax.annotation.security.RolesAllowed;
 import javax.ejb.Stateless;
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.InvocationContext;
+import javax.jws.WebMethod;
 import javax.jws.WebService;
 import javax.persistence.NoResultException;
 import javax.persistence.Query;
 import javax.persistence.criteria.CriteriaQuery;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.rpc.ServiceException;

+import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+
+import com.crowsoftware.jira.soap.JiraSoapService;
+import com.crowsoftware.jira.soap.JiraSoapServiceServiceLocator;
+import com.crowsoftware.jira.soap.RemoteAuthenticationException;
+import com.crowsoftware.jira.soap.RemoteComponent;
+import com.crowsoftware.jira.soap.RemoteIssue;
 import com.google.code.facebookapi.FacebookException;
 import com.google.code.facebookapi.FacebookJsonRestClient;

@@ -29,13 +45,14 @@ import edu.columbia.cs.psl.halo.entity.QuestProgress;
 import edu.columbia.cs.psl.halo.entity.Task;
 import edu.columbia.cs.psl.halo.entity.Title;
 import edu.columbia.cs.psl.halo.entity.User;
+import com.crowsoftware.jira.soap.RemoteException;

 /**
  * Session Bean implementation class UserService
  */
 @Stateless
 @WebService
-//@RolesAllowed("USER")
+@RolesAllowed("USER")
 public class UserService extends AbstractFacade<User> implements UserServiceRemote {

     /**
@@ -44,7 +61,7 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
     public UserService() {
         super(User.class);
     }
-
+    @WebMethod
     public void setPassword(String s)
     {
     	User me = getUser();
@@ -57,22 +74,46 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
      * @param t
      * @return
      */
-    public void markTaskCompleted(Task pT)
+    @WebMethod
+    public String markTaskCompleted(Task pT)
     {
     	Task t = getEntityManager().find(Task.class, pT.getId());
     	QuestProgress qp = getMyProgressFor(t);
     	qp.setUpdated(new Date());
     	qp.setCompleted(true);
     	getEntityManager().merge(qp);
-    	handleResults(t.getResultsIn());
+    	String ret = handleResults(t.getResultsIn());
     	User me = getUser();
-    	me.setXp(me.getXp() + t.getQuest().getExperiencePoints());
-    	if(me.getLevel().getXpMax() <= me.getXp())
+    	List<QuestProgress> done = me.getProgress();
+    	boolean allDone = true;
+    	for(Task tz : t.getQuest().getTasks())
+    	{
+    		boolean found = false;
+    		for(QuestProgress qpz : done)
+    		{
+    			if(qpz.getTask().getId()==tz.getId())
+    				found = true;
+    		}
+    		if(!found)
+    			allDone = false;
+    	}
+    	if(allDone)
     	{
-    		me.setLevel(getLevel(me.getLevel().getLevel() + 1));
+	    	me.setXp(me.getXp() + t.getQuest().getExperiencePoints());
+	    	if(t.getQuest().getExperiencePoints() > 0)
+	    		ret += "You've received " + t.getQuest().getExperiencePoints() + " XP\n";
+	    	if(me.getLevel().getXpMax() <= me.getXp())
+	    	{
+	    		me.setLevel(getLevel(me.getLevel().getLevel() + 1));
+	    		ret += "You've reached level " + me.getLevel().getLevel()+", hooray!\n";
+	    	}
     	}
     	getEntityManager().merge(me);
+
+    	return ret;
     }
+
+    @WebMethod
     public Set<QuestProgress> getMyProgressFor(Quest q)
     {
     	User me = getUser();
@@ -95,6 +136,23 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo

     	return progress;
     }
+
+    private QuestProgress getMyProgressForNoCreate(Task t)
+    {
+    	User me = getUser();
+    	Query qu = getEntityManager().createNativeQuery("select * FROM questprogress where task_id=? and user_id=?",QuestProgress.class);
+    	qu.setParameter(1, t.getId());
+    	qu.setParameter(2, getUser().getId());
+
+    	try{
+    		return (QuestProgress) qu.getSingleResult();
+    	}
+    	catch(NoResultException ex)
+    	{
+    		return null;
+    	}
+
+    }
     private QuestProgress getMyProgressFor(Task t)
     {
     	User me = getUser();
@@ -118,8 +176,9 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
     	}

     }
-    private void handleResults(List<CausualRelation> relations)
+    private String handleResults(List<CausualRelation> relations)
     {
+    	String ret ="";
     	for(CausualRelation r : relations)
     	{
     		if(r.getAchievementResult() != null)
@@ -129,46 +188,57 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
     			rec.setUser(getUser());
     			rec.setCompletionTime(new Date());
     			getEntityManager().persist(rec);
-
+    			ret = ret + "Congratulations, you've unlocked the achievement \""+r.getAchievementResult().getName()+"\"!\n";
     			User me = getUser();
     			if(r.getAchievementResult().getResultTitle() != null)
     			{
     				me.getTitles().add(r.getAchievementResult().getResultTitle());
+    				if(me.getActiveTitle() == null)
+    					me.setActiveTitle(r.getAchievementResult().getResultTitle());
+    				ret = ret + "Congratulations, you've unlocked the title \""+r.getAchievementResult().getResultTitle().getTitle()+"\"!\n";
     			}
     			me.setAchievementPoints(me.getAchievementPoints() + r.getAchievementResult().getPoints());
     			getEntityManager().merge(me);
     		}
     		if(r.getTaskResult() != null)
     		{
+    			if(getMyProgressForNoCreate(r.getTaskResult()) == null)
+    				ret = ret + "You've unlocked the task \""+r.getTaskResult().getName()+"\", in the quest \""+r.getTaskResult().getQuest().getName()+"\"!\n";
     			getMyProgressFor(r.getTaskResult());
+
     		}
     	}
+    	return ret;
     }

+    @WebMethod
     public boolean setDefaultTitle(Title t)
     {
     	User u = getUser();
-    	if(u.getTitles().contains(t))
-    	{
-    		u.setActiveTitle(t);
-    		getEntityManager().merge(u);
-    		return true;
-    	}
-    	return false;
+		u.setActiveTitle(t);
+		getEntityManager().merge(u);
+    	return true;
     }
+
+    @WebMethod
     public Byte[] getMyProfileImage()
     {
     	return null; //TODO
     }
+
+    @WebMethod
     public Byte[] getProfileImage(User u)
     {
     	return null; //TODO
     }
+
+    @WebMethod
     public void setProfileImage(Byte[] img)
     {
     	//TODO
     }
-
+
+    @WebMethod
     public Level getLevel(int i)
     {
     	Query q = getEntityManager().createNativeQuery("select * FROM level where level=?", Level.class);
@@ -182,6 +252,7 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
     	}
     }

+    @WebMethod
 	@SuppressWarnings({ "rawtypes", "unchecked" })
     public List<Achievement> getAllAchievements()
     {
@@ -189,7 +260,7 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
         cq.select(cq.from(Achievement.class));
         return getEntityManager().createQuery(cq).getResultList();
     }
-
+    @WebMethod
 	@SuppressWarnings({ "rawtypes", "unchecked" })
     public List<Quest> getAllQuests()
     {
@@ -197,16 +268,19 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
         cq.select(cq.from(Quest.class));
         return getEntityManager().createQuery(cq).getResultList();
     }
+    @WebMethod
     public List<Title> getMyTitles()
     {
     	User u = getUser();
     	return u.getTitles();
     }
+    @WebMethod
     public List<AchievementRecord> getMyAchievements()
     {
     	User u = getUser();
     	return u.getAchievements();
     }
+    @WebMethod
     public List<Assignment> getAssignmentsFor(Course c)
     {
     	getEntityManager().getEntityManagerFactory().getCache().evictAll();
@@ -215,6 +289,7 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
     	c = getEntityManager().find(Course.class, c.getId());
     	return c.getAssignments();
     }
+    @WebMethod
     @SuppressWarnings("unchecked")
 	public List<Quest> getQuestsFor(Assignment a)
     {
@@ -224,6 +299,7 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
     	q.setParameter(2, a.getId());
     	return q.getResultList();
     }
+    @WebMethod
     @SuppressWarnings("unchecked")
    	public List<Quest> getAllQuestsFor(Assignment a)
     {
@@ -232,31 +308,36 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
        	q.setParameter(1, a.getId());
        	return q.getResultList();
     }
+    @WebMethod
     public int getMaxAchievementPts()
     {
     	Query q= getEntityManager().createNativeQuery("SELECT sum(points) from achievement");
     	return Integer.parseInt(((java.math.BigDecimal) q.getSingleResult()).toBigInteger().toString());
     }
+
+    @WebMethod
     public List<QuestProgress> getMyProgress()
     {
     	User u = getUser();
     	return u.getProgress();
     }

-
+    @WebMethod
     public List<Enrollment> getEnrollments()
     {
     	User u = getUser();
     	return u.getEnrollments();
     }

+    @PermitAll
+    @WebMethod
     public User getMe()
     {
     	return getUser();
     }
     private final static String HEX_DIGITS = "0123456789abcdef";

-	private String getEncryptedPassword(String plaintext) {
+	public static String getEncryptedPassword(String plaintext) {

 		java.security.MessageDigest d =null;
 				try {
@@ -291,6 +372,8 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
     	q.executeUpdate();

 	}
+
+    @WebMethod
     public String getRememberMeToken()
     {
     	String r;
@@ -311,6 +394,7 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
     	return r;
     }

+    @WebMethod
     public boolean postQuestCompletionToFacebook(Quest q)
     {
     	User me = getUser();
@@ -330,17 +414,18 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
     	return true;
     }

+    @WebMethod
     public boolean postTaskCompletionToFacebook(Task t)
     {
     	User me = getUser();
-
+    	t=getEntityManager().find(Task.class, t.getId());
     	 String FB_APP_API_KEY = new String("191177150954478");
     	 String FB_APP_SECRET = new String("ecd307ec8c6fc5531b44c4f0d20f00e6");
     	    String FB_SESSION_KEY = new String(me.getFacebookSessionKey());
     	FacebookJsonRestClient facebook = new FacebookJsonRestClient( FB_APP_API_KEY, FB_APP_SECRET, FB_SESSION_KEY );
     	 	        FacebookJsonRestClient facebookClient = (FacebookJsonRestClient)facebook;
     	 	try {
-    	 		String msg = "I just completed the " + t.getName() + " Task on HALO-SE.";
+    	 		String msg = "I just completed the task \"" + t.getName() + "\" (part of quest \""+t.getQuest().getName()+"\") on HALO-SE.";
     	 		String fbResult = facebookClient.stream_publish(msg, null, null, null, null);
 			} catch (FacebookException e) {
 				// TODO Auto-generated catch block
@@ -349,6 +434,7 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
     	return true;
     }

+    @WebMethod
     public void logoutOfFacebook()
     {
     	User me = getUser();
@@ -368,4 +454,77 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
 			getEntityManager().merge(u);
 		}
 	}
+
+
+    @WebMethod(exclude=true)
+    @AroundInvoke
+    public Object handleException(InvocationContext ctx) throws Exception {
+    	try{
+          return ctx.proceed( );
+    	}
+    	catch(Exception ex)
+    	{
+    		reportError(ex);
+    		throw ex;
+    	}
+    }
+    public static void reportError(Exception ex)
+	{
+		reportError(ex,null);
+	}
+	private static JiraSoapService svc = null;
+
+	@WebMethod
+	public String getLeadersStr()
+	{
+		String r = "(By XP points; top 10)\n";
+		Query q = getEntityManager().createNativeQuery("SELECT * from h_user order by XP DESC, ID ASC LIMIT 10",User.class);
+		List<User> res = q.getResultList();
+		int i = 1;
+		for(User u : res)
+		{
+			r+=i+": " + u.getFirstName() + " " + u.getLastName() + " (" + u.getXp()+")\n";
+			i++;
+		}
+		return r;
+	}
+	public static void reportError(Exception ex, String message)
+	{
+		if(svc == null)
+		{
+			try {
+				svc = new JiraSoapServiceServiceLocator().getJirasoapserviceV2(new URL("http://ase.cs.columbia.edu/jira/rpc/soap/jirasoapservice-v2?wsdl"));
+			} catch (ServiceException e) {
+			} catch (MalformedURLException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+		try {
+			String token = svc.login("rpc", "3uJaMaYefradR6s3T97vare");
+			RemoteIssue issue = new RemoteIssue();
+
+			StringWriter stackTrace = new StringWriter();
+		    ex.printStackTrace(new PrintWriter(stackTrace));
+		    issue.setSummary("HALO: " + (ex.getMessage() == null ? "" : ex.getMessage().substring(0, (ex.getMessage().length() > 150 ? 150 : ex.getMessage().length()))));
+			issue.setDescription("Error from HALO: " +"\n"+stackTrace.getBuffer() + (message == null ? "" : "\nState: "+message));
+			issue.setProject("OPS");
+			issue.setType("1");
+			RemoteComponent[] p = new RemoteComponent[1];
+			p[0] = new RemoteComponent();
+			p[0].setId(""+10100);
+			issue.setComponents(p);
+			svc.createIssue(token, issue);
+			svc.logout(token);
+		} catch (RemoteAuthenticationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (RemoteException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (java.rmi.RemoteException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
 }
diff --git a/halo-auth/src/edu/columbia/cs/psl/halo/server/auth/HALOLoginModule.java b/halo-auth/src/edu/columbia/cs/psl/halo/server/auth/HALOLoginModule.java
index b1cecc3..69493df 100644
--- a/halo-auth/src/edu/columbia/cs/psl/halo/server/auth/HALOLoginModule.java
+++ b/halo-auth/src/edu/columbia/cs/psl/halo/server/auth/HALOLoginModule.java
@@ -1,5 +1,6 @@
 package edu.columbia.cs.psl.halo.server.auth;

+import javax.ejb.EJBException;
 import javax.security.auth.login.LoginException;

 import com.sun.appserv.security.AppservPasswordLoginModule;
@@ -76,11 +77,31 @@ public class HALOLoginModule extends AppservPasswordLoginModule {
 				ex.initCause(e);
 				throw ex;
 			}
-
+//			throw new EJBException("Failed to login");
+//			throw new LoginException("Failed to login");
 		}
-		throw new LoginException("Failed to login");
+		return false;
+
+	}
+	private final static String HEX_DIGITS = "0123456789abcdef";
+
+	public static String getEncryptedPassword(String plaintext) {
+
+		java.security.MessageDigest d =null;
+				try {
+					d = java.security.MessageDigest.getInstance("SHA-1");
+				} catch (NoSuchAlgorithmException e) {
+				}
+				d.reset();
+				d.update(plaintext.getBytes());
+				byte[] hashedBytes =  d.digest();
+				StringBuffer sb = new StringBuffer(hashedBytes.length * 2);
+		        for (int i = 0; i < hashedBytes.length; i++) {
+		             int b = hashedBytes[i] & 0xFF;
+		             sb.append(HEX_DIGITS.charAt(b >>> 4)).append(HEX_DIGITS.charAt(b & 0xF));
+		        }
+		        return sb.toString();
 	}
-
 	private boolean loginByPassword() throws LoginException
 	{
 			try
@@ -93,7 +114,8 @@ public class HALOLoginModule extends AppservPasswordLoginModule {
 					"left join enrollment admin on admin.user_id=u.id and admin.type=\"ADMIN\" " +
 					"where u.email=? and u.password=? group by u.id");
 			s.setString(1, _username);
-			s.setString(2, _password);
+			s.setString(2, getEncryptedPassword(_password));
+//			System.out.println(_username + " <"+_password+">" + "-"+getEncryptedPassword(_password)+"-");
 			s.execute();
 			ResultSet rs = s.getResultSet();
 			if(rs.next())
@@ -109,9 +131,9 @@ public class HALOLoginModule extends AppservPasswordLoginModule {
 				if(rs.getInt("admin") == 1)
 					groups.add("ADMIN");
 				String[] gret = new String[groups.size()];
-				System.out.println("Set groups: " + gret);
+//				System.out.println("Set groups: " + gret);

-				System.out.println(_username + " " + gret);
+//				System.out.println(_username + " " + gret);
 				commitUserAuthentication(groups.toArray(gret));
 				conn.close();
 				return true;
@@ -122,14 +144,13 @@ public class HALOLoginModule extends AppservPasswordLoginModule {
 				ex.initCause(e);
 				throw ex;
 			}
-
-		throw new LoginException("Failed to login");
+			throw new LoginException("Failed to login :(");
 	}

 	protected void authenticateUser() throws LoginException {
             if(!loginByRememberMe())
             	if(!loginByPassword())
-                    throw new LoginException("Login Failed for user " + _username);
+        			throw new LoginException("Failed to login :(");

 	}

diff --git a/halo-ear/.project b/halo-ear/.project
index 59e0192..c19d386 100644
--- a/halo-ear/.project
+++ b/halo-ear/.project
@@ -5,6 +5,7 @@
 	<projects>
 		<project>halo-se-common</project>
 		<project>halo-se-EJB</project>
+		<project>halo-se-web</project>
 	</projects>
 	<buildSpec>
 		<buildCommand>
diff --git a/halo-ear/.settings/org.eclipse.wst.common.component b/halo-ear/.settings/org.eclipse.wst.common.component
index 735ad04..9af0e84 100644
--- a/halo-ear/.settings/org.eclipse.wst.common.component
+++ b/halo-ear/.settings/org.eclipse.wst.common.component
@@ -9,5 +9,9 @@
         <dependent-module archiveName="halo-se-common.jar" deploy-path="/lib" handle="module:/resource/halo-se-common/halo-se-common">
             <dependency-type>uses</dependency-type>
         </dependent-module>
+        <dependent-module archiveName="halo-se-web.war" deploy-path="/" handle="module:/resource/halo-se-web/halo-se-web">
+            <dependent-object/>
+            <dependency-type>uses</dependency-type>
+        </dependent-module>
     </wb-module>
 </project-modules>
diff --git a/halo-ear/EarContent/META-INF/application.xml b/halo-ear/EarContent/META-INF/application.xml
index 4b3afd3..d123b11 100644
--- a/halo-ear/EarContent/META-INF/application.xml
+++ b/halo-ear/EarContent/META-INF/application.xml
@@ -4,6 +4,12 @@
   <module>
     <ejb>halo-se-EJB.jar</ejb>
   </module>
+  <module>
+    <web>
+      <web-uri>halo-se-web.war</web-uri>
+      <context-root>halo-se-web</context-root>
+    </web>
+  </module>
   <persistence-context-ref>
     <persistence-context-ref-name>halo_persist</persistence-context-ref-name>
     <persistence-unit-name>halo_persist</persistence-unit-name>
diff --git a/halo-ear/EarContent/lib-disabled/activation-1.1.jar b/halo-ear/EarContent/lib-disabled/activation-1.1.jar
new file mode 100644
index 0000000..53f82a1
Binary files /dev/null and b/halo-ear/EarContent/lib-disabled/activation-1.1.jar differ
diff --git a/halo-ear/EarContent/lib-disabled/commons-logging-1.1.1.jar b/halo-ear/EarContent/lib-disabled/commons-logging-1.1.1.jar
new file mode 100644
index 0000000..1deef14
Binary files /dev/null and b/halo-ear/EarContent/lib-disabled/commons-logging-1.1.1.jar differ
diff --git a/halo-ear/EarContent/lib-disabled/jaxb-api-2.1.jar b/halo-ear/EarContent/lib-disabled/jaxb-api-2.1.jar
new file mode 100644
index 0000000..be3d6dc
Binary files /dev/null and b/halo-ear/EarContent/lib-disabled/jaxb-api-2.1.jar differ
diff --git a/halo-ear/EarContent/lib-disabled/jaxb-impl-2.1.9.jar b/halo-ear/EarContent/lib-disabled/jaxb-impl-2.1.9.jar
new file mode 100644
index 0000000..477a89c
Binary files /dev/null and b/halo-ear/EarContent/lib-disabled/jaxb-impl-2.1.9.jar differ
diff --git a/halo-ear/EarContent/lib-disabled/stax-api-1.0-2.jar b/halo-ear/EarContent/lib-disabled/stax-api-1.0-2.jar
new file mode 100644
index 0000000..015169d
Binary files /dev/null and b/halo-ear/EarContent/lib-disabled/stax-api-1.0-2.jar differ
diff --git a/halo-ear/EarContent/lib/jira-soap-client-0.1.0-jar-with-dependencies.jar b/halo-ear/EarContent/lib/jira-soap-client-0.1.0-jar-with-dependencies.jar
new file mode 100644
index 0000000..9244985
Binary files /dev/null and b/halo-ear/EarContent/lib/jira-soap-client-0.1.0-jar-with-dependencies.jar differ
diff --git a/halo-se-admin/META-INF/MANIFEST.MF b/halo-se-admin/META-INF/MANIFEST.MF
index bde12ae..02d0e3d 100644
--- a/halo-se-admin/META-INF/MANIFEST.MF
+++ b/halo-se-admin/META-INF/MANIFEST.MF
@@ -14,7 +14,8 @@ Require-Bundle: org.eclipse.ui,
  javax.xml.soap;bundle-version="1.2.0",
  org.eclipse.swt,
  org.eclipse.jface,
- org.eclipse.ui.workbench
+ org.eclipse.ui.workbench,
+ javax.mail;bundle-version="1.4.0"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ClassPath: .,
diff --git a/halo-se-admin/MyMailServer.txt b/halo-se-admin/MyMailServer.txt
new file mode 100644
index 0000000..3f8c63d
--- /dev/null
+++ b/halo-se-admin/MyMailServer.txt
@@ -0,0 +1,20 @@
+# Configuration file for javax.mail
+# If a value for an item is not provided, then
+# system defaults will be used. These items can
+# also be set in code.
+
+# Host whose mail services will be used
+# (Default value : localhost)
+mail.host=mx.columbia.edu
+
+# Return address to appear on emails
+# (Default value : username@host)
+mail.from=jbell@cs.columbia.edu
+
+# Other possible items include:
+# mail.user=
+# mail.store.protocol=
+# mail.transport.protocol=
+# mail.smtp.host=
+# mail.smtp.user=
+# mail.debug=
\ No newline at end of file
diff --git a/halo-se-admin/lib/halo-common.jar b/halo-se-admin/lib/halo-common.jar
index 0973dc6..98196bb 100644
Binary files a/halo-se-admin/lib/halo-common.jar and b/halo-se-admin/lib/halo-common.jar differ
diff --git a/halo-se-admin/plugin.xml b/halo-se-admin/plugin.xml
index aae5d2c..5bf3c3a 100644
--- a/halo-se-admin/plugin.xml
+++ b/halo-se-admin/plugin.xml
@@ -62,7 +62,7 @@
                label="File">
             <command
                   commandId="org.eclipse.ui.file.exit"
-                  label="Exit">
+                  label="Exit HALO Admin">
             </command>
             <command
                   commandId="org.eclipse.ui.file.save"
diff --git a/halo-se-admin/src/edu/columbia/cs/psl/halo/admin/UserLoader.java b/halo-se-admin/src/edu/columbia/cs/psl/halo/admin/UserLoader.java
new file mode 100644
index 0000000..f083519
--- /dev/null
+++ b/halo-se-admin/src/edu/columbia/cs/psl/halo/admin/UserLoader.java
@@ -0,0 +1,108 @@
+package edu.columbia.cs.psl.halo.admin;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+import java.util.Scanner;
+
+import javax.mail.Message;
+import javax.mail.Message.RecipientType;
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+
+import edu.columbia.cs.psl.halo.HALOServiceFactory;
+import edu.columbia.cs.psl.halo.server.stubs.AdminService;
+import edu.columbia.cs.psl.halo.server.stubs.AdminServiceService;
+
+public class UserLoader {
+	public static void main(String[] args) throws Exception{
+//		HALOServiceFactory.getInstance().login("jon", "test123");
+		File f = new File("students.csv");
+		Scanner s = new Scanner(f);
+		while(s.hasNextLine())
+		{
+			String l = s.nextLine();
+			String[] a = l.split(",");
+//			HALOServiceFactory.getInstance().getAdminSvc().addUser(a[1],a[0],a[2],a[3]);
+			String msg = "Dear FIRST_N LAST_N,\n"+
+"Please find your login for HALO-SE below, as well as a link to installation instructions. While it is not mandatory that you use HALO to help with your upcoming assignment, we would encourage you to give it a try - it is designed to help you ensure that you fully accomplish the requirements of the assignment and receive full credit.\n\n"+
+
+"Your username is: UNI\n"+
+"Your password is: PASSWORD\n"+
+"(Note that once you login, you can change your password to whatever you like)\n\n"+
+
+"You can find detailed installation instructions here:Êhttp://ase.cs.columbia.edu/halo-update/install.html\n\n"+
+
+"If you have any problems using HALO-SE, please do not hesitate to contact me directly.\n\n"+
+
+"Best,\nJon Bell";
+			msg  = msg.replace("FIRST_N", a[1]).replace("LAST_N", a[0]).replace("UNI", a[2]).replace("PASSWORD", a[3]);
+//			System.out.println(msg);
+			sendEmail("jbell@cs.columbia.edu", a[2]+"@columbia.edu", "COMS 3134: HALO Installation Info & Login Credentials", msg);
+//			System.exit(0);
+		}
+	}
+	  private static Properties fMailServerConfig = new Properties();
+
+	  static {
+		    fetchConfig();
+		  }
+
+		  /**
+		  * Open a specific text file containing mail server
+		  * parameters, and populate a corresponding Properties object.
+		  */
+		  private static void fetchConfig() {
+		    InputStream input = null;
+		    try {
+		      //If possible, one should try to avoid hard-coding a path in this
+		      //manner; in a web application, one should place such a file in
+		      //WEB-INF, and access it using ServletContext.getResourceAsStream.
+		      //Another alternative is Class.getResourceAsStream.
+		      //This file contains the javax.mail config properties mentioned above.
+		      input = new FileInputStream( "/Users/jon/Documents/PSL/Projects/halo-eclipse/halo-se-admin/MyMailServer.txt" );
+		      fMailServerConfig.load( input );
+		    }
+		    catch ( IOException ex ){
+		      System.err.println("Cannot open and load mail server properties file.");
+		    }
+		    finally {
+		      try {
+		        if ( input != null ) input.close();
+		      }
+		      catch ( IOException ex ){
+		        System.err.println( "Cannot close mail server properties file." );
+		      }
+		    }
+		  }
+	public static void sendEmail(
+		    String aFromEmailAddr, String aToEmailAddr,
+		    String aSubject, String aBody
+		  ){
+		    //Here, no Authenticator argument is used (it is null).
+		    //Authenticators are used to prompt the user for user
+		    //name and password.
+		    Session session = Session.getDefaultInstance( fMailServerConfig, null );
+		    MimeMessage message = new MimeMessage( session );
+		    try {
+		      //the "from" address may be set in code, or set in the
+		      //config file under "mail.from" ; here, the latter style is used
+		      //message.setFrom( new InternetAddress(aFromEmailAddr) );
+		      message.addRecipient(
+		        Message.RecipientType.TO, new InternetAddress(aToEmailAddr)
+		      );
+		      message.addRecipient(Message.RecipientType.BCC, new InternetAddress("jbell@cs.columbia.edu"));
+		      message.setSubject( aSubject );
+		      message.setText( aBody );
+		      Transport.send( message );
+		    }
+		    catch (MessagingException ex){
+		      System.err.println("Cannot send email. " + ex);
+		    }
+		  }
+}
diff --git a/halo-se-admin/src/edu/columbia/cs/psl/halo/admin/editor/TaskEditor.java b/halo-se-admin/src/edu/columbia/cs/psl/halo/admin/editor/TaskEditor.java
index 130b665..3e435f0 100644
--- a/halo-se-admin/src/edu/columbia/cs/psl/halo/admin/editor/TaskEditor.java
+++ b/halo-se-admin/src/edu/columbia/cs/psl/halo/admin/editor/TaskEditor.java
@@ -151,6 +151,7 @@ public class TaskEditor extends EditorPart {
 		questMap = new HashMap<String, Quest>();
 		int i = 0;
 		int s = 0;
+		try{
 		List<Quest> allquests =HALOServiceFactory.getInstance().getUserSvc().getAllQuests();
 		String[] ar = new String[allquests.size()];
 		for(Quest a : allquests)
@@ -161,9 +162,14 @@ public class TaskEditor extends EditorPart {
 				s = i;
 			i++;
 		}
-
 		assignedQuest.setItems(ar);
 		assignedQuest.select(s);
+		}
+		catch(Exception ex)
+		{
+			ex.printStackTrace();
+		}
+

 //		lastName.setText(person.getLastName());
 	}
diff --git a/halo-se-admin/students.csv b/halo-se-admin/students.csv
new file mode 100644
index 0000000..9318534
--- /dev/null
+++ b/halo-se-admin/students.csv
@@ -0,0 +1 @@
+Al-Syed,Abdullah,aza2105,dEPer8fa
Artemiou,Vasilios,va2265,28ECuZus
Becker,Joseph,jmb2297,phEn8trA
Bell,Daniel,dpb2121,tHu7ajAz
Benitez,Jamie,jab2314,F52SWuju
Bleuel,Nicole,nkb2115,MecHe2e3
Bose,Koel,kab2186,P5WuPE8p
Cao,Jeff,jhc2154,stekEz3K
Castellucci,Francis,fvc2105,TrAs9e9r
Chang,Victor,vc2281,WRuKa44u
Chao,David,dkc2110,sW8CRega
Chen,Sitian,sc3235,kasAtuQ7
Chong,Hahn,hc2361,Ke2eC2fR
Cohen,David,Dec-43,qej8QeDr
Damian,Mijael,mad2222,PHa4EsP2
Davis,Wesley,wbd2103,gEstat2x
Dong,James,jpd2152,chUv6pet
Erkilic,Mehmet,me2419,SwustEd3
Eum,Julianna,jme2134,fR97reXA
Evans,Benjamin,bse2105,zUsw56uf
Fells,Johnny,jf2608,4ut8eSpe
Guo,Hong,hg2269,6H9tachU
Jacobs,Ernesto,ewj2110,sTab7nun
Jung,SeungJun,sj2453,9ruchAvE
Kim,Bora,bk2380,S4EDrux2
Kim,SungHwan,sk3408,2r2yUsWu
Kolodzinski,Anthony,aak2166,c6SPeSte
Kotliar,Dylan,dak2135,naTH7fUP
Lee,Albert,akl2140,3axa5edR
Lee,Connie,cfl2119,bAWra8E4
Lee,Jin,jl3455,2REmuj3b
Lee,Kevin,kwl2116,7rE6utre
Lubat,Jonathan,jil2124,heb4ehA2
Marsocci,Michael,mkm2154,puXaF5Ek
Narayan,Ram,rsn2115,2eSWAwru
Nertomb,Leslie,ln2250,wr9bRUSt
Ramachandran,Abhimanyu,ar3015,fUwagE8P
Rastogi,Sumit,sar2161,B26raswU
Shin,SooHyun,ss3751,PEva4uBr
Stappenbeck,Corey,ccs2135,vE7eCaZu
Sun,Jerry,js4016,ruraDR9w
Taku,Maria,mat2185,chugARe4
Tay,QiXiu,qt2106,PhESwe9h
Vel,Ponni,pvv2001,dREPr9Ph
Wang,Qiurui,qw2128,9espEvU3
Wu,Kelly,kjw2130,3UH3wRuS
Xu,Xin,xx2135,tRAnep6e
Yang,LingKai,ly2243,dA4r6cuq
Yoon,Richard,ry2201,quX4gexe
Zech,John,jrz2111,BrEB9pR4
Zhu,Yuexin,yz2362,stekEz3K
\ No newline at end of file
diff --git a/halo-se-common/makeStubs.sh b/halo-se-common/makeStubs.sh
index f3bc558..7f51932 100755
--- a/halo-se-common/makeStubs.sh
+++ b/halo-se-common/makeStubs.sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 rm -rf src/edu/columbia/cs/psl/halo/server/stubs
-/Library/Java/Home/bin/wsimport -b bindings.xjb -d bin/ -s src/ -p edu.columbia.cs.psl.halo.server.stubs http://127.0.0.1:8080/UserServiceService/UserService?wsdl
-/Library/Java/Home/bin/wsimport -b bindings.xjb -d bin/ -s src/ -p edu.columbia.cs.psl.halo.server.stubs http://127.0.0.1:8080/CourseServiceService/CourseService?wsdl
-/Library/Java/Home/bin/wsimport -b bindings.xjb -d bin/ -s src/ -p edu.columbia.cs.psl.halo.server.stubs http://127.0.0.1:8080/AdminServiceService/AdminService?wsdl
-/Library/Java/Home/bin/wsimport -b bindings.xjb -d bin/ -s src/ -p edu.columbia.cs.psl.halo.server.stubs http://127.0.0.1:8080/LogServiceService/LogService?wsdl
+/Library/Java/Home/bin/wsimport -b bindings.xjb -d bin/ -s src/ -p edu.columbia.cs.psl.halo.server.stubs http://$1/UserServiceService/UserService?wsdl
+/Library/Java/Home/bin/wsimport -b bindings.xjb -d bin/ -s src/ -p edu.columbia.cs.psl.halo.server.stubs http://$1/CourseServiceService/CourseService?wsdl
+/Library/Java/Home/bin/wsimport -b bindings.xjb -d bin/ -s src/ -p edu.columbia.cs.psl.halo.server.stubs http://$1/AdminServiceService/AdminService?wsdl
+/Library/Java/Home/bin/wsimport -b bindings.xjb -d bin/ -s src/ -p edu.columbia.cs.psl.halo.server.stubs http://$1/LogServiceService/LogService?wsdl

diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/HALOServiceFactory.java b/halo-se-common/src/edu/columbia/cs/psl/halo/HALOServiceFactory.java
index 64aacf3..38f1670 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/HALOServiceFactory.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/HALOServiceFactory.java
@@ -63,7 +63,7 @@ public class HALOServiceFactory {
 	public boolean login(String username, String password)
 	{
 		this.username = username;
-		this.password = UserWrapper.getEncryptedPassword(password);
+		this.password = password;
 		clearCache();
 		try
 		{
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/entity/User.java b/halo-se-common/src/edu/columbia/cs/psl/halo/entity/User.java
index 7bd40db..1c52a01 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/entity/User.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/entity/User.java
@@ -14,6 +14,7 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Lob;
 import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 import javax.xml.bind.annotation.XmlElement;
@@ -46,6 +47,14 @@ public class User extends LazyCycleBreaker implements Serializable {
 	private String facebookSessionKey;
 	private boolean hasFBkey;

+	@Override
+	public int hashCode() {
+		return new Integer(id).hashCode();
+	}
+	@Override
+	public boolean equals(Object obj) {
+		return (obj instanceof User && ((User) obj).getId() == getId());
+	}
 	public User() {

 	}
@@ -113,6 +122,7 @@ public class User extends LazyCycleBreaker implements Serializable {

 	@XmlTransient
 	@OneToMany(mappedBy="user")
+	@OrderBy("completionTime DESC")
 	public List<AchievementRecord> getAchievements() {
 		return achievements;
 	}
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AchievementRecord.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AchievementRecord.java
index 2f788ee..b491271 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AchievementRecord.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AchievementRecord.java
@@ -4,7 +4,6 @@ package edu.columbia.cs.psl.halo.server.stubs;
 import java.io.Serializable;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlSchemaType;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.datatype.XMLGregorianCalendar;
@@ -24,7 +23,7 @@ import edu.columbia.cs.psl.halo.server.wrapper.EqualsHashCodeProvider;
  *         &lt;element name="achievement" type="{http://server.halo.psl.cs.columbia.edu/}achievement" minOccurs="0"/>
  *         &lt;element name="completionTime" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>
  *         &lt;element name="id" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *         &lt;element ref="{http://server.halo.psl.cs.columbia.edu/}user" minOccurs="0"/>
+ *         &lt;element name="user" type="{http://server.halo.psl.cs.columbia.edu/}user" minOccurs="0"/>
  *       &lt;/sequence>
  *     &lt;/restriction>
  *   &lt;/complexContent>
@@ -50,7 +49,6 @@ public class AchievementRecord
     @XmlSchemaType(name = "dateTime")
     protected XMLGregorianCalendar completionTime;
     protected int id;
-    @XmlElement(namespace = "http://server.halo.psl.cs.columbia.edu/")
     protected User user;

     /**
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUser.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUser.java
new file mode 100644
index 0000000..90920c2
--- /dev/null
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUser.java
@@ -0,0 +1,147 @@
+
+package edu.columbia.cs.psl.halo.server.stubs;
+
+import java.io.Serializable;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+import edu.columbia.cs.psl.halo.server.wrapper.EqualsHashCodeProvider;
+
+
+/**
+ * <p>Java class for addUser complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="addUser">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *         &lt;element name="arg1" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *         &lt;element name="arg2" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *         &lt;element name="arg3" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *       &lt;/sequence>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "addUser", propOrder = {
+    "arg0",
+    "arg1",
+    "arg2",
+    "arg3"
+})
+public class AddUser
+    extends EqualsHashCodeProvider
+    implements Serializable
+{
+
+    private final static long serialVersionUID = 100L;
+    protected String arg0;
+    protected String arg1;
+    protected String arg2;
+    protected String arg3;
+
+    /**
+     * Gets the value of the arg0 property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getArg0() {
+        return arg0;
+    }
+
+    /**
+     * Sets the value of the arg0 property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setArg0(String value) {
+        this.arg0 = value;
+    }
+
+    /**
+     * Gets the value of the arg1 property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getArg1() {
+        return arg1;
+    }
+
+    /**
+     * Sets the value of the arg1 property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setArg1(String value) {
+        this.arg1 = value;
+    }
+
+    /**
+     * Gets the value of the arg2 property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getArg2() {
+        return arg2;
+    }
+
+    /**
+     * Sets the value of the arg2 property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setArg2(String value) {
+        this.arg2 = value;
+    }
+
+    /**
+     * Gets the value of the arg3 property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getArg3() {
+        return arg3;
+    }
+
+    /**
+     * Sets the value of the arg3 property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setArg3(String value) {
+        this.arg3 = value;
+    }
+
+}
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUserResponse.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUserResponse.java
new file mode 100644
index 0000000..39890a5
--- /dev/null
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUserResponse.java
@@ -0,0 +1,38 @@
+
+package edu.columbia.cs.psl.halo.server.stubs;
+
+import java.io.Serializable;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+import edu.columbia.cs.psl.halo.server.wrapper.EqualsHashCodeProvider;
+
+
+/**
+ * <p>Java class for addUserResponse complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="addUserResponse">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *       &lt;/sequence>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "addUserResponse")
+public class AddUserResponse
+    extends EqualsHashCodeProvider
+    implements Serializable
+{
+
+    private final static long serialVersionUID = 100L;
+
+}
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminService.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminService.java
index f1d8805..8beb6d3 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminService.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminService.java
@@ -40,6 +40,40 @@ public interface AdminService {

     /**
      *
+     * @param arg3
+     * @param arg2
+     * @param arg1
+     * @param arg0
+     */
+    @WebMethod
+    @RequestWrapper(localName = "addUser", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.AddUser")
+    @ResponseWrapper(localName = "addUserResponse", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.AddUserResponse")
+    public void addUser(
+        @WebParam(name = "arg0", targetNamespace = "")
+        String arg0,
+        @WebParam(name = "arg1", targetNamespace = "")
+        String arg1,
+        @WebParam(name = "arg2", targetNamespace = "")
+        String arg2,
+        @WebParam(name = "arg3", targetNamespace = "")
+        String arg3);
+
+    /**
+     *
+     * @param arg0
+     * @return
+     *     returns edu.columbia.cs.psl.halo.server.stubs.User
+     */
+    @WebMethod
+    @WebResult(targetNamespace = "")
+    @RequestWrapper(localName = "updateUser", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.UpdateUser")
+    @ResponseWrapper(localName = "updateUserResponse", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.UpdateUserResponse")
+    public User updateUser(
+        @WebParam(name = "arg0", targetNamespace = "")
+        User arg0);
+
+    /**
+     *
      * @return
      *     returns java.util.List<edu.columbia.cs.psl.halo.server.stubs.Course>
      */
@@ -162,20 +196,6 @@ public interface AdminService {
      *
      * @param arg0
      * @return
-     *     returns edu.columbia.cs.psl.halo.server.stubs.User
-     */
-    @WebMethod
-    @WebResult(targetNamespace = "")
-    @RequestWrapper(localName = "updateUser", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.UpdateUser")
-    @ResponseWrapper(localName = "updateUserResponse", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.UpdateUserResponse")
-    public User updateUser(
-        @WebParam(name = "arg0", targetNamespace = "")
-        User arg0);
-
-    /**
-     *
-     * @param arg0
-     * @return
      *     returns boolean
      */
     @WebMethod
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/Assignment.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/Assignment.java
index 6a3ceb3..2bd13bc 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/Assignment.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/Assignment.java
@@ -23,7 +23,7 @@ import javax.xml.datatype.XMLGregorianCalendar;
  *     &lt;extension base="{http://server.halo.psl.cs.columbia.edu/}lazyCycleBreaker">
  *       &lt;sequence>
  *         &lt;element name="assignedOn" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>
- *         &lt;element ref="{http://server.halo.psl.cs.columbia.edu/}course" minOccurs="0"/>
+ *         &lt;element name="course" type="{http://server.halo.psl.cs.columbia.edu/}course" minOccurs="0"/>
  *         &lt;element name="description" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
  *         &lt;element name="dueOn" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>
  *         &lt;element name="id" type="{http://www.w3.org/2001/XMLSchema}int"/>
@@ -55,7 +55,6 @@ public class Assignment
     private final static long serialVersionUID = 100L;
     @XmlSchemaType(name = "dateTime")
     protected XMLGregorianCalendar assignedOn;
-    @XmlElement(namespace = "http://server.halo.psl.cs.columbia.edu/")
     protected Course course;
     protected String description;
     @XmlSchemaType(name = "dateTime")
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/Enrollment.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/Enrollment.java
index 60452b7..307badc 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/Enrollment.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/Enrollment.java
@@ -4,7 +4,6 @@ package edu.columbia.cs.psl.halo.server.stubs;
 import java.io.Serializable;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlType;


@@ -18,10 +17,10 @@ import javax.xml.bind.annotation.XmlType;
  *   &lt;complexContent>
  *     &lt;extension base="{http://server.halo.psl.cs.columbia.edu/}lazyCycleBreaker">
  *       &lt;sequence>
- *         &lt;element ref="{http://server.halo.psl.cs.columbia.edu/}course" minOccurs="0"/>
+ *         &lt;element name="course" type="{http://server.halo.psl.cs.columbia.edu/}course" minOccurs="0"/>
  *         &lt;element name="id" type="{http://www.w3.org/2001/XMLSchema}int"/>
  *         &lt;element name="type" type="{http://server.halo.psl.cs.columbia.edu/}enrollmentType" minOccurs="0"/>
- *         &lt;element ref="{http://server.halo.psl.cs.columbia.edu/}user" minOccurs="0"/>
+ *         &lt;element name="user" type="{http://server.halo.psl.cs.columbia.edu/}user" minOccurs="0"/>
  *       &lt;/sequence>
  *     &lt;/extension>
  *   &lt;/complexContent>
@@ -43,11 +42,9 @@ public class Enrollment
 {

     private final static long serialVersionUID = 100L;
-    @XmlElement(namespace = "http://server.halo.psl.cs.columbia.edu/")
     protected Course course;
     protected int id;
     protected EnrollmentType type;
-    @XmlElement(namespace = "http://server.halo.psl.cs.columbia.edu/")
     protected User user;

     /**
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/GetLeadersStr.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/GetLeadersStr.java
new file mode 100644
index 0000000..ee750fc
--- /dev/null
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/GetLeadersStr.java
@@ -0,0 +1,38 @@
+
+package edu.columbia.cs.psl.halo.server.stubs;
+
+import java.io.Serializable;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+import edu.columbia.cs.psl.halo.server.wrapper.EqualsHashCodeProvider;
+
+
+/**
+ * <p>Java class for getLeadersStr complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="getLeadersStr">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *       &lt;/sequence>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "getLeadersStr")
+public class GetLeadersStr
+    extends EqualsHashCodeProvider
+    implements Serializable
+{
+
+    private final static long serialVersionUID = 100L;
+
+}
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/GetLeadersStrResponse.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/GetLeadersStrResponse.java
new file mode 100644
index 0000000..dcad117
--- /dev/null
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/GetLeadersStrResponse.java
@@ -0,0 +1,68 @@
+
+package edu.columbia.cs.psl.halo.server.stubs;
+
+import java.io.Serializable;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+import edu.columbia.cs.psl.halo.server.wrapper.EqualsHashCodeProvider;
+
+
+/**
+ * <p>Java class for getLeadersStrResponse complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="getLeadersStrResponse">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="return" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *       &lt;/sequence>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "getLeadersStrResponse", propOrder = {
+    "_return"
+})
+public class GetLeadersStrResponse
+    extends EqualsHashCodeProvider
+    implements Serializable
+{
+
+    private final static long serialVersionUID = 100L;
+    @XmlElement(name = "return")
+    protected String _return;
+
+    /**
+     * Gets the value of the return property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getReturn() {
+        return _return;
+    }
+
+    /**
+     * Sets the value of the return property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setReturn(String value) {
+        this._return = value;
+    }
+
+}
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/MarkTaskCompletedResponse.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/MarkTaskCompletedResponse.java
index 4ec9f22..c1da8c9 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/MarkTaskCompletedResponse.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/MarkTaskCompletedResponse.java
@@ -4,6 +4,7 @@ package edu.columbia.cs.psl.halo.server.stubs;
 import java.io.Serializable;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlType;
 import edu.columbia.cs.psl.halo.server.wrapper.EqualsHashCodeProvider;

@@ -18,6 +19,7 @@ import edu.columbia.cs.psl.halo.server.wrapper.EqualsHashCodeProvider;
  *   &lt;complexContent>
  *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
  *       &lt;sequence>
+ *         &lt;element name="return" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
  *       &lt;/sequence>
  *     &lt;/restriction>
  *   &lt;/complexContent>
@@ -27,12 +29,40 @@ import edu.columbia.cs.psl.halo.server.wrapper.EqualsHashCodeProvider;
  *
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "markTaskCompletedResponse")
+@XmlType(name = "markTaskCompletedResponse", propOrder = {
+    "_return"
+})
 public class MarkTaskCompletedResponse
     extends EqualsHashCodeProvider
     implements Serializable
 {

     private final static long serialVersionUID = 100L;
+    @XmlElement(name = "return")
+    protected String _return;
+
+    /**
+     * Gets the value of the return property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getReturn() {
+        return _return;
+    }
+
+    /**
+     * Sets the value of the return property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setReturn(String value) {
+        this._return = value;
+    }

 }
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/QuestProgress.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/QuestProgress.java
index c069dfc..860789d 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/QuestProgress.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/QuestProgress.java
@@ -4,7 +4,6 @@ package edu.columbia.cs.psl.halo.server.stubs;
 import java.io.Serializable;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlSchemaType;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.datatype.XMLGregorianCalendar;
@@ -26,7 +25,7 @@ import edu.columbia.cs.psl.halo.server.wrapper.EqualsHashCodeProvider;
  *         &lt;element name="quest" type="{http://server.halo.psl.cs.columbia.edu/}quest" minOccurs="0"/>
  *         &lt;element name="task" type="{http://server.halo.psl.cs.columbia.edu/}task" minOccurs="0"/>
  *         &lt;element name="updated" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>
- *         &lt;element ref="{http://server.halo.psl.cs.columbia.edu/}user" minOccurs="0"/>
+ *         &lt;element name="user" type="{http://server.halo.psl.cs.columbia.edu/}user" minOccurs="0"/>
  *       &lt;/sequence>
  *     &lt;/restriction>
  *   &lt;/complexContent>
@@ -56,7 +55,6 @@ public class QuestProgress
     protected Task task;
     @XmlSchemaType(name = "dateTime")
     protected XMLGregorianCalendar updated;
-    @XmlElement(namespace = "http://server.halo.psl.cs.columbia.edu/")
     protected User user;

     /**
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/UserService.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/UserService.java
index fa4826b..2de88ae 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/UserService.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/UserService.java
@@ -63,11 +63,14 @@ public interface UserService {
     /**
      *
      * @param arg0
+     * @return
+     *     returns java.lang.String
      */
     @WebMethod
+    @WebResult(targetNamespace = "")
     @RequestWrapper(localName = "markTaskCompleted", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.MarkTaskCompleted")
     @ResponseWrapper(localName = "markTaskCompletedResponse", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.MarkTaskCompletedResponse")
-    public void markTaskCompleted(
+    public String markTaskCompleted(
         @WebParam(name = "arg0", targetNamespace = "")
         Task arg0);

@@ -295,6 +298,14 @@ public interface UserService {

     /**
      *
+     */
+    @WebMethod
+    @RequestWrapper(localName = "logoutOfFacebook", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.LogoutOfFacebook")
+    @ResponseWrapper(localName = "logoutOfFacebookResponse", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.LogoutOfFacebookResponse")
+    public void logoutOfFacebook();
+
+    /**
+     *
      * @param arg2
      * @param arg1
      * @param arg0
@@ -312,10 +323,13 @@ public interface UserService {

     /**
      *
+     * @return
+     *     returns java.lang.String
      */
     @WebMethod
-    @RequestWrapper(localName = "logoutOfFacebook", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.LogoutOfFacebook")
-    @ResponseWrapper(localName = "logoutOfFacebookResponse", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.LogoutOfFacebookResponse")
-    public void logoutOfFacebook();
+    @WebResult(targetNamespace = "")
+    @RequestWrapper(localName = "getLeadersStr", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.GetLeadersStr")
+    @ResponseWrapper(localName = "getLeadersStrResponse", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.GetLeadersStrResponse")
+    public String getLeadersStr();

 }
diff --git a/halo-se-feature/.project b/halo-se-feature/.project
new file mode 100644
index 0000000..f9d4105
--- /dev/null
+++ b/halo-se-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>halo-se-feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
diff --git a/halo-se-feature/build.properties b/halo-se-feature/build.properties
new file mode 100644
index 0000000..64f93a9
--- /dev/null
+++ b/halo-se-feature/build.properties
@@ -0,0 +1 @@
+bin.includes = feature.xml
diff --git a/halo-se-feature/feature.xml b/halo-se-feature/feature.xml
new file mode 100644
index 0000000..7dc7563
--- /dev/null
+++ b/halo-se-feature/feature.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="edu.columbia.cs.psl.halo.client"
+      label="HALO SE Client Environment"
+      version="1.0.1.4">
+
+   <description url="http://www.example.com/description">
+      [Enter Feature Description here.]
+   </description>
+
+   <copyright url="http://www.example.com/copyright">
+      [Enter Copyright Description here.]
+   </copyright>
+
+   <license url="http://www.example.com/license">
+      [Enter License Description here.]
+   </license>
+
+   <plugin
+         id="edu.columbia.cs.psl.halo.client"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/halo-se-web/.classpath b/halo-se-web/.classpath
new file mode 100644
index 0000000..f11b674
--- /dev/null
+++ b/halo-se-web/.classpath
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
+		<attributes>
+			<attribute name="owner.project.facets" value="java"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish 3.1">
+		<attributes>
+			<attribute name="owner.project.facets" value="jst.web"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
+	<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
+	<classpathentry kind="output" path="build/classes"/>
+</classpath>
diff --git a/halo-se-web/.project b/halo-se-web/.project
new file mode 100644
index 0000000..000488b
--- /dev/null
+++ b/halo-se-web/.project
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>halo-se-web</name>
+	<comment></comment>
+	<projects>
+		<project>halo-eclipse-EAR</project>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+	</natures>
+</projectDescription>
diff --git a/halo-se-web/.settings/.jsdtscope b/halo-se-web/.settings/.jsdtscope
new file mode 100644
index 0000000..3a28de0
--- /dev/null
+++ b/halo-se-web/.settings/.jsdtscope
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="WebContent"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
+		<attributes>
+			<attribute name="hide" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
+	<classpathentry kind="output" path=""/>
+</classpath>
diff --git a/halo-se-web/.settings/org.eclipse.jdt.core.prefs b/halo-se-web/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fef1159
--- /dev/null
+++ b/halo-se-web/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Oct 07 13:43:08 EDT 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/halo-se-web/.settings/org.eclipse.wst.common.component b/halo-se-web/.settings/org.eclipse.wst.common.component
new file mode 100644
index 0000000..e6be07f
--- /dev/null
+++ b/halo-se-web/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-modules id="moduleCoreId" project-version="1.5.0">
+    <wb-module deploy-name="halo-se-web">
+        <wb-resource deploy-path="/" source-path="/WebContent"/>
+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
+        <property name="context-root" value="halo-se-web"/>
+        <property name="java-output-path" value="/halo-se-web/build/classes"/>
+    </wb-module>
+</project-modules>
diff --git a/halo-se-web/.settings/org.eclipse.wst.common.project.facet.core.xml b/halo-se-web/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..400b668
--- /dev/null
+++ b/halo-se-web/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <runtime name="GlassFish 3.1"/>
+  <fixed facet="jst.web"/>
+  <fixed facet="java"/>
+  <fixed facet="wst.jsdt.web"/>
+  <installed facet="java" version="1.6"/>
+  <installed facet="jst.web" version="3.0"/>
+  <installed facet="sun.facet" version="9"/>
+  <installed facet="wst.jsdt.web" version="1.0"/>
+</faceted-project>
diff --git a/halo-se-web/.settings/org.eclipse.wst.jsdt.ui.superType.container b/halo-se-web/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000..3bd5d0a
--- /dev/null
+++ b/halo-se-web/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/halo-se-web/.settings/org.eclipse.wst.jsdt.ui.superType.name b/halo-se-web/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100644
index 0000000..05bd71b
--- /dev/null
+++ b/halo-se-web/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/halo-se-web/.settings/org.eclipse.wst.ws.service.policy.prefs b/halo-se-web/.settings/org.eclipse.wst.ws.service.policy.prefs
new file mode 100644
index 0000000..483ea2b
--- /dev/null
+++ b/halo-se-web/.settings/org.eclipse.wst.ws.service.policy.prefs
@@ -0,0 +1,3 @@
+#Fri Oct 07 13:43:08 EDT 2011
+eclipse.preferences.version=1
+org.eclipse.wst.ws.service.policy.projectEnabled=false
diff --git a/halo-se-web/WebContent/META-INF/MANIFEST.MF b/halo-se-web/WebContent/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5e94951
--- /dev/null
+++ b/halo-se-web/WebContent/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/halo-se-web/WebContent/WEB-INF/sun-web.xml b/halo-se-web/WebContent/WEB-INF/sun-web.xml
new file mode 100644
index 0000000..c7c58b2
--- /dev/null
+++ b/halo-se-web/WebContent/WEB-INF/sun-web.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd">
+<sun-web-app error-url="">
+  <context-root>/halo-se-web</context-root>
+  <class-loader delegate="true"/>
+  <jsp-config>
+    <property name="keepgenerated" value="true">
+      <description>Keep a copy of the generated servlet class java code.</description>
+    </property>
+  </jsp-config>
+</sun-web-app>
diff --git a/halo-se-web/WebContent/index.jsp b/halo-se-web/WebContent/index.jsp
new file mode 100644
index 0000000..feff003
--- /dev/null
+++ b/halo-se-web/WebContent/index.jsp
@@ -0,0 +1,13 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+    	               "http://www.w3.org/TR/html4/loose.dtd">
+
+<html>
+  <head>
+    	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    	<title>Nothing to see here</title>
+  </head>
+  <body>
+    <h1>Move along, please</h1>
+  </body>
+</html>
diff --git a/halo-se-web/bin/.project b/halo-se-web/bin/.project
new file mode 100644
index 0000000..9d82e08
--- /dev/null
+++ b/halo-se-web/bin/.project
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>halo-se-web</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+	</natures>
+</projectDescription>
diff --git a/halo-se-web/build/classes/edu/columbia/cs/psl/halo/web/FacebookCallback.class b/halo-se-web/build/classes/edu/columbia/cs/psl/halo/web/FacebookCallback.class
new file mode 100644
index 0000000..3512d1e
Binary files /dev/null and b/halo-se-web/build/classes/edu/columbia/cs/psl/halo/web/FacebookCallback.class differ
diff --git a/halo-se-web/src/edu/columbia/cs/psl/halo/web/FacebookCallback.java b/halo-se-web/src/edu/columbia/cs/psl/halo/web/FacebookCallback.java
new file mode 100644
index 0000000..f604e70
--- /dev/null
+++ b/halo-se-web/src/edu/columbia/cs/psl/halo/web/FacebookCallback.java
@@ -0,0 +1,69 @@
+package edu.columbia.cs.psl.halo.web;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.ejb.EJB;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import edu.columbia.cs.psl.halo.server.UserServiceRemote;
+
+
+/**
+ * Servlet implementation class FacebookCallback
+ */
+@WebServlet("/FacebookCallback")
+public class FacebookCallback extends HttpServlet {
+	private static final long serialVersionUID = 1L;
+
+	@EJB
+	private UserServiceRemote userSvc;
+
+    /**
+     * @see HttpServlet#HttpServlet()
+     */
+    public FacebookCallback() {
+        super();
+        // TODO Auto-generated constructor stub
+    }
+
+	/**
+	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+	 */
+	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		HttpSession session = request.getSession();
+		response.setContentType("text/html");
+		PrintWriter out = response.getWriter();
+		String sess = request.getParameter("session");
+		String user = request.getParameter("uid");
+		Pattern p = Pattern.compile("\\{\"session_key\":\"([^\"]+)\"(.*)\"secret\":\"([^\"]+)\"(.*)\"sig\":\"([^\"]+)\"(.*)");
+		System.out.println("Session key: " + sess);
+		Matcher m = p.matcher(sess);
+
+		if(m.matches())
+		{
+			String session_key = m.group(1);
+			String secret = m.group(3);
+			String sig = m.group(5);
+			userSvc.setFBToken(Integer.parseInt(user), session_key, "WrAse3RAFRa86zUdafRupRatEwUBecEzadUpRenuMAXebrubuphaCeCHuGed5eru");
+		}
+//		out.println("\\{\"session_key\":\"([^\"]+)\"(.*)\"secret\":\"([^\"]+)\"(.*)");
+		out.println("Thanks, you're all set!");
+
+	}
+
+	/**
+	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+	 */
+	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		// TODO Auto-generated method stub
+	}
+
+}
diff --git a/halo-se/META-INF/MANIFEST.MF b/halo-se/META-INF/MANIFEST.MF
index a2f4f48..082d9c1 100644
--- a/halo-se/META-INF/MANIFEST.MF
+++ b/halo-se/META-INF/MANIFEST.MF
@@ -6,7 +6,6 @@ Bundle-Version: 1.0.0.qualifier
 Bundle-Activator: edu.columbia.cs.psl.halo.client.Activator
 Require-Bundle: org.eclipse.ui,
  org.eclipse.core.runtime,
- org.eclipse.equinox.security;bundle-version="1.1.0",
  org.eclipse.ui.forms;bundle-version="3.5.100"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/halo-se/lib/halo-common.jar b/halo-se/lib/halo-common.jar
index c220fe4..44ff964 100644
Binary files a/halo-se/lib/halo-common.jar and b/halo-se/lib/halo-common.jar differ
diff --git a/halo-se/plugin.xml b/halo-se/plugin.xml
index 27d7507..ca5e48e 100644
--- a/halo-se/plugin.xml
+++ b/halo-se/plugin.xml
@@ -8,21 +8,20 @@
             name="HALO SE"
             id="edu.columbia.cs.psl.halo.client">
       </category>
-      <stickyView
-            id="edu.columbia.cs.psl.halo.client.views.DashboardView">
-      </stickyView>
       <view
+            allowMultiple="false"
             category="edu.columbia.cs.psl.halo.client"
             class="edu.columbia.cs.psl.halo.client.views.DashboardView"
             id="edu.columbia.cs.psl.halo.client.views.DashboardView"
-            name="Dashboard"
+            name="HALO Dashboard"
             restorable="true">
       </view>
       <view
+            allowMultiple="false"
             category="edu.columbia.cs.psl.halo.client"
             class="edu.columbia.cs.psl.halo.client.views.QuestHUD"
             id="edu.columbia.cs.psl.halo.client.views.QuestHUD"
-            name="Quests HUD"
+            name="HALO Quests"
             restorable="true">
       </view>
    </extension>
@@ -31,16 +30,18 @@
       <perspectiveExtension
             targetID="org.eclipse.jdt.ui.JavaPerspective">
          <view
-               ratio="0.5"
-               relative="org.eclipse.ui.views.TaskList"
-               relationship="right"
-               id="edu.columbia.cs.psl.halo.client.views.SampleView">
+               id="edu.columbia.cs.psl.halo.client.views.DashboardView"
+               minimized="false"
+               relationship="stack"
+               relative="org.eclipse.ui.views.ProblemView"
+               visible="true">
          </view>
          <view
-               id="edu.columbia.cs.psl.halo.client.views.DashboardView"
+               id="edu.columbia.cs.psl.halo.client.views.QuestHUD"
                minimized="false"
-               relationship="right"
-               relative="org.eclipse.ui.views.TaskList">
+               relationship="stack"
+               relative="org.eclipse.ui.views.ContentOutline"
+               visible="true">
          </view>
       </perspectiveExtension>
    </extension>
diff --git a/halo-se/src/edu/columbia/cs/psl/halo/client/Activator.java b/halo-se/src/edu/columbia/cs/psl/halo/client/Activator.java
index 1a74485..666e8af 100644
--- a/halo-se/src/edu/columbia/cs/psl/halo/client/Activator.java
+++ b/halo-se/src/edu/columbia/cs/psl/halo/client/Activator.java
@@ -11,8 +11,6 @@ import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.equinox.security.auth.ILoginContext;
-import org.eclipse.equinox.security.auth.LoginContextFactory;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
@@ -35,11 +33,11 @@ public class Activator extends AbstractUIPlugin {
 	 */
 	public Activator() {
 	}
-	private ILoginContext secureCtx;
+//	private ILoginContext secureCtx;

-	public ILoginContext getSecureCtx() {
-		return secureCtx;
-	}
+//	public ILoginContext getSecureCtx() {
+//		return secureCtx;
+//	}
 	/*
 	 * (non-Javadoc)
 	 *
@@ -50,11 +48,9 @@ public class Activator extends AbstractUIPlugin {
 	public void start(BundleContext context) throws Exception {
 		super.start(context);
 		plugin = this;
-		   URL configUrl = getBundle().getEntry("login.conf");
-		   URL fileURL = FileLocator.toFileURL(configUrl);

-		secureCtx = LoginContextFactory.createContext("HALOLogin",fileURL, new LoginCallbackHandler());
-		secureCtx.login();
+//		secureCtx = LoginContextFactory.createContext("HALOLogin",fileURL, new LoginCallbackHandler());
+//		secureCtx.login();
 	}

 	/*
diff --git a/halo-se/src/edu/columbia/cs/psl/halo/client/FBTokenChecker.java b/halo-se/src/edu/columbia/cs/psl/halo/client/FBTokenChecker.java
index c12e3c1..90d1158 100644
--- a/halo-se/src/edu/columbia/cs/psl/halo/client/FBTokenChecker.java
+++ b/halo-se/src/edu/columbia/cs/psl/halo/client/FBTokenChecker.java
@@ -34,7 +34,8 @@ public class FBTokenChecker {
 				@Override
 				public void run() {
 					try {
-						u= HALOServiceFactory.getInstance().getUserSvc().getMe();
+						HALOServiceFactory.getInstance().refreshMe();
+						u= HALOServiceFactory.getInstance().getMe();
 						if (u.isFBKeyFlag())
 							parentView.facebookLoginUpdated(true);
 						else
diff --git a/halo-se/src/edu/columbia/cs/psl/halo/client/Util.java b/halo-se/src/edu/columbia/cs/psl/halo/client/Util.java
index c114f20..98fe07f 100644
--- a/halo-se/src/edu/columbia/cs/psl/halo/client/Util.java
+++ b/halo-se/src/edu/columbia/cs/psl/halo/client/Util.java
@@ -65,7 +65,7 @@ public class Util {
 				ret +=" and ";
 			}
 			if(past)
-				ret += "ago";
+				ret += " ago";
 			else
 				ret = "in " + ret;
 			return ret;
diff --git a/halo-se/src/edu/columbia/cs/psl/halo/client/fbTester.java b/halo-se/src/edu/columbia/cs/psl/halo/client/fbTester.java
new file mode 100644
index 0000000..218d374
--- /dev/null
+++ b/halo-se/src/edu/columbia/cs/psl/halo/client/fbTester.java
@@ -0,0 +1,10 @@
+package edu.columbia.cs.psl.halo.client;
+
+import edu.columbia.cs.psl.halo.HALOServiceFactory;
+
+public class fbTester {
+	public static void main(String[] args) {
+		HALOServiceFactory.getInstance().login("jon", "test123");
+//		HALOServiceFactory.getInstance().getUserSvc().postQuestCopmletionToFacebook(null);
+	}
+}
diff --git a/halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardComposite.java b/halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardComposite.java
index b520745..1aea875 100644
--- a/halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardComposite.java
+++ b/halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardComposite.java
@@ -2,28 +2,30 @@ package edu.columbia.cs.psl.halo.client.views;

 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.Collection;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;

+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
 import org.eclipse.core.runtime.preferences.InstanceScope;
 import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.browser.*;
+import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -35,16 +37,12 @@ import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.ProgressBar;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.browser.IWebBrowser;
 import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+import org.eclipse.ui.dialogs.ListDialog;
 import org.osgi.service.prefs.BackingStoreException;

 import edu.columbia.cs.psl.halo.HALOServiceFactory;
@@ -52,16 +50,15 @@ import edu.columbia.cs.psl.halo.client.Activator;
 import edu.columbia.cs.psl.halo.client.FBTokenChecker;
 import edu.columbia.cs.psl.halo.client.Util;
 import edu.columbia.cs.psl.halo.client.wrapper.UserWrapper;
-import edu.columbia.cs.psl.halo.entity.User;
 import edu.columbia.cs.psl.halo.server.stubs.AchievementRecord;
 import edu.columbia.cs.psl.halo.server.stubs.Assignment;
-import edu.columbia.cs.psl.halo.server.stubs.Course;
 import edu.columbia.cs.psl.halo.server.stubs.Enrollment;
 import edu.columbia.cs.psl.halo.server.stubs.EnrollmentType;
 import edu.columbia.cs.psl.halo.server.stubs.Level;
 import edu.columbia.cs.psl.halo.server.stubs.Quest;
 import edu.columbia.cs.psl.halo.server.stubs.QuestProgress;
 import edu.columbia.cs.psl.halo.server.stubs.Task;
+import edu.columbia.cs.psl.halo.server.stubs.Title;

 public class DashboardComposite extends Composite {

@@ -83,7 +80,7 @@ public class DashboardComposite extends Composite {
 		this.dashboard = dashboard;
 		initGUI();
 		setLayout(new GridLayout(1, true));
-
+
 		// this.addFocusListener(new FocusAdapter() {
 		// @Override
 		// public void focusGained(FocusEvent e) {
@@ -99,14 +96,19 @@ public class DashboardComposite extends Composite {
 	private Thermometer questProgressBar;
 	private Label curLevel;
 	private Label nextLevel;
+	private Label leaderLabel;
+
 	private Button logout;
 	private Composite assignmentsInfo;
+	private Composite leaderInfo;
+
 	private Button changePassword;
 	private Button facebookLogin;
 	private FBTokenChecker fastFBChecker;
+	private Button changeTitle;
 	IWebBrowser browser;

-
+
 	private Label recentAchievements;

 	Composite topRow;
@@ -128,7 +130,6 @@ public class DashboardComposite extends Composite {
 	 * @param nowLoggedIn
 	 */
 	public void setFBButtonText(boolean nowLoggedIn) {
-		System.out.println("wasLoggedIn: "+wasLoggedIn+", nowLoggedIn: "+nowLoggedIn);
 		if (wasLoggedIn ^ nowLoggedIn) {
 			if (fastFBChecker != null) {
 				fastFBChecker.stop();
@@ -146,8 +147,136 @@ public class DashboardComposite extends Composite {
 		}
 		wasLoggedIn = nowLoggedIn;
 	}
-
-
+
+	private void changeTitleSelected(SelectionEvent e)
+	{
+
+		List<Title> titles = HALOServiceFactory.getInstance().getUserSvc().getMyTitles();
+		if(titles.size() == 0)
+		{
+			MessageDialog.openError(getShell(), "Unable to select a title", "You have not unlocked any titles, so you may not select one to be displayed with your name");
+			return;
+		}
+		else if(titles.size() == 1)
+		{
+			MessageDialog.openError(getShell(), "Unable to select a title", "You have unlocked only one title, which will be displayed with your name. You can not change your selected title until you unlock more than one.");
+		}
+		ListDialog dlg = new ListDialog(getShell());
+		dlg.setTitle("Select a title to be displayed with your name");
+		dlg.setBlockOnOpen(true);
+		dlg.setContentProvider(new ArrayContentProvider());
+		dlg.setInput(titles.toArray());
+		dlg.setLabelProvider(new ILabelProvider() {
+
+			@Override
+			public void removeListener(ILabelProviderListener listener) {
+				// TODO Auto-generated method stub
+
+			}
+
+			@Override
+			public boolean isLabelProperty(Object element, String property) {
+				// TODO Auto-generated method stub
+				return false;
+			}
+
+			@Override
+			public void dispose() {
+				// TODO Auto-generated method stub
+
+			}
+
+			@Override
+			public void addListener(ILabelProviderListener listener) {
+				// TODO Auto-generated method stub
+
+			}
+
+			@Override
+			public String getText(Object element) {
+				return ((Title) element).getTitle();
+			}
+
+			@Override
+			public Image getImage(Object element) {
+				// TODO Auto-generated method stub
+				return null;
+			}
+		});
+		dlg.open();
+		if(dlg.getResult() != null && dlg.getResult().length == 1)
+		{
+			HALOServiceFactory.getInstance().getUserSvc().setDefaultTitle(((Title) dlg.getResult()[0]));
+			UserWrapper uw = new UserWrapper(HALOServiceFactory.getInstance()
+					.getMe());
+			uw.setActiveTitle(((Title) dlg.getResult()[0]));
+			if (!nameLabel.getText().equals(uw.getFullName()))
+				nameLabel.setText(uw.getFullName());
+			forceRelayout();
+			updateWindow();
+			MessageDialog.openInformation(getShell(), "Success", "Your active title selection has been updated");
+		}
+	}
+
+	private void logoutButtonSelected(SelectionEvent e)
+	{
+		IEclipsePreferences node = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);
+
+		node.remove("username");
+		node.remove("password");
+		try {
+			node.flush();
+		}
+		catch(BackingStoreException ex)
+		{
+
+		}
+		HALOServiceFactory.getInstance().logout();
+		IWorkbenchPage page = dashboard.getSite()
+				.getPage();
+		QuestHUD view = (QuestHUD) page
+				.findView(QuestHUD.ID);
+		if(view != null)
+			view.loggedOut();
+		dashboard.loggedOut();
+	}
+	private void facebookLoginSelected(SelectionEvent e)
+	{
+		HALOServiceFactory.getInstance().refreshMe();
+
+		IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
+		try {
+			browser = support.createBrowser("halo-fb");
+			boolean loggedIn = HALOServiceFactory.getInstance().getMe().isFBKeyFlag();
+			if (!loggedIn) {
+				browser.openURL(new URL("http://www.facebook.com/login.php?api_key=191177150954478&connect_display=popup&v=1.0&next=http://amos.cs.columbia.edu:18585/halo-se-web/FacebookCallback%3Fuid="+HALOServiceFactory.getInstance().getMe().getId()+"&cancel_url=http://www.facebook.com/connect/login_failure.html&fbconnect=true&return_session=true&req_perms=read_stream, publish_stream, offline_access"));
+				fastFBChecker = new FBTokenChecker(5, dashboard);
+			}
+			else
+				dashboard.facebookLoginUpdated(false);
+		} catch (PartInitException e1) {
+			e1.printStackTrace();
+		} catch (MalformedURLException e2) {
+			e2.printStackTrace();
+		};
+	}
+
+	private void changePasswordButtonSelected(SelectionEvent e)
+	{
+		// TODO Auto-generated method stub
+		PasswordChangeDialog newPassDlg = new PasswordChangeDialog(getShell());
+		newPassDlg.open();
+		String newPass = newPassDlg.getPassword();
+
+		if(newPass != null && !newPass.equals(""))
+		{
+			HALOServiceFactory.getInstance().getUserSvc().setPassword(UserWrapper.getEncryptedPassword(newPass));
+			HALOServiceFactory.getInstance().login(HALOServiceFactory.getInstance().getMe().getEmail(), newPass);
+
+			MessageDialog confDlg = new MessageDialog(getShell(), "Success", null, "Your password was successfully updated", SWT.None, new String[]{"OK"}, 0);
+			confDlg.open();
+		}
+	}
 	private void initGUI() {
 		GridData d = new GridData();
 		d.grabExcessHorizontalSpace = true;
@@ -155,9 +284,20 @@ public class DashboardComposite extends Composite {
 		topRow.setLayoutData(d);
 		topRow.setLayout(new GridLayout(3, false));

-		nameLabel = new Label(topRow, SWT.None);
-		nameLabel.setText("Your name here!");
+		Composite nameArea = new Composite(topRow, SWT.None);
+		nameArea.setLayout(new GridLayout(2, false));
+		nameLabel = new Label(nameArea, SWT.None);
+		nameLabel.setText("Loading...");
 		setFontSize(nameLabel, H1_SIZE, true);
+		changeTitle = new Button(nameArea, SWT.PUSH);
+		changeTitle.setText("Select Title");
+
+		changeTitle.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				changeTitleSelected(e);
+			}
+		});

 		Canvas spacer = new Canvas(topRow, SWT.NONE);
 		GridData data = new GridData(GridData.FILL, GridData.FILL, true, true);
@@ -210,7 +350,7 @@ public class DashboardComposite extends Composite {
 		expProgress.setLayoutData(data);
 		expProgress.setMinimum(0);
 		expProgress.setMaximum(1000);
-		expProgress.setSelection(700, "Partway there");
+		expProgress.setSelection(700, "Loading...");

 		bottomRow = new Composite(this, SWT.None);
 		d = new GridData();
@@ -218,7 +358,7 @@ public class DashboardComposite extends Composite {
 		d.grabExcessVerticalSpace = true;
 		d.horizontalAlignment = GridData.FILL;
 		bottomRow.setLayoutData(d);
-		bottomRow.setLayout(new GridLayout(5, false));
+		bottomRow.setLayout(new GridLayout(7, false));

 		spacer = new Canvas(bottomRow, SWT.NONE);
 		data = new GridData(GridData.FILL, GridData.FILL, true, true);
@@ -254,7 +394,7 @@ public class DashboardComposite extends Composite {

 		recentAchievements = new Label(achievementsArea, SWT.NONE);
 		recentAchievements
-				.setText("Flash's quest - super long thing here\nWelcome aboard! - 3/5/11");
+		.setText("Loading... Loading.... Loading...");
 		setFontSize(recentAchievements, H3_SIZE, false);

 		data = new GridData();
@@ -278,7 +418,7 @@ public class DashboardComposite extends Composite {
 		questProgressBar = new Thermometer(questBar, SWT.NULL);
 		questProgressBar.setMinimum(0);
 		questProgressBar.setMaximum(1000);
-		questProgressBar.setSelection(700, "Foobar");
+		questProgressBar.setSelection(700, "Loading...");
 		// questBar.setBackground(new Color(getDisplay(),0,255,0));

 		assignmentsInfo = new Composite(questBar, SWT.NONE);
@@ -291,108 +431,62 @@ public class DashboardComposite extends Composite {
 		spacer = new Canvas(bottomRow, SWT.NONE);
 		data = new GridData(GridData.FILL, GridData.FILL, true, true);
 		spacer.setLayoutData(data);
+
+		leaderInfo = new Composite(bottomRow, SWT.None);
+//		leaderLabel = new Label(bottomRow, SWT.None);
+
+		data = new GridData();
+		data.verticalAlignment = SWT.TOP;
+		leaderInfo.setLayoutData(data);
+		leaderInfo.setLayout(new GridLayout());
+		Label leaders = new Label(leaderInfo, SWT.None);
+		leaders.setText("Leaders");
+		setFontSize(leaders, H3_SIZE, true);
+		leaderLabel = new Label(leaderInfo, SWT.None);
+		leaderLabel.setText("Loading...\nLoading...\nLoading...");
+
+		spacer = new Canvas(bottomRow, SWT.NONE);
+		data = new GridData(GridData.FILL, GridData.FILL, true, true);
+		spacer.setLayoutData(data);

 		final Composite buttons = new Composite(this, SWT.NONE);
 		buttons.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false));
 		buttons.setLayout(new FillLayout());
-
+
 		facebookLogin = new Button(buttons, SWT.PUSH);
-		facebookLogin.setText("Log in to The Facebook");
-
+		facebookLogin.setText("Log in to Facebook");
+
 		changePassword = new Button(buttons,SWT.PUSH);
 		changePassword.setText("Change Password");
-
+
 		logout = new Button(buttons, SWT.PUSH);
 		logout.setText("Logout");


-
-		logout.addSelectionListener(new SelectionListener() {
-
+
+		logout.addSelectionListener(new SelectionAdapter() {
+
 			@Override
 			public void widgetSelected(SelectionEvent e) {
-				IEclipsePreferences node = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);
-
-					node.remove("username");
-					node.remove("password");
-				try {
-					node.flush();
-				}
-				catch(BackingStoreException ex)
-				{
-
-				}
-				HALOServiceFactory.getInstance().logout();
-				IWorkbenchPage page = dashboard.getSite()
-						.getPage();
-				QuestHUD view = (QuestHUD) page
-						.findView(QuestHUD.ID);
-				if(view != null)
-					view.loggedOut();
-				dashboard.loggedOut();
-			}
-
-			@Override
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// TODO Auto-generated method stub
-
+				logoutButtonSelected(e);
 			}
 		});
-
-
-		facebookLogin.addSelectionListener(new SelectionListener() {
-
+
+
+		facebookLogin.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
-				IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
-				try {
-					browser = support.createBrowser("halo-fb");
-					boolean loggedIn = HALOServiceFactory.getInstance().getUserSvc().getMe().isFBKeyFlag();
-					if (!loggedIn) {
-						browser.openURL(new URL("http://www.facebook.com/login.php?api_key=191177150954478&connect_display=popup&v=1.0&next=http://ase.cs.columbia.edu/halo/%3Fuid=3&cancel_url=http://www.facebook.com/connect/login_failure.html&fbconnect=true&return_session=true&req_perms=read_stream, publish_stream, offline_access"));
-						fastFBChecker = new FBTokenChecker(5, dashboard);
-					}
-					else
-						dashboard.facebookLoginUpdated(false);
-				} catch (PartInitException e1) {
-					e1.printStackTrace();
-				} catch (MalformedURLException e2) {
-					e2.printStackTrace();
-				};
-			}
-
-			@Override
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// TODO Auto-generated method stub
-
+				facebookLoginSelected(e);
 			}
 		});
-
-
-		changePassword.addSelectionListener(new SelectionListener() {
-
+
+
+		changePassword.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
-				// TODO Auto-generated method stub
-				PasswordChangeDialog newPassDlg = new PasswordChangeDialog(getShell());
-				newPassDlg.open();
-				String newPass = newPassDlg.getPassword();
-
-				if(newPass != null && !newPass.equals(""))
-				{
-					HALOServiceFactory.getInstance().getUserSvc().setPassword(UserWrapper.getEncryptedPassword(newPass));
-					HALOServiceFactory.getInstance().login(HALOServiceFactory.getInstance().getMe().getEmail(), newPass);
-
-					MessageDialog confDlg = new MessageDialog(getShell(), "Success", null, "Your password was successfully updated", SWT.None, new String[]{"OK"}, 0);
-					confDlg.open();
-				}
-			}
-
-			@Override
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// TODO Auto-generated method stub
-
+				changePasswordButtonSelected(e);
 			}
+
 		});
 		this.getParent().addListener(SWT.Resize, new Listener() {

@@ -407,109 +501,155 @@ public class DashboardComposite extends Composite {

 	public void updateWindow() {
 		if (HALOServiceFactory.getInstance().isLoggedIn()) {
-			UserWrapper uw = new UserWrapper(HALOServiceFactory.getInstance()
-					.getMe());
-			if (!nameLabel.getText().equals(uw.getFullName()))
-				nameLabel.setText(uw.getFullName());

-			topRow.layout(true);
-			if (!curLevel.getText().equals("Level " + uw.getLevel().getLevel()))
-				curLevel.setText("Level " + uw.getLevel().getLevel());
+			Job j = new Job("Updating Dashboard Display") {
+
+				@Override
+				protected IStatus run(IProgressMonitor monitor) {
+					final String leaders = HALOServiceFactory.getInstance().getUserSvc().getLeadersStr();
+					HALOServiceFactory.getInstance().refreshMe();
+					final Level nextLevelLvl = HALOServiceFactory.getInstance().getUserSvc()
+							.getLevel(HALOServiceFactory.getInstance().getMe().getLevel().getLevel() + 1);
+					//					final ArrayList<Thermometer> ts = new ArrayList<Thermometer>();
+					final HashMap<Task, QuestProgress> progress = new HashMap<Task, QuestProgress>();
+					for (QuestProgress p : HALOServiceFactory.getInstance()
+							.getUserSvc().getMyProgress()) {
+						progress.put(p.getTask(), p);
+					}
+					final HashMap<Assignment,ArrayList<Quest>> quests = new HashMap<Assignment, ArrayList<Quest>>();
+					for (Enrollment e : HALOServiceFactory.getInstance().getUserSvc()
+							.getEnrollments()) {
+						if (e.getCourse() != null && e.getType().equals(EnrollmentType.STUDENT)) {
+							for (Assignment a : HALOServiceFactory.getInstance()
+									.getUserSvc().getAssignmentsFor(e.getCourse())) {
+								quests.put(a, new ArrayList<Quest>());
+
+								for (Quest q : HALOServiceFactory.getInstance()
+										.getUserSvc().getAllQuestsFor(a)) {
+									quests.get(a).add(q);
+								}
+							}
+						}
+					}

-			Level nextLevelLvl = HALOServiceFactory.getInstance().getUserSvc()
-					.getLevel(uw.getLevel().getLevel() + 1);
+					String recentAchievemntsTxt = "";

-			if (!nextLevel.getText().equals(
-					"Level " + (uw.getLevel().getLevel() + 1)))
-				nextLevel.setText("Level " + (uw.getLevel().getLevel() + 1));
+					int n = 0;
+					for (AchievementRecord a : HALOServiceFactory.getInstance()
+							.getUserSvc().getMyAchievements()) {
+						recentAchievemntsTxt += a.getAchievement().getName() + " - "
+								+ Util.formatDate(a.getCompletionTime()) + "\n";
+						n++;
+						if(n > 5)
+							break;
+					}

-			expProgress.setMaximum(nextLevelLvl.getXpRequired());
-			if (expProgress.getValue() != uw.getXp())
-				expProgress.setSelection(uw.getXp(), uw.getXp() + " of "
-						+ nextLevelLvl.getXpRequired());
+					final String achvTxt = recentAchievemntsTxt;
+					final int maxAchievement = HALOServiceFactory.getInstance().getUserSvc().getMaxAchievementPts();
+
+					Display.getDefault().syncExec(new Runnable() {
+
+						@Override
+						public void run() {
+							leaderLabel.setText(leaders);
+							leaderInfo.layout(true);
+							UserWrapper uw = new UserWrapper(HALOServiceFactory.getInstance()
+									.getMe());
+							if (!nameLabel.getText().equals(uw.getFullName()))
+								nameLabel.setText(uw.getFullName());
+
+							topRow.layout(true);
+							if (!curLevel.getText().equals("Level " + uw.getLevel().getLevel()))
+								curLevel.setText("Level " + uw.getLevel().getLevel());
+
+							//Update the facebook login stuff
+							dashboard.facebookLoginUpdated(uw.isFBKeyFlag());
+
+							achievementsProgress.setMaximum(maxAchievement);
+
+							for (Control c : assignmentsInfo.getChildren())
+								c.dispose();
+							int n_quests = 0;
+							int n_quests_done = 0;
+							for(Assignment a : quests.keySet())
+							{
+								Label l = new Label(assignmentsInfo, SWT.NONE);
+								l.setText(a.getTitle());
+								int max = 0;
+								int done = 0;
+								for(Quest q : quests.get(a))
+								{
+									boolean complete =true;
+									for(Task ta : q.getTasks())
+									{
+										if(!(progress.containsKey(ta) && progress.get(ta).isCompleted()))
+											complete = false;
+									}
+									if (complete) {
+										done++;
+										n_quests_done++;
+									}
+									n_quests++;
+									max++;
+								}
+								Thermometer t = new Thermometer(assignmentsInfo,
+										SWT.NONE);
+								t.setMinimum(0);
+								t.setMaximum(max);
+								t.setSelection(done, done + " of " + max + " quests");
+								//								ts.add(t);
+
+								Label ll = new Label(assignmentsInfo, SWT.NONE);
+								ll.setText("Due " + Util.getDueStrHuman(a.getDueOn()));

-			int maxAchievement = HALOServiceFactory.getInstance().getUserSvc().getMaxAchievementPts();
-			achievementsProgress.setMaximum(maxAchievement);
+							}
+							if (!nextLevel.getText().equals(
+									"Level " + (uw.getLevel().getLevel() + 1)))
+								nextLevel.setText("Level " + (uw.getLevel().getLevel() + 1));

-			if (achievementsProgress.getValue() != uw.getAchievementPoints())
-				achievementsProgress.setSelection(uw.getAchievementPoints(),
-						uw.getAchievementPoints() + " points of " + maxAchievement);
-			// achievementsStatus.setText("3 achievements completed of 15");
-			String recentAchievemntsTxt = "";
+							expProgress.setMaximum(nextLevelLvl.getXpRequired());
+							if (expProgress.getValue() != uw.getXp())
+								expProgress.setSelection(uw.getXp(), uw.getXp() + " of "
+										+ nextLevelLvl.getXpRequired());

-			for (AchievementRecord a : HALOServiceFactory.getInstance()
-					.getUserSvc().getMyAchievements()) {
-				recentAchievemntsTxt += a.getAchievement().getName() + " - "
-						+ Util.formatDate(a.getCompletionTime()) + "\n";
-			}
-			if (!recentAchievements.getText().equals(recentAchievemntsTxt))
-			{
-				recentAchievements.setText(recentAchievemntsTxt);
-			}
-
-			for (Control c : assignmentsInfo.getChildren())
-				c.dispose();
-			assignmentsInfo.layout(true);
-			assignmentsInfo.setLayout(new GridLayout(3, false));
-
-			HashMap<Task, QuestProgress> progress = new HashMap<Task, QuestProgress>();
-			for (QuestProgress p : HALOServiceFactory.getInstance()
-					.getUserSvc().getMyProgress()) {
-				progress.put(p.getTask(), p);
-			}
-			int n_quests = 0;
-			int n_quests_done = 0;
-			//Update the facebook login stuff
-			dashboard.facebookLoginUpdated(uw.isFBKeyFlag());
-
-			for (Enrollment e : HALOServiceFactory.getInstance().getUserSvc()
-					.getEnrollments()) {
-				if (e.getCourse() != null && e.getType().equals(EnrollmentType.STUDENT)) {
-					for (Assignment a : HALOServiceFactory.getInstance()
-							.getUserSvc().getAssignmentsFor(e.getCourse())) {
-						Label l = new Label(assignmentsInfo, SWT.NONE);
-						l.setText(a.getTitle());
-						Thermometer t = new Thermometer(assignmentsInfo,
-								SWT.NONE);
-						int max = 0;
-						int done = 0;
-						for (Quest q : HALOServiceFactory.getInstance()
-								.getUserSvc().getAllQuestsFor(a)) {
-							boolean complete =true;
-							for(Task ta : q.getTasks())
+
+							questProgressBar.setMinimum(0);
+							questProgressBar.setMaximum(n_quests);
+							questProgressBar.setSelection(n_quests_done, n_quests_done + " of " + n_quests);
+
+							if (!recentAchievements.getText().equals(achvTxt))
 							{
-								if(!(progress.containsKey(ta) && progress.get(ta).isCompleted()))
-									complete = false;
+								recentAchievements.setText(achvTxt);
 							}
-							if (complete) {
-								done++;
-								n_quests_done++;
-							}
-							n_quests++;
-							max++;
-						}
-						t.setMinimum(0);
-						t.setMaximum(max);
-						t.setSelection(done, done + " of " + max + " quests");

-						Label ll = new Label(assignmentsInfo, SWT.NONE);
-						ll.setText("Due " + Util.getDueStrHuman(a.getDueOn()));
-					}
-				}
-			}
-			questProgressBar.setMinimum(0);
-			questProgressBar.setMaximum(n_quests);
-			questProgressBar.setSelection(n_quests_done, n_quests_done + " of " + n_quests);
-
+							if (achievementsProgress.getValue() != uw.getAchievementPoints())
+								achievementsProgress.setSelection(uw.getAchievementPoints(),
+										uw.getAchievementPoints() + " points of " + maxAchievement);

-
-			pack(true);
-			this.getShell().layout(true);
-			((GridData) topRow.getLayoutData()).widthHint = getParent()
-					.getBounds().width;
-			((GridData) bottomRow.getLayoutData()).widthHint = getParent()
-					.getBounds().width;
+							forceRelayout();
+
+						}
+					});
+					return Status.OK_STATUS;
+				}
+			};
+			j.schedule();
 		}
 	}
-
+	private void forceRelayout()
+	{
+//		pack(true);
+		dashboard.dashboardComposite.layout(true,true);
+
+		((GridData) topRow.getLayoutData()).widthHint = getParent()
+				.getBounds().width;
+		((GridData) bottomRow.getLayoutData()).widthHint = getParent()
+				.getBounds().width;
+
+		Rectangle r = dashboard.dashboardScroller.getClientArea();
+		dashboard.dashboardScroller.setMinSize(dashboard.dashboardComposite.computeSize(
+				r.width, SWT.DEFAULT));
+
+	}
+
 }
diff --git a/halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardView.java b/halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardView.java
index f704f5d..56b5bad 100644
--- a/halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardView.java
+++ b/halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardView.java
@@ -1,5 +1,8 @@
 package edu.columbia.cs.psl.halo.client.views;

+import java.util.Timer;
+import java.util.TimerTask;
+
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.ScrolledComposite;
 import org.eclipse.swt.custom.StackLayout;
@@ -11,6 +14,7 @@ import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.part.ViewPart;

 import edu.columbia.cs.psl.halo.HALOServiceFactory;
@@ -23,7 +27,6 @@ public class DashboardView extends ViewPart {
 	private boolean wasLoggedIn = false;
 	public void facebookLoginUpdated(boolean nowLoggedIn)
 	{
-		System.out.println("fbLoginUpdated: wasLoggedIn: "+wasLoggedIn+", nowLoggedIn: "+nowLoggedIn);
 		if ((wasLoggedIn == true) && (nowLoggedIn == false)) {
 			HALOServiceFactory.getInstance().getUserSvc().logoutOfFacebook();
 		}
@@ -72,7 +75,7 @@ public class DashboardView extends ViewPart {
 		parentLayout.topControl = loginComposite;
 		parent.layout(true);
 	}
-
+	private Timer refreshTimer;
 	void loggedIn() {
 		parentLayout.topControl = dashboardScroller;
 		parent.layout();
@@ -81,10 +84,24 @@ public class DashboardView extends ViewPart {
 		Rectangle r = dashboardScroller.getClientArea();
 		dashboardScroller.setMinSize(dashboardComposite.computeSize(
 				r.width, SWT.DEFAULT));
-
+		refreshTimer = new Timer(true);
+		refreshTimer.schedule(new TimerTask() {
+
+			@Override
+			public void run() {
+				updateWindow();
+				IWorkbenchPage page = getSite()
+						.getPage();
+				QuestHUD view = (QuestHUD) page
+						.findView(QuestHUD.ID);
+				view.updateQuests();
+			}
+		}, 30000, 30000);
 	}

 	void loggedOut() {
+		refreshTimer.cancel();
+		refreshTimer = null;
 		parentLayout.topControl = loginComposite;
 		parent.layout(true);
 	}
diff --git a/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java b/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java
index cb29821..435e2cb 100644
--- a/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java
+++ b/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java
@@ -3,6 +3,8 @@ package edu.columbia.cs.psl.halo.client.views;
 import java.io.File;
 import java.net.MalformedURLException;
 import java.security.PrivilegedAction;
+import java.util.Timer;
+import java.util.TimerTask;

 import javax.security.auth.Subject;
 import javax.security.auth.login.LoginException;
@@ -265,7 +267,8 @@ public class LoginComposite extends Composite {
 		data.horizontalSpan = 2;
 		fTextPassword.setLayoutData(data);
 	}
-
+
+
 	private String rememberToken = null;
 	private void handleButtonOKWidgetSelected() {
 		final String username = fTextUsername.getText();
@@ -301,6 +304,7 @@ public class LoginComposite extends Composite {
 					}
 					if (res) {
 						rememberToken =  HALOServiceFactory.getInstance().getUserSvc().getRememberMeToken();
+
 						return Status.OK_STATUS;
 					} else {
 						return Status.CANCEL_STATUS;
diff --git a/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java b/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java
index 1122935..99c207c 100644
--- a/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java
+++ b/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java
@@ -53,6 +53,7 @@ import org.eclipse.swt.widgets.MessageBox;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Tree;
 import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.forms.widgets.TableWrapData;
 import org.eclipse.ui.forms.widgets.TableWrapLayout;
 import org.eclipse.ui.part.ViewPart;
@@ -149,88 +150,6 @@ public class QuestHUD extends ViewPart {
 				}
 			return true;
 		}
-//		@Override
-//		public void sort(Viewer viewer, Object[] elements) {
-//			System.out.println("running sort");
-//			if(elements.length > 0)
-//			{
-//				if(elements[0] instanceof Assignment)
-//				{
-//					ArrayList<Assignment> sorted = new ArrayList<Assignment>(elements.length);
-//					for(Object o : elements)
-//						sorted.add((Assignment) o);
-//					Collections.sort(sorted, new Comparator<Assignment>() {
-//
-//						@Override
-//						public int compare(Assignment o1, Assignment o2) {
-//							boolean o1Done = assignmentCompleted(o1);
-//							boolean o2Done = assignmentCompleted(o2);
-//
-//							if(o1Done && ! o2Done)
-//								return 1;
-//							else if(o2Done && ! o1Done)
-//								return -1;
-//							else if(o1.getDueOn() != null && o2.getDueOn() != null)
-//								return o1.getDueOn().compare(o2.getDueOn());
-//							else
-//								return (o1.getId() < o2.getId() ? -1 : 1);
-//						}
-//					});
-//					for(Assignment a : sorted)
-//					{
-//						System.out.println(a.getTitle());
-//					}
-//					elements = sorted.toArray();
-//				}
-//				else if (elements[0] instanceof Quest) {
-//					ArrayList<Quest> sorted = new ArrayList<Quest>(elements.length);
-//					for(Object o : elements)
-//						sorted.add((Quest) o);
-//					Collections.sort(sorted, new Comparator<Quest>() {
-//
-//						@Override
-//						public int compare(Quest o1, Quest o2) {
-//							boolean o1Done = questCompleted(o1);
-//							boolean o2Done = questCompleted(o2);
-//
-//							if(o1Done && ! o2Done)
-//								return 1;
-//							else if(o2Done && ! o1Done)
-//								return -1;
-//							else
-//								return (o1.getId() < o2.getId() ? -1 : 1);
-//						}
-//					});
-//					System.out.println(sorted);
-//					elements = sorted.toArray();
-//				}
-//				else if(elements[0] instanceof Task)
-//				{
-//					ArrayList<Task> sorted = new ArrayList<Task>(elements.length);
-//					for(Object o : elements)
-//						sorted.add((Task) o);
-//					Collections.sort(sorted, new Comparator<Task>() {
-//
-//						@Override
-//						public int compare(Task o1, Task o2) {
-//							if(!cachedProgress.containsKey(o1) || !cachedProgress.containsKey(o2))
-//								return 0;
-//							boolean o1Done = cachedProgress.get(o1).isCompleted();
-//							boolean o2Done = cachedProgress.get(o2).isCompleted();
-//
-//							if(o1Done && ! o2Done)
-//								return -1;
-//							else if(o2Done && ! o1Done)
-//								return 1;
-//							else
-//								return (o1.getId() < o2.getId() ? -1 : 1);
-//						}
-//					});
-//					System.out.println(sorted);
-//					elements = sorted.toArray();
-//				}
-//			}
-//		}
 	}

 	class QuestDetails extends Composite {
@@ -247,9 +166,10 @@ public class QuestHUD extends ViewPart {

 			this.setLayout(new TableWrapLayout());
 			questTitle = new Label(this, SWT.NONE);
-			questTitle.setText("Batman's Quest");
+			questTitle.setText("Batman's Quest, the really long one.");
+			questTitle.setLayoutData(new TableWrapData());
 			FontData[] fD = questTitle.getFont().getFontData();
-			fD[0].setHeight(24);
+			fD[0].setHeight(16);
 			fD[0].setStyle(SWT.BOLD);
 			questTitle.setFont(new Font(parent.getDisplay(), fD[0]));

@@ -259,13 +179,13 @@ public class QuestHUD extends ViewPart {
 			TableWrapData data = new TableWrapData();
 //			data.widthHint = this.getBounds().width - 20;
 			questDueDate.setLayoutData(data);
-			fD[0].setHeight(16);
+			fD[0].setHeight(12);
 			fD[0].setStyle(SWT.BOLD);
 			questDueDate.setFont(new Font(parent.getDisplay(), fD[0]));

 			backgroundHeader = new Label(this, SWT.NONE);
 			backgroundHeader.setText("Background");
-			fD[0].setHeight(16);
+			fD[0].setHeight(13);
 			fD[0].setStyle(SWT.BOLD);
 			backgroundHeader.setFont(new Font(parent.getDisplay(), fD[0]));

@@ -283,7 +203,7 @@ public class QuestHUD extends ViewPart {

 			objectivesHeader = new Label(this, SWT.NONE);
 			objectivesHeader.setText("Objectives");
-			fD[0].setHeight(16);
+			fD[0].setHeight(13);
 			fD[0].setStyle(SWT.BOLD);
 			objectivesHeader.setFont(new Font(parent.getDisplay(), fD[0]));

@@ -296,49 +216,49 @@ public class QuestHUD extends ViewPart {
 			objectivesBody.setLayoutData(data);
 			fD[0].setStyle(SWT.NORMAL);
 			objectivesBody.setFont(new Font(parent.getDisplay(), fD[0]));
-
-//			parent.addListener(SWT.Resize, new Listener() {
-//				public void handleEvent(Event event) {
-//					int prefWidth = getShell().getBounds().width - 40;
-//					// System.out.println("Pref is " + prefWidth);
-////					TableWrapData data = (TableWrapData) questBackground.getLayoutData();
-////					data.widthHint = prefWidth;
-////					questBackground.setLayoutData(data);
-////					objectivesBody.setLayoutData(data);
-////					data = (GridData) questDueDate.getLayoutData();
-////					data.widthHint = prefWidth;
-////					questDueDate.setLayoutData(data);
-//					getShell().layout(true);
-//				}
-//			});
 		}
-
-		public void setQuest(QuestWrapper w) {
-			questTitle.setText(w.getQuest().getName());
-			questDueDate.setText("(Part of " + w.getAssignment().getTitle()
-					+ ", due " + w.getDueStrHuman() + ")");
-			questBackground.setText(w.getQuest().getDescription());
+		public void setTask(Task t)
+		{
+			questTitle.setText(t.getName());
+			questBackground.setText(t.getDescription());
+			backgroundHeader.setText("Task Details");
+			questDueDate.setText("(Part of " + ((Quest) t.getQuest().getRef()).getName() +")");
+
+			objectivesHeader.setText("");
+			objectivesBody.setText("");
+			refreshLayout();
+		}
+		private void refreshLayout()
+		{
+			setLayout(new TableWrapLayout());
+			Rectangle r = questDetailsScroller.getClientArea();
+			questDetailsScroller.setMinSize(questDetails.computeSize(r.width,
+					SWT.DEFAULT));
+			getParent().layout(true,true);
+		}
+		public void setQuest(Quest w) {
+			questTitle.setText(w.getName());
+			questDueDate.setText("(Part of " + ((Assignment) w.getAssignment().getRef()).getTitle()
+					+ ", due " + QuestWrapper.getDueStrHuman((Assignment) w.getAssignment().getRef()) + ")");
+			questBackground.setText(w.getDescription() + "\nCompleting this quest will reward you with " + w.getExperiencePoints() + " XP");
+			backgroundHeader.setText("Background");

 			String objectives = "";

-			for (Task t : w.getQuest().getTasks()) {
+			for (Task t : w.getTasks()) {
 				objectives += t.getName() + "\n";
 			}
 			objectivesHeader.setText("Objectives");
 			objectivesBody.setText(objectives);
 			objectivesBody.setLayoutData(new TableWrapData());
-			setLayout(new TableWrapLayout());
-			parent.notifyListeners(SWT.Resize, new Event());
-			Rectangle r = questDetailsScroller.getClientArea();
-			questDetailsScroller.setMinSize(questDetails.computeSize(r.width,
-					SWT.DEFAULT));
-			getParent().layout(true);
+			refreshLayout();

 		}
 		public void setAssignment(Assignment w) {
 			questTitle.setText(w.getTitle());
 			questDueDate.setText("Due " + QuestWrapper.getDueStrHuman(w));
 			questBackground.setText(w.getDescription());
+			backgroundHeader.setText("Background");

 			String objectives = "";
 			objectivesHeader.setText("Quests");
@@ -346,10 +266,6 @@ public class QuestHUD extends ViewPart {
 				objectives += t.getName() + "\n";
 			}
 			objectivesBody.setText(objectives);
-			Rectangle r = questDetailsScroller.getClientArea();
-			questDetailsScroller.setMinSize(questDetails.computeSize(r.width,
-					SWT.DEFAULT));
-			parent.notifyListeners(SWT.Resize, new Event());
 		}
 	}

@@ -533,7 +449,7 @@ public class QuestHUD extends ViewPart {
 	private QuestDetails questDetails;
 	private ScrolledComposite questDetailsScroller;

-	HashMap<Quest, QuestWrapper> quests;
+	HashMap<Integer, QuestWrapper> quests;
 	Tree questsTree;
 	TreeViewer questsViewer;
 	private Boolean updatingFlag = Boolean.FALSE;
@@ -562,25 +478,53 @@ public class QuestHUD extends ViewPart {

 	private void completeTask(final Task t)
 	{
-		MessageDialogWithToggle dlg = MessageDialogWithToggle.openOkCancelConfirm(parent.getShell(), "Confirm completion", "Complete "+ t.getName(), "Post to Facebook", true, null, null);
-		System.out.println("Done with box");
-
-		if (dlg.getReturnCode() == dlg.OK) {
-			if (dlg.getToggleState() == true) {
+		boolean ok = false;
+		boolean postToFB = false;
+		if(HALOServiceFactory.getInstance().getMe().isFBKeyFlag())
+		{
+			MessageDialogWithToggle dlg = MessageDialogWithToggle.openOkCancelConfirm(parent.getShell(), "Complete Task", "Are you sure you would like to mark this task as completed?\nYou can not reverse this action", "Post to Facebook", true, null, null);
+			ok = dlg.getReturnCode() == dlg.OK;
+			postToFB = dlg.getToggleState();
+		}
+		else
+		{
+			ok = MessageDialog.openConfirm(parent.getShell(), "Complete task", "Are you sure you would like to mark this task as completed?\nYou can not reverse this action");
+		}
+
+
+		if (ok) {
+			if (postToFB) {
 				HALOServiceFactory.getInstance().getUserSvc().postTaskCompletionToFacebook(t);
 			}
+			QuestProgress qp = new QuestProgress();
+			qp.setQuest(t.getQuest());
+			qp.setTask(t);
+			qp.setCompleted(true);
+			qp.setUser(HALOServiceFactory.getInstance().getMe());
+			cachedProgress.put(t, qp);
+
+			questsViewer.refresh(true);
+			questsViewer.expandAll();
+
 			Activator.logBackground("TaskCompleteConfirmed", "" + t.getId());
 			Job j = new Job("Marking task completed") {

 				@Override
 				protected IStatus run(IProgressMonitor monitor) {
-					HALOServiceFactory.getInstance().getUserSvc().markTaskCompleted(t);
+					final String ret = HALOServiceFactory.getInstance().getUserSvc().markTaskCompleted(t);
 					Display.getDefault().syncExec(new Runnable() {

 						@Override
 						public void run() {
+							if(ret != null && !ret.equals(""))
+							{
+								MessageDialog.openInformation(parent.getShell(), "Task Completion Result", ret);
+							}
 							updateQuests();
-
+							IWorkbenchPage page = getSite().getPage();
+							DashboardView view = (DashboardView) page
+									.findView(DashboardView.ID);
+							view.updateWindow();
 						}
 					});
 					return Status.OK_STATUS;
@@ -640,7 +584,6 @@ public class QuestHUD extends ViewPart {
 									{
 										completeTask(t);
 									}
-									questsViewer.refresh();
 								}
 							}
 						}
@@ -684,12 +627,27 @@ public class QuestHUD extends ViewPart {
 						if (event.getSelection() instanceof IStructuredSelection) {
 							IStructuredSelection selection = (IStructuredSelection) event
 									.getSelection();
-							QuestWrapper qw = null;
+//							QuestWrapper qw = null;
 							if ((selection.getFirstElement()) instanceof Quest) {
-								qw = quests.get(((Quest) selection.getFirstElement()));
+//								System.out.println(((Quest) selection.getFirstElement()).getId());
+								Quest q = ((Quest) selection.getFirstElement());
+//								if(qw == null)
+//								{
+//									questsViewer.setSelection(null);
+//									return;
+//								}
+								Activator.logBackground("QuestHUDQuestOrTaskSelected", "" + q.getId());
+								detailsLayout.topControl = questDetailsScroller;
+								questDetails.setQuest(q);
+								refreshLayout();
 							}
 							else if((selection.getFirstElement()) instanceof Task) {
-								qw = quests.get(((Quest) ((Task) selection.getFirstElement()).getQuest().getRef()));
+//								qw = quests.get(((Quest) ((Task) selection.getFirstElement()).getQuest().getRef()));
+								Task t = ((Task) selection.getFirstElement());
+								Activator.logBackground("QuestHUDTaskSelected", "" + t.getId());
+								detailsLayout.topControl = questDetailsScroller;
+								questDetails.setTask(t);
+								refreshLayout();
 							}
 							else if((selection.getFirstElement()) instanceof Assignment) {

@@ -697,21 +655,7 @@ public class QuestHUD extends ViewPart {
 								Activator.logBackground("QuestHUDAssignmentSelected", "" + a.getId());
 								detailsLayout.topControl = questDetailsScroller;
 								questDetails.setAssignment(a);
-								detailsArea.layout(true);
-								parent.notifyListeners(SWT.Resize, new Event());
-								parent.layout(true);
-								detailsArea.layout(true);
-								questDetailsScroller.layout(true);
-							}
-							if(qw != null){
-								Activator.logBackground("QuestHUDQuestOrTaskSelected", "" + qw.getQuest().getId());
-								detailsLayout.topControl = questDetailsScroller;
-								questDetails.setQuest(qw);
-								detailsArea.layout(true);
-								parent.notifyListeners(SWT.Resize, new Event());
-								parent.layout(true);
-								detailsArea.layout(true);
-								questDetailsScroller.layout(true);
+								refreshLayout();
 							}
 						}
 					}
@@ -719,7 +663,14 @@ public class QuestHUD extends ViewPart {

 		updateQuests();
 	}
-
+	void refreshLayout()
+	{
+		detailsArea.layout(true,true);
+		parent.notifyListeners(SWT.Resize, new Event());
+		parent.layout(true,true);
+		detailsArea.layout(true,true);
+		questDetailsScroller.layout(true,true);
+	}
 	void loggedIn() {
 		this.layout.topControl = loggedInPanel;
 		parent.layout(true);
@@ -745,7 +696,7 @@ public class QuestHUD extends ViewPart {
 		updateQuests();
 	}

-	private void updateQuests() {
+	public void updateQuests() {
 		synchronized (updatingFlag) {
 			if (updatingFlag)
 				return;
@@ -757,13 +708,13 @@ public class QuestHUD extends ViewPart {

 					@Override
 					protected IStatus run(IProgressMonitor monitor) {
-						quests = new HashMap<Quest,QuestWrapper>();
-						HashMap<Quest, QuestProgress> progress = new HashMap<Quest, QuestProgress>();
+						quests = new HashMap<Integer,QuestWrapper>();
+						HashMap<Integer, QuestProgress> progress = new HashMap<Integer, QuestProgress>();
 						if (HALOServiceFactory.getInstance().getUserSvc()
 								.getMyProgress() != null)
 							for (QuestProgress p : HALOServiceFactory
 									.getInstance().getUserSvc().getMyProgress()) {
-								progress.put(p.getQuest(), p);
+								progress.put(p.getQuest().getId(), p);
 								cachedProgress.put(p.getTask(), p);
 							}
 						for (Enrollment e : HALOServiceFactory.getInstance()
@@ -777,8 +728,8 @@ public class QuestHUD extends ViewPart {
 											.getQuestsFor(a)) {
 										QuestWrapper qw = new QuestWrapper(q,
 												a, e.getCourse(),
-												progress.get(q));
-										quests.put(q,qw);
+												progress.get(q.getId()));
+										quests.put(q.getId(),qw);
 									}
 								}
 							}
@@ -787,7 +738,7 @@ public class QuestHUD extends ViewPart {

 							@Override
 							public void run() {
-								questsViewer.refresh();
+								questsViewer.refresh(true);
 								questsViewer.expandAll();
 								updatingFlag = false;
 							}
diff --git a/halo-se/src/edu/columbia/cs/psl/halo/client/views/SampleView.java b/halo-se/src/edu/columbia/cs/psl/halo/client/views/SampleView.java
deleted file mode 100644
index 68dadfe..0000000
--- a/halo-se/src/edu/columbia/cs/psl/halo/client/views/SampleView.java
+++ /dev/null
@@ -1,207 +0,0 @@
-package edu.columbia.cs.psl.halo.client.views;
-
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ViewPart;
-
-
-/**
- * This sample class demonstrates how to plug-in a new
- * workbench view. The view shows data obtained from the
- * model. The sample creates a dummy model on the fly,
- * but a real implementation would connect to the model
- * available either in this or another plug-in (e.g. the workspace).
- * The view is connected to the model using a content provider.
- * <p>
- * The view uses a label provider to define how model
- * objects should be presented in the view. Each
- * view can present the same model objects using
- * different labels and icons, if needed. Alternatively,
- * a single label provider can be shared between views
- * in order to ensure that objects of the same type are
- * presented in the same way everywhere.
- * <p>
- */
-
-public class SampleView extends ViewPart {
-
-	/**
-	 * The ID of the view as specified by the extension.
-	 */
-	public static final String ID = "edu.columbia.cs.psl.halo.client.views.SampleView";
-
-	private TableViewer viewer;
-	private Action action1;
-	private Action action2;
-	private Action doubleClickAction;
-
-	/*
-	 * The content provider class is responsible for
-	 * providing objects to the view. It can wrap
-	 * existing objects in adapters or simply return
-	 * objects as-is. These objects may be sensitive
-	 * to the current input of the view, or ignore
-	 * it and always show the same content
-	 * (like Task List, for example).
-	 */
-
-	class ViewContentProvider implements IStructuredContentProvider {
-		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-		}
-		public void dispose() {
-		}
-		public Object[] getElements(Object parent) {
-			return new String[] { "One", "Two", "Three" };
-		}
-	}
-	class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
-		public String getColumnText(Object obj, int index) {
-			return getText(obj);
-		}
-		public Image getColumnImage(Object obj, int index) {
-			return getImage(obj);
-		}
-		public Image getImage(Object obj) {
-			return PlatformUI.getWorkbench().
-					getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
-		}
-	}
-	class NameSorter extends ViewerSorter {
-	}
-
-	/**
-	 * The constructor.
-	 */
-	public SampleView() {
-	}
-
-	/**
-	 * This is a callback that will allow us
-	 * to create the viewer and initialize it.
-	 */
-	public void createPartControl(Composite parent) {
-		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		viewer.setContentProvider(new ViewContentProvider());
-		viewer.setLabelProvider(new ViewLabelProvider());
-		viewer.setSorter(new NameSorter());
-		viewer.setInput(getViewSite());
-
-		// Create the help context id for the viewer's control
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "edu.columbia.cs.psl.halo.client.viewer");
-		makeActions();
-		hookContextMenu();
-		hookDoubleClickAction();
-		contributeToActionBars();
-	}
-
-	private void hookContextMenu() {
-		MenuManager menuMgr = new MenuManager("#PopupMenu");
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				SampleView.this.fillContextMenu(manager);
-			}
-		});
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(menuMgr, viewer);
-	}
-
-	private void contributeToActionBars() {
-		IActionBars bars = getViewSite().getActionBars();
-		fillLocalPullDown(bars.getMenuManager());
-		fillLocalToolBar(bars.getToolBarManager());
-	}
-
-	private void fillLocalPullDown(IMenuManager manager) {
-		manager.add(action1);
-		manager.add(new Separator());
-		manager.add(action2);
-	}
-
-	private void fillContextMenu(IMenuManager manager) {
-		manager.add(action1);
-		manager.add(action2);
-		// Other plug-ins can contribute there actions here
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	private void fillLocalToolBar(IToolBarManager manager) {
-		manager.add(action1);
-		manager.add(action2);
-	}
-
-	private void makeActions() {
-		action1 = new Action() {
-			public void run() {
-				showMessage("Action 1 executed");
-			}
-		};
-		action1.setText("Action 1");
-		action1.setToolTipText("Action 1 tooltip");
-		action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
-			getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
-
-		action2 = new Action() {
-			public void run() {
-				showMessage("Action 2 executed");
-			}
-		};
-		action2.setText("Action 2");
-		action2.setToolTipText("Action 2 tooltip");
-		action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
-				getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
-		doubleClickAction = new Action() {
-			public void run() {
-				ISelection selection = viewer.getSelection();
-				Object obj = ((IStructuredSelection)selection).getFirstElement();
-				showMessage("Double-click detected on "+obj.toString());
-			}
-		};
-	}
-
-	private void hookDoubleClickAction() {
-		viewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				doubleClickAction.run();
-			}
-		});
-	}
-	private void showMessage(String message) {
-		MessageDialog.openInformation(
-			viewer.getControl().getShell(),
-			"Sample View",
-			message);
-	}
-
-	/**
-	 * Passing the focus request to the viewer's control.
-	 */
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-}
\ No newline at end of file
diff --git a/halo-se/src/edu/columbia/cs/psl/halo/client/wrapper/QuestWrapper.java b/halo-se/src/edu/columbia/cs/psl/halo/client/wrapper/QuestWrapper.java
index bbe1e4b..c5100d1 100644
--- a/halo-se/src/edu/columbia/cs/psl/halo/client/wrapper/QuestWrapper.java
+++ b/halo-se/src/edu/columbia/cs/psl/halo/client/wrapper/QuestWrapper.java
@@ -87,7 +87,7 @@ public class QuestWrapper implements IAdaptable{
 			if(times.size() == 1)
 				ret += " ";
 			if(past)
-				ret += "ago";
+				ret += " ago";
 			else
 				ret = "in " + ret;
 			return ret;
diff --git a/halo-update-site/.project b/halo-update-site/.project
new file mode 100644
index 0000000..e469ff4
--- /dev/null
+++ b/halo-update-site/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>halo-update-site</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.UpdateSiteBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.UpdateSiteNature</nature>
+	</natures>
+</projectDescription>
diff --git a/halo-update-site/artifacts.jar b/halo-update-site/artifacts.jar
new file mode 100644
index 0000000..7db8b6c
Binary files /dev/null and b/halo-update-site/artifacts.jar differ
diff --git a/halo-update-site/content.jar b/halo-update-site/content.jar
new file mode 100644
index 0000000..07f0bad
Binary files /dev/null and b/halo-update-site/content.jar differ
diff --git a/halo-update-site/edu.columbia.cs.psl.halo.client_1.0.0.201110091459/@dot.log b/halo-update-site/edu.columbia.cs.psl.halo.client_1.0.0.201110091459/@dot.log
new file mode 100644
index 0000000..cf3ffa6
--- /dev/null
+++ b/halo-update-site/edu.columbia.cs.psl.halo.client_1.0.0.201110091459/@dot.log
@@ -0,0 +1,222 @@
+# 10/9/11 3:00:03 PM EDT
+# Eclipse Compiler for Java(TM) 0.B76_R37x, 3.7.1, Copyright IBM Corp 2000, 2011. All rights reserved.
+----------
+1. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/Activator.java (at line 3)
+	import java.io.File;
+	       ^^^^^^^^^^^^
+The import java.io.File is never used
+----------
+2. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/Activator.java (at line 4)
+	import java.net.URL;
+	       ^^^^^^^^^^^^
+The import java.net.URL is never used
+----------
+3. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/Activator.java (at line 5)
+	import java.util.Scanner;
+	       ^^^^^^^^^^^^^^^^^
+The import java.util.Scanner is never used
+----------
+4. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/Activator.java (at line 7)
+	import javax.security.auth.login.LoginContext;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import javax.security.auth.login.LoginContext is never used
+----------
+5. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/Activator.java (at line 9)
+	import org.eclipse.core.runtime.FileLocator;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import org.eclipse.core.runtime.FileLocator is never used
+----------
+----------
+6. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/Util.java (at line 3)
+	import java.awt.Toolkit;
+	       ^^^^^^^^^^^^^^^^
+The import java.awt.Toolkit is never used
+----------
+7. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/Util.java (at line 7)
+	import java.util.Timer;
+	       ^^^^^^^^^^^^^^^
+The import java.util.Timer is never used
+----------
+8. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/Util.java (at line 8)
+	import java.util.TimerTask;
+	       ^^^^^^^^^^^^^^^^^^^
+The import java.util.TimerTask is never used
+----------
+----------
+9. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/editor/AssignmentViewerInput.java (at line 29)
+	public Object getAdapter(Class adapter) {
+	                         ^^^^^
+Class is a raw type. References to generic type Class<T> should be parameterized
+----------
+----------
+10. ERROR in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardComposite.java (at line 1)
+	package edu.columbia.cs.psl.halo.client.views;
+	^
+The type javax.persistence.GenerationType cannot be resolved. It is indirectly referenced from required .class files
+----------
+11. ERROR in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardComposite.java (at line 1)
+	package edu.columbia.cs.psl.halo.client.views;
+	^
+The type javax.persistence.EnumType cannot be resolved. It is indirectly referenced from required .class files
+----------
+12. ERROR in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardComposite.java (at line 1)
+	package edu.columbia.cs.psl.halo.client.views;
+	^
+The type javax.persistence.FetchType cannot be resolved. It is indirectly referenced from required .class files
+----------
+----------
+13. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardView.java (at line 8)
+	import org.eclipse.swt.graphics.Color;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import org.eclipse.swt.graphics.Color is never used
+----------
+14. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/DashboardView.java (at line 18)
+	import edu.columbia.cs.psl.halo.client.FBTokenChecker;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import edu.columbia.cs.psl.halo.client.FBTokenChecker is never used
+----------
+----------
+15. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java (at line 3)
+	import java.io.File;
+	       ^^^^^^^^^^^^
+The import java.io.File is never used
+----------
+16. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java (at line 4)
+	import java.net.MalformedURLException;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import java.net.MalformedURLException is never used
+----------
+17. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java (at line 5)
+	import java.security.PrivilegedAction;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import java.security.PrivilegedAction is never used
+----------
+18. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java (at line 7)
+	import javax.security.auth.Subject;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import javax.security.auth.Subject is never used
+----------
+19. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java (at line 8)
+	import javax.security.auth.login.LoginException;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import javax.security.auth.login.LoginException is never used
+----------
+20. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java (at line 16)
+	import org.eclipse.core.runtime.preferences.DefaultScope;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import org.eclipse.core.runtime.preferences.DefaultScope is never used
+----------
+21. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java (at line 18)
+	import org.eclipse.core.runtime.preferences.IScopeContext;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import org.eclipse.core.runtime.preferences.IScopeContext is never used
+----------
+22. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java (at line 21)
+	import org.eclipse.jface.resource.ImageDescriptor;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import org.eclipse.jface.resource.ImageDescriptor is never used
+----------
+23. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java (at line 59)
+	private Button loginButton;
+	               ^^^^^^^^^^^
+The value of the field LoginComposite.loginButton is not used
+----------
+24. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java (at line 83)
+	private Image loginImage;
+	              ^^^^^^^^^^
+The value of the field LoginComposite.loginImage is not used
+----------
+25. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java (at line 95)
+	Label img = new Label(this, SWT.None);
+	      ^^^
+The value of the local variable img is not used
+----------
+26. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/LoginComposite.java (at line 191)
+	private void createUIButtonCancel() {
+	             ^^^^^^^^^^^^^^^^^^^^^^
+The method createUIButtonCancel() from the type LoginComposite is never used locally
+----------
+----------
+27. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java (at line 3)
+	import java.io.File;
+	       ^^^^^^^^^^^^
+The import java.io.File is never used
+----------
+28. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java (at line 4)
+	import java.net.MalformedURLException;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import java.net.MalformedURLException is never used
+----------
+29. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java (at line 5)
+	import java.util.ArrayList;
+	       ^^^^^^^^^^^^^^^^^^^
+The import java.util.ArrayList is never used
+----------
+30. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java (at line 6)
+	import java.util.Collections;
+	       ^^^^^^^^^^^^^^^^^^^^^
+The import java.util.Collections is never used
+----------
+31. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java (at line 7)
+	import java.util.Comparator;
+	       ^^^^^^^^^^^^^^^^^^^^
+The import java.util.Comparator is never used
+----------
+32. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java (at line 10)
+	import java.util.List;
+	       ^^^^^^^^^^^^^^
+The import java.util.List is never used
+----------
+33. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java (at line 45)
+	import org.eclipse.swt.layout.GridData;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import org.eclipse.swt.layout.GridData is never used
+----------
+34. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java (at line 46)
+	import org.eclipse.swt.layout.GridLayout;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import org.eclipse.swt.layout.GridLayout is never used
+----------
+35. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java (at line 51)
+	import org.eclipse.swt.widgets.Listener;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import org.eclipse.swt.widgets.Listener is never used
+----------
+36. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java (at line 52)
+	import org.eclipse.swt.widgets.MessageBox;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import org.eclipse.swt.widgets.MessageBox is never used
+----------
+37. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java (at line 70)
+	import edu.columbia.cs.psl.halo.server.stubs.UserService;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import edu.columbia.cs.psl.halo.server.stubs.UserService is never used
+----------
+38. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java (at line 71)
+	import edu.columbia.cs.psl.halo.server.stubs.UserServiceService;
+	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The import edu.columbia.cs.psl.halo.server.stubs.UserServiceService is never used
+----------
+39. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java (at line 571)
+	ok = dlg.getReturnCode() == dlg.OK;
+	                                ^^
+The static field Window.OK should be accessed in a static way
+----------
+----------
+40. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/views/Thermometer.java (at line 74)
+	GC gc;
+	   ^^
+The value of the local variable gc is not used
+----------
+----------
+41. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/wrapper/QuestWrapper.java (at line 4)
+	import java.util.Date;
+	       ^^^^^^^^^^^^^^
+The import java.util.Date is never used
+----------
+42. WARNING in /Users/jon/Documents/PSL/Projects/halo/halo-eclipse/halo-se/src/edu/columbia/cs/psl/halo/client/wrapper/QuestWrapper.java (at line 39)
+	public Object getAdapter(Class adapter) {
+	                         ^^^^^
+Class is a raw type. References to generic type Class<T> should be parameterized
+----------
+42 problems (3 errors, 39 warnings)
\ No newline at end of file
diff --git a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.4.jar b/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.4.jar
new file mode 100644
index 0000000..af26617
Binary files /dev/null and b/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.4.jar differ
diff --git a/halo-update-site/index.html b/halo-update-site/index.html
new file mode 100644
index 0000000..71b5a9d
--- /dev/null
+++ b/halo-update-site/index.html
@@ -0,0 +1,60 @@
+<html>
+<head>
+<title>halo-update-site</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<style>@import url("web/site.css");</style>
+<script type="text/javascript">
+	var returnval = 0;
+	var stylesheet, xmlFile, cache, doc;
+	function init(){
+		// NSCP 7.1+ / Mozilla 1.4.1+ / Safari
+		// Use the standard DOM Level 2 technique, if it is supported
+		if (document.implementation && document.implementation.createDocument) {
+			xmlFile = document.implementation.createDocument("", "", null);
+			stylesheet = document.implementation.createDocument("", "", null);
+			if (xmlFile.load){
+				xmlFile.load("site.xml");
+				stylesheet.load("web/site.xsl");
+			} else {
+				alert("Document could not be loaded by browser.");
+			}
+			xmlFile.addEventListener("load", transform, false);
+			stylesheet.addEventListener("load", transform, false);
+		}
+		//IE 6.0+ solution
+		else if (window.ActiveXObject) {
+			xmlFile = new ActiveXObject("msxml2.DOMDocument.3.0");
+			xmlFile.async = false;
+			xmlFile.load("site.xml");
+			stylesheet = new ActiveXObject("msxml2.FreeThreadedDOMDocument.3.0");
+			stylesheet.async = false;
+			stylesheet.load("web/site.xsl");
+			cache = new ActiveXObject("msxml2.XSLTemplate.3.0");
+			cache.stylesheet = stylesheet;
+			transformData();
+		}
+	}
+	// separate transformation function for IE 6.0+
+	function transformData(){
+		var processor = cache.createProcessor();
+		processor.input = xmlFile;
+		processor.transform();
+		data.innerHTML = processor.output;
+	}
+	// separate transformation function for NSCP 7.1+ and Mozilla 1.4.1+
+	function transform(){
+		returnval+=1;
+		if (returnval==2){
+			var processor = new XSLTProcessor();
+			processor.importStylesheet(stylesheet);
+			doc = processor.transformToDocument(xmlFile);
+			document.getElementById("data").innerHTML = doc.documentElement.innerHTML;
+		}
+	}
+</script>
+</head>
+<body onload="init();">
+<!--[insert static HTML here]-->
+<div id="data"><!-- this is where the transformed data goes --></div>
+</body>
+</html>
diff --git a/halo-update-site/install.html b/halo-update-site/install.html
new file mode 100644
index 0000000..b399bcc
--- /dev/null
+++ b/halo-update-site/install.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>HALO SE Installation Instructions</title>
+<style type="text/css">
+<!--
+body {
+	font: 100% Verdana, Arial, Helvetica, sans-serif;
+	background: #666666;
+	margin: 0; /* it's good practice to zero the margin and padding of the body element to account for differing browser defaults */
+	padding: 0;
+	text-align: center; /* this centers the container in IE 5* browsers. The text is then set to the left aligned default in the #container selector */
+	color: #000000;
+}
+.oneColElsCtr #container {
+	width: 46em;
+	background: #FFFFFF;
+	margin: 0 auto; /* the auto margins (in conjunction with a width) center the page */
+	border: 1px solid #000000;
+	text-align: left; /* this overrides the text-align: center on the body element. */
+}
+.oneColElsCtr #mainContent {
+	padding: 0 20px; /* remember that padding is the space inside the div box and margin is the space outside the div box */
+}
+-->
+</style></head>
+
+<body class="oneColElsCtr">
+
+<div id="container">
+  <div id="mainContent">
+    <h1>Installing HALO-SE</h1>
+    <p>Follow these simple steps to get started using HALO-SE</p>
+    <ol>
+      <li>Start eclipse.</li>
+      <li>Open the &quot;Help&quot; menu, then select &quot;Install new software...&quot;
+        <ol>
+          <li><img src="select-install.png" alt="" width="641" height="239" /></li>
+        </ol>
+      </li>
+      <li>Click on &quot;Add...&quot; next to &quot;Work with&quot;</li>
+      <li>Enter &quot;HALO&quot; for name, and &quot;http://ase.cs.columbia.edu/halo-update&quot; for Location
+        <ol>
+          <li><img src="update site.jpg" alt="" width="468" height="91" /></li>
+        </ol>
+      </li>
+      <li>Click &quot;OK&quot;, and then click the checkbox next to &quot;HALO-SE&quot;, and &quot;Next &gt;&quot;
+        <ol>
+          <li><img src="next.jpg" alt="" width="551" height="385" /></li>
+        </ol>
+      </li>
+      <li>Click &quot;Next&quot; again, and then accept the license agreement, and select &quot;Finish&quot;</li>
+      <li>Click &quot;OK&quot; through the security warning</li>
+      <li>Select &quot;Restart Now&quot; once the installation completes</li>
+      <li>When Eclipse restarts, you should see a &quot;HALO Dashboard&quot; tab on the bottom, and a &quot;HALO Quests&quot; tab on the right. If you do not see these, go to the &quot;Window&quot; menu, and select &quot;Reset Perspective&quot;</li>
+      <li>Login with your UNI for username, and the password that was emailed to you.</li>
+    </ol>
+    <p>If you have any problems or general feedback for HALO, please email <a href="mailto:jbell@cs.columbia.edu">Jon Bell</a>.</p>
+  </div>
+</div>
+</body>
+</html>
diff --git a/halo-update-site/logs.zip b/halo-update-site/logs.zip
new file mode 100644
index 0000000..f372010
Binary files /dev/null and b/halo-update-site/logs.zip differ
diff --git a/halo-update-site/next.jpg b/halo-update-site/next.jpg
new file mode 100644
index 0000000..3987471
Binary files /dev/null and b/halo-update-site/next.jpg differ
diff --git a/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110102242.jar b/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110102242.jar
new file mode 100644
index 0000000..93a7232
Binary files /dev/null and b/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110102242.jar differ
diff --git a/halo-update-site/select-install.png b/halo-update-site/select-install.png
new file mode 100644
index 0000000..d59f8f1
Binary files /dev/null and b/halo-update-site/select-install.png differ
diff --git a/halo-update-site/site.xml b/halo-update-site/site.xml
new file mode 100644
index 0000000..529cef9
--- /dev/null
+++ b/halo-update-site/site.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<site>
+   <feature url="features/edu.columbia.cs.psl.halo.client_1.0.1.4.jar" id="edu.columbia.cs.psl.halo.client" version="1.0.1.4">
+      <category name="HALO"/>
+   </feature>
+   <category-def name="HALO" label="HALO SE"/>
+</site>
diff --git a/halo-update-site/untitled.jpg b/halo-update-site/untitled.jpg
new file mode 100644
index 0000000..2ea8eb5
Binary files /dev/null and b/halo-update-site/untitled.jpg differ
diff --git a/halo-update-site/update site.jpg b/halo-update-site/update site.jpg
new file mode 100644
index 0000000..b23c033
Binary files /dev/null and b/halo-update-site/update site.jpg differ
diff --git a/halo-update-site/web/site.css b/halo-update-site/web/site.css
new file mode 100644
index 0000000..62c6f9f
--- /dev/null
+++ b/halo-update-site/web/site.css
@@ -0,0 +1,12 @@
+<STYLE type="text/css">
+td.spacer {padding-bottom: 10px; padding-top: 10px;}
+.title { font-family: sans-serif; color: #99AACC;}
+.bodyText { font-family: sans-serif; font-size: 9pt; color:#000000;  }
+.sub-header { font-family: sans-serif; font-style: normal; font-weight: bold; font-size: 9pt; color: white;}
+.log-text {font-family: sans-serif; font-style: normal; font-weight: lighter; font-size: 8pt; color:black;}
+.big-header { font-family: sans-serif; font-style: normal; font-weight: bold; font-size: 9pt; color: white; border-top:10px solid white;}
+.light-row {background:#FFFFFF}
+.dark-row {background:#EEEEFF}
+.header {background:#99AADD}
+#indent {word-wrap : break-word;width :300px;text-indent:10px;}
+</STYLE>
diff --git a/halo-update-site/web/site.xsl b/halo-update-site/web/site.xsl
new file mode 100644
index 0000000..ed48a47
--- /dev/null
+++ b/halo-update-site/web/site.xsl
@@ -0,0 +1,214 @@
+<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl="urn:schemas-microsoft-com:xslt">
+<xsl:output method="html" encoding="UTF-8"/>
+<xsl:key name="cat" match="category" use="@name"/>
+<xsl:template match="/">
+<xsl:for-each select="site">
+	<html>
+	<head>
+	<title>halo-update-site</title>
+	<style>@import url("web/site.css");</style>
+	</head>
+	<body>
+	<h1 class="title">halo-update-site</h1>
+	<p class="bodyText"><xsl:value-of select="description"/></p>
+	<table width="100%" border="0" cellspacing="1" cellpadding="2">
+	<xsl:for-each select="category-def">
+		<xsl:sort select="@label" order="ascending" case-order="upper-first"/>
+		<xsl:sort select="@name" order="ascending" case-order="upper-first"/>
+	<xsl:if test="count(key('cat',@name)) != 0">
+			<tr class="header">
+				<td class="sub-header" width="30%">
+					<xsl:value-of select="@name"/>
+				</td>
+				<td class="sub-header" width="70%">
+					<xsl:value-of select="@label"/>
+				</td>
+			</tr>
+			<xsl:for-each select="key('cat',@name)">
+			<xsl:sort select="ancestor::feature//@version" order="ascending"/>
+			<xsl:sort select="ancestor::feature//@id" order="ascending" case-order="upper-first"/>
+			<tr>
+				<xsl:choose>
+				<xsl:when test="(position() mod 2 = 1)">
+					<xsl:attribute name="class">dark-row</xsl:attribute>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:attribute name="class">light-row</xsl:attribute>
+				</xsl:otherwise>
+				</xsl:choose>
+				<td class="log-text" id="indent">
+						<xsl:choose>
+						<xsl:when test="ancestor::feature//@label">
+							<a href="{ancestor::feature//@url}"><xsl:value-of select="ancestor::feature//@label"/></a>
+							<br/>
+							<div id="indent">
+							(<xsl:value-of select="ancestor::feature//@id"/> - <xsl:value-of select="ancestor::feature//@version"/>)
+							</div>
+						</xsl:when>
+						<xsl:otherwise>
+						<a href="{ancestor::feature//@url}"><xsl:value-of select="ancestor::feature//@id"/> - <xsl:value-of select="ancestor::feature//@version"/></a>
+						</xsl:otherwise>
+						</xsl:choose>
+						<br />
+				</td>
+				<td>
+					<table>
+						<xsl:if test="ancestor::feature//@os">
+							<tr><td class="log-text" id="indent">Operating Systems:</td>
+							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@os"/></td>
+							</tr>
+						</xsl:if>
+						<xsl:if test="ancestor::feature//@ws">
+							<tr><td class="log-text" id="indent">Windows Systems:</td>
+							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@ws"/></td>
+							</tr>
+						</xsl:if>
+						<xsl:if test="ancestor::feature//@nl">
+							<tr><td class="log-text" id="indent">Languages:</td>
+							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@nl"/></td>
+							</tr>
+						</xsl:if>
+						<xsl:if test="ancestor::feature//@arch">
+							<tr><td class="log-text" id="indent">Architecture:</td>
+							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@arch"/></td>
+							</tr>
+						</xsl:if>
+					</table>
+				</td>
+			</tr>
+			</xsl:for-each>
+			<tr><td class="spacer"><br/></td><td class="spacer"><br/></td></tr>
+		</xsl:if>
+	</xsl:for-each>
+	<xsl:if test="count(feature)  &gt; count(feature/category)">
+	<tr class="header">
+		<td class="sub-header" colspan="2">
+		Uncategorized
+		</td>
+	</tr>
+	</xsl:if>
+	<xsl:choose>
+	<xsl:when test="function-available('msxsl:node-set')">
+	   <xsl:variable name="rtf-nodes">
+		<xsl:for-each select="feature[not(category)]">
+			<xsl:sort select="@id" order="ascending" case-order="upper-first"/>
+			<xsl:sort select="@version" order="ascending" />
+			<xsl:value-of select="."/>
+			<xsl:copy-of select="." />
+		</xsl:for-each>
+	   </xsl:variable>
+	   <xsl:variable name="myNodeSet" select="msxsl:node-set($rtf-nodes)/*"/>
+	<xsl:for-each select="$myNodeSet">
+	<tr>
+		<xsl:choose>
+		<xsl:when test="position() mod 2 = 1">
+		<xsl:attribute name="class">dark-row</xsl:attribute>
+		</xsl:when>
+		<xsl:otherwise>
+		<xsl:attribute name="class">light-row</xsl:attribute>
+		</xsl:otherwise>
+		</xsl:choose>
+		<td class="log-text" id="indent">
+			<xsl:choose>
+			<xsl:when test="@label">
+				<a href="{@url}"><xsl:value-of select="@label"/></a>
+				<br />
+				<div id="indent">
+				(<xsl:value-of select="@id"/> - <xsl:value-of select="@version"/>)
+				</div>
+			</xsl:when>
+			<xsl:otherwise>
+				<a href="{@url}"><xsl:value-of select="@id"/> - <xsl:value-of select="@version"/></a>
+			</xsl:otherwise>
+			</xsl:choose>
+			<br /><br />
+		</td>
+		<td>
+			<table>
+				<xsl:if test="@os">
+					<tr><td class="log-text" id="indent">Operating Systems:</td>
+					<td class="log-text" id="indent"><xsl:value-of select="@os"/></td>
+					</tr>
+				</xsl:if>
+				<xsl:if test="@ws">
+					<tr><td class="log-text" id="indent">Windows Systems:</td>
+					<td class="log-text" id="indent"><xsl:value-of select="@ws"/></td>
+					</tr>
+				</xsl:if>
+				<xsl:if test="@nl">
+					<tr><td class="log-text" id="indent">Languages:</td>
+					<td class="log-text" id="indent"><xsl:value-of select="@nl"/></td>
+					</tr>
+				</xsl:if>
+				<xsl:if test="@arch">
+					<tr><td class="log-text" id="indent">Architecture:</td>
+					<td class="log-text" id="indent"><xsl:value-of select="@arch"/></td>
+					</tr>
+				</xsl:if>
+			</table>
+		</td>
+	</tr>
+	</xsl:for-each>
+	</xsl:when>
+	<xsl:otherwise>
+	<xsl:for-each select="feature[not(category)]">
+	<xsl:sort select="@id" order="ascending" case-order="upper-first"/>
+	<xsl:sort select="@version" order="ascending" />
+	<tr>
+		<xsl:choose>
+		<xsl:when test="count(preceding-sibling::feature[not(category)]) mod 2 = 1">
+		<xsl:attribute name="class">dark-row</xsl:attribute>
+		</xsl:when>
+		<xsl:otherwise>
+		<xsl:attribute name="class">light-row</xsl:attribute>
+		</xsl:otherwise>
+		</xsl:choose>
+		<td class="log-text" id="indent">
+			<xsl:choose>
+			<xsl:when test="@label">
+				<a href="{@url}"><xsl:value-of select="@label"/></a>
+				<br />
+				<div id="indent">
+				(<xsl:value-of select="@id"/> - <xsl:value-of select="@version"/>)
+				</div>
+			</xsl:when>
+			<xsl:otherwise>
+				<a href="{@url}"><xsl:value-of select="@id"/> - <xsl:value-of select="@version"/></a>
+			</xsl:otherwise>
+			</xsl:choose>
+			<br /><br />
+		</td>
+		<td>
+			<table>
+				<xsl:if test="@os">
+					<tr><td class="log-text" id="indent">Operating Systems:</td>
+					<td class="log-text" id="indent"><xsl:value-of select="@os"/></td>
+					</tr>
+				</xsl:if>
+				<xsl:if test="@ws">
+					<tr><td class="log-text" id="indent">Windows Systems:</td>
+					<td class="log-text" id="indent"><xsl:value-of select="@ws"/></td>
+					</tr>
+				</xsl:if>
+				<xsl:if test="@nl">
+					<tr><td class="log-text" id="indent">Languages:</td>
+					<td class="log-text" id="indent"><xsl:value-of select="@nl"/></td>
+					</tr>
+				</xsl:if>
+				<xsl:if test="@arch">
+					<tr><td class="log-text" id="indent">Architecture:</td>
+					<td class="log-text" id="indent"><xsl:value-of select="@arch"/></td>
+					</tr>
+				</xsl:if>
+			</table>
+		</td>
+	</tr>
+	</xsl:for-each>
+	</xsl:otherwise>
+	</xsl:choose>
+	</table>
+	</body>
+	</html>
+</xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>