diff --git a/plugins/audioscrobbler/rb-audioscrobbler-entry.c b/plugins/audioscrobbler/rb-audioscrobbler-entry.c
index 885cb9f..c0400a9 100644
--- a/plugins/audioscrobbler/rb-audioscrobbler-entry.c
+++ b/plugins/audioscrobbler/rb-audioscrobbler-entry.c
@@ -55,6 +55,7 @@ rb_audioscrobbler_entry_init (AudioscrobblerEntry *entry)
 	entry->length = 0;
 	entry->play_time = 0;
 	entry->mbid = g_strdup ("");
+	entry->source = g_strdup("P");
 }
 
 void
@@ -64,6 +65,7 @@ rb_audioscrobbler_entry_free (AudioscrobblerEntry *entry)
 	g_free (entry->album);
 	g_free (entry->title);
 	g_free (entry->mbid);
+	g_free (entry->source);
 
 	g_free (entry);
 }
@@ -76,6 +78,8 @@ rb_audioscrobbler_encoded_entry_free (AudioscrobblerEncodedEntry *entry)
 	g_free (entry->title);
 	g_free (entry->mbid);
 	g_free (entry->timestamp);
+	g_free (entry->source);
+	g_free (entry->track);
 
 	g_free (entry);
 }
@@ -88,6 +92,8 @@ rb_audioscrobbler_entry_create (RhythmDBEntry *rb_entry)
 
 	as_entry->title = rhythmdb_entry_dup_string (rb_entry,
 						     RHYTHMDB_PROP_TITLE);
+	as_entry->track = rhythmdb_entry_get_ulong (rb_entry,
+						     RHYTHMDB_PROP_TRACK_NUMBER);
 	as_entry->artist = rhythmdb_entry_dup_string (rb_entry,
 						      RHYTHMDB_PROP_ARTIST);
 	as_entry->album = rhythmdb_entry_dup_string (rb_entry,
@@ -100,6 +106,15 @@ rb_audioscrobbler_entry_create (RhythmDBEntry *rb_entry)
 						     RHYTHMDB_PROP_DURATION);
 	as_entry->mbid = rhythmdb_entry_dup_string (rb_entry,
 						    RHYTHMDB_PROP_MUSICBRAINZ_TRACKID);
+	if (1==0) {//rhythmdb_entry_get_entry_type(rb_entry) == rhythmdb_entry_type_get_by_name (db, "lastfm-track")) {
+		as_entry->source = g_strdup ("L");
+	} else {
+		as_entry->source = g_strdup ("P");
+	}
+
+// Not implemented yet
+//		case RHYTHMDB_STREAM_TYPE:
+//			as_entry->source = g_strdup ("R");
 
 	return as_entry;
 }
@@ -116,15 +131,18 @@ rb_audioscrobbler_entry_encode (AudioscrobblerEntry *entry)
 					   EXTRA_URI_ENCODE_CHARS);
 	encoded->title = soup_uri_encode (entry->title,
 					  EXTRA_URI_ENCODE_CHARS);
-	encoded->album = soup_uri_encode (entry->album, 
+	encoded->album = soup_uri_encode (entry->title,
 					  EXTRA_URI_ENCODE_CHARS);
+	encoded->track = g_strdup_printf ("%lu", entry->track);
+
 	encoded->mbid = soup_uri_encode (entry->mbid, 
 					 EXTRA_URI_ENCODE_CHARS);
 	encoded->timestamp = g_new0 (gchar, 30);
-	strftime (encoded->timestamp, 30, SCROBBLER_DATE_FORMAT, 
-		  gmtime (&entry->play_time));
+	//	strftime (encoded->timestamp, 30, SCROBBLER_DATE_FORMAT, gmtime (&entry->play_time));
 
+	encoded->timestamp = g_strdup_printf("%d", (guint)entry->play_time);
 	encoded->length = entry->length;
+	encoded->source = g_strdup (entry->source);
 
 	return encoded;
 }
diff --git a/plugins/audioscrobbler/rb-audioscrobbler-entry.h b/plugins/audioscrobbler/rb-audioscrobbler-entry.h
index d25a50e..04b94ba 100644
--- a/plugins/audioscrobbler/rb-audioscrobbler-entry.h
+++ b/plugins/audioscrobbler/rb-audioscrobbler-entry.h
@@ -40,8 +40,10 @@ typedef struct
 	gchar *album;
 	gchar *title;
 	guint length;
+        gulong track;
 	gchar *mbid;
-	time_t play_time;
+        time_t play_time;
+        gchar *source;
 } AudioscrobblerEntry;
 
 typedef struct
@@ -52,6 +54,8 @@ typedef struct
 	guint length;
 	gchar *mbid;
 	gchar *timestamp;
+        gchar *source;
+        gchar *track;
 } AudioscrobblerEncodedEntry;
 
 
diff --git a/plugins/audioscrobbler/rb-audioscrobbler.c b/plugins/audioscrobbler/rb-audioscrobbler.c
index 1953793..8e6a796 100644
--- a/plugins/audioscrobbler/rb-audioscrobbler.c
+++ b/plugins/audioscrobbler/rb-audioscrobbler.c
@@ -68,7 +68,7 @@
 #define MAX_QUEUE_SIZE 1000
 #define MAX_SUBMIT_SIZE	10
 #define SCROBBLER_URL "http://post.audioscrobbler.com/"
-#define SCROBBLER_VERSION "1.1"
+#define SCROBBLER_VERSION "1.2"
 
 #define USER_AGENT	"Rhythmbox/" VERSION
 
@@ -95,8 +95,7 @@ struct _RBAudioscrobblerPrivate
 		STATUS_OK = 0,
 		HANDSHAKING,
 		REQUEST_FAILED,
-		BAD_USERNAME,
-		BAD_PASSWORD,
+		BADAUTH,
 		HANDSHAKE_FAILED,
 		CLIENT_UPDATE_REQUIRED,
 		SUBMIT_FAILED,
@@ -121,10 +120,11 @@ struct _RBAudioscrobblerPrivate
 	gboolean queue_changed;
 
 	/* Authentication cookie + authentication info */
-	gchar *md5_challenge;
+	gchar *sessionid;
 	gchar *username;
 	gchar *password;
 	gchar *submit_url;
+	gchar *nowplaying_url;
 
 	/* Currently playing song info, if NULL this means the currently
 	 * playing song isn't eligible to be queued
@@ -171,7 +171,7 @@ static void	     rb_audioscrobbler_add_timeout (RBAudioscrobbler *audioscrobbler
 static gboolean	     rb_audioscrobbler_timeout_cb (RBAudioscrobbler *audioscrobbler);
 
 static gchar *	     mkmd5 (char *string);
-static void	     rb_audioscrobbler_parse_response (RBAudioscrobbler *audioscrobbler, SoupMessage *msg);
+static void	     rb_audioscrobbler_parse_response (RBAudioscrobbler *audioscrobbler, SoupMessage *msg, gboolean handshake);
 
 static void	     rb_audioscrobbler_do_handshake (RBAudioscrobbler *audioscrobbler);
 static void	     rb_audioscrobbler_submit_queue (RBAudioscrobbler *audioscrobbler);
@@ -181,6 +181,7 @@ static void	     rb_audioscrobbler_perform (RBAudioscrobbler *audioscrobbler,
 						SoupSessionCallback response_handler);
 static void	     rb_audioscrobbler_do_handshake_cb (SoupSession *session, SoupMessage *msg, gpointer user_data);
 static void	     rb_audioscrobbler_submit_queue_cb (SoupSession *session, SoupMessage *msg, gpointer user_data);
+static void	     rb_audioscrobbler_nowplaying_cb (SoupSession *session, SoupMessage *msg, gpointer user_data);
 
 static void	     rb_audioscrobbler_import_settings (RBAudioscrobbler *audioscrobbler);
 static void	     rb_audioscrobbler_preferences_sync (RBAudioscrobbler *audioscrobbler);
@@ -200,6 +201,9 @@ static void          rb_audioscrobbler_offline_play_notify_cb (RhythmDB *db,
 							       const GValue *metadata,
 							       RBAudioscrobbler *audioscrobbler);
 
+static void          rb_audioscrobbler_nowplaying (RBAudioscrobbler *audioscrobbler, AudioscrobblerEntry *entry);
+
+
 
 
 enum
@@ -288,10 +292,11 @@ rb_audioscrobbler_init (RBAudioscrobbler *audioscrobbler)
 
 	audioscrobbler->priv->queue = g_queue_new();
 	audioscrobbler->priv->submission = g_queue_new();
-	audioscrobbler->priv->md5_challenge = g_strdup ("");
+	audioscrobbler->priv->sessionid = g_strdup ("");
 	audioscrobbler->priv->username = NULL;
 	audioscrobbler->priv->password = NULL;
 	audioscrobbler->priv->submit_url = g_strdup ("");
+	audioscrobbler->priv->nowplaying_url = g_strdup ("");
 
 	rb_audioscrobbler_load_queue (audioscrobbler);
 
@@ -382,10 +387,12 @@ rb_audioscrobbler_finalize (GObject *object)
 	/* Save any remaining entries */
 	rb_audioscrobbler_save_queue (audioscrobbler);
 
-	g_free (audioscrobbler->priv->md5_challenge);
+	g_free (audioscrobbler->priv->sessionid);
 	g_free (audioscrobbler->priv->username);
 	g_free (audioscrobbler->priv->password);
 	g_free (audioscrobbler->priv->submit_url);
+	g_free (audioscrobbler->priv->nowplaying_url);
+
 	if (audioscrobbler->priv->currently_playing != NULL) {
 		rb_audioscrobbler_entry_free (audioscrobbler->priv->currently_playing);
 		audioscrobbler->priv->currently_playing = NULL;
@@ -520,28 +527,6 @@ rb_audioscrobbler_is_queueable (RhythmDBEntry *entry)
 	return TRUE;
 }
 
-static AudioscrobblerEntry *
-rb_audioscrobbler_create_entry (RhythmDBEntry *rb_entry)
-{
-	AudioscrobblerEntry *as_entry = g_new0 (AudioscrobblerEntry, 1);
-
-	as_entry->title = rhythmdb_entry_dup_string (rb_entry,
-						     RHYTHMDB_PROP_TITLE);
-	as_entry->artist = rhythmdb_entry_dup_string (rb_entry,
-						      RHYTHMDB_PROP_ARTIST);
-	as_entry->album = rhythmdb_entry_dup_string (rb_entry,
-						     RHYTHMDB_PROP_ALBUM);
-	if (strcmp (as_entry->album, _("Unknown")) == 0) {
-		g_free (as_entry->album);
-		as_entry->album = g_strdup ("");
-	}
-	as_entry->length = rhythmdb_entry_get_ulong (rb_entry,
-						     RHYTHMDB_PROP_DURATION);
-	as_entry->mbid = rhythmdb_entry_dup_string (rb_entry,
-						    RHYTHMDB_PROP_MUSICBRAINZ_TRACKID);
-
-	return as_entry;
-}
 
 static void
 rb_audioscrobbler_add_to_queue (RBAudioscrobbler *audioscrobbler,
@@ -631,7 +616,7 @@ rb_audioscrobbler_offline_play_notify_cb (RhythmDB *db,
 	if (rb_audioscrobbler_is_queueable (rb_entry)) {
 		AudioscrobblerEntry *as_entry;
 		
-		as_entry = rb_audioscrobbler_create_entry (rb_entry);
+		as_entry = rb_audioscrobbler_entry_create (rb_entry);
 		as_entry->play_time = g_value_get_ulong (metadata);
 		rb_audioscrobbler_add_to_queue (audioscrobbler, as_entry);
 	}
@@ -656,89 +641,61 @@ mkmd5 (char *string)
 }
 
 static void
-rb_audioscrobbler_parse_response (RBAudioscrobbler *audioscrobbler, SoupMessage *msg)
+rb_audioscrobbler_parse_response (RBAudioscrobbler *audioscrobbler, SoupMessage *msg, gboolean handshake)
 {
 	gboolean successful;
-	rb_debug ("Parsing response, status=%d", msg->status_code);
+	
+	rb_debug ("Parsing response, status=%d Reason: %s\nMessage: %s\nRequest: %s", msg->status_code, msg->reason_phrase, msg->response_body->data,msg->request_body->data);
 	
 	successful = FALSE;
-	if (SOUP_STATUS_IS_SUCCESSFUL (msg->status_code) && msg->response_body->length != 0)
+	if (SOUP_STATUS_IS_SUCCESSFUL (msg->status_code) && msg->response_body->length != 0) 
 		successful = TRUE;
+
+
 	if (successful) {
 		gchar **breaks;
-		int i;
-		breaks = g_strsplit (msg->response_body->data, "\n", 4);
+
+		breaks = g_strsplit (msg->response_body->data, "\n", 0);
 
 		g_free (audioscrobbler->priv->status_msg);
 		audioscrobbler->priv->status = STATUS_OK;
 		audioscrobbler->priv->status_msg = NULL;
-		for (i = 0; breaks[i] != NULL; i++) {
-			rb_debug ("RESPONSE: %s", breaks[i]);
-			if (g_str_has_prefix (breaks[i], "UPTODATE")) {
-				rb_debug ("UPTODATE");
-
-				if (breaks[i+1] != NULL) {
-					g_free (audioscrobbler->priv->md5_challenge);
-					audioscrobbler->priv->md5_challenge = g_strdup (breaks[i+1]);
-					rb_debug ("MD5 challenge: \"%s\"", audioscrobbler->priv->md5_challenge);
-
-					if (breaks[i+2] != NULL) {
-						g_free (audioscrobbler->priv->submit_url);
-						audioscrobbler->priv->submit_url = g_strdup (breaks[i+2]);
-						rb_debug ("Submit URL: \"%s\"", audioscrobbler->priv->submit_url);
-						i++;
-					}
-					i++;
-				}
-
-			} else if (g_str_has_prefix (breaks[i], "UPDATE")) {
-				rb_debug ("UPDATE");
-				audioscrobbler->priv->status = CLIENT_UPDATE_REQUIRED;
-
-				if (breaks[i+1] != NULL) {
-					g_free (audioscrobbler->priv->md5_challenge);
-					audioscrobbler->priv->md5_challenge = g_strdup (breaks[i+1]);
-					rb_debug ("MD5 challenge: \"%s\"", audioscrobbler->priv->md5_challenge);
-
-					if (breaks[i+2] != NULL) {
-						g_free (audioscrobbler->priv->submit_url);
-						audioscrobbler->priv->submit_url = g_strdup (breaks[i+2]);
-						rb_debug ("Submit URL: \"%s\"", audioscrobbler->priv->submit_url);
-						i++;
-					}
-					i++;
-				}
-
-			} else if (g_str_has_prefix (breaks[i], "FAILED")) {
-				audioscrobbler->priv->status = HANDSHAKE_FAILED;
-
-				if (strlen (breaks[i]) > 7) {
-					rb_debug ("FAILED: \"%s\"", breaks[i] + 7);
-					audioscrobbler->priv->status_msg = g_strdup (breaks[i] + 7);
-				} else {
-					rb_debug ("FAILED");
-				}
-
-
-			} else if (g_str_has_prefix (breaks[i], "BADUSER")) {
-				rb_debug ("BADUSER");
-				audioscrobbler->priv->status = BAD_USERNAME;
-			} else if (g_str_has_prefix (breaks[i], "BADAUTH")) {
-				rb_debug ("BADAUTH");
-				audioscrobbler->priv->status = BAD_PASSWORD;
-			} else if (g_str_has_prefix (breaks[i], "OK")) {
-				rb_debug ("OK");
-			} else if (g_str_has_prefix (breaks[i], "INTERVAL ")) {
-				audioscrobbler->priv->submit_interval = g_ascii_strtod(breaks[i] + 9, NULL);
-				rb_debug ("INTERVAL: %s", breaks[i] + 9);
+		
+		if (g_str_has_prefix (breaks[0], "OK")) {
+			rb_debug ("OK");
+			if (handshake) {
+				g_free (audioscrobbler->priv->sessionid);
+				g_free (audioscrobbler->priv->nowplaying_url);
+				g_free (audioscrobbler->priv->submit_url);
+				audioscrobbler->priv->sessionid = g_strdup (breaks[1]);
+				audioscrobbler->priv->nowplaying_url = g_strdup (breaks[2]);
+				audioscrobbler->priv->submit_url = g_strdup (breaks[3]);
 			}
+		} else if (g_str_has_prefix (breaks[0], "BANNED")) {
+			rb_debug ("Client banned...");
+			
+		} else if (g_str_has_prefix (breaks[0], "BADAUTH")) {
+			rb_debug ("Bad authorization"); // User needs to fix credentials
+			audioscrobbler->priv->status = BADAUTH;
+			audioscrobbler->priv->status_msg = g_strdup ("Bad username or password\n");
+		} else if (g_str_has_prefix (breaks[0], "BADTIME")) {
+			rb_debug ("Bad timestamp"); // timestamp not close enough to server
+
+		} else if (g_str_has_prefix (breaks[0], "FAILED")) {
+			rb_debug ("Server failure:\n \tMessage: %s", breaks[0]);
+
+		} else {
+			rb_debug ("Hard failure");
 		}
 
+
 		/* respect the last submit interval we were given */
 		if (audioscrobbler->priv->submit_interval > 0)
 			audioscrobbler->priv->submit_next = time(NULL) + audioscrobbler->priv->submit_interval;
 
 		g_strfreev (breaks);
+	} else if  (msg->status_code == 7) {
+		audioscrobbler->priv->status = STATUS_OK; //Deal with libsoup not being able to deal with http w/o headers.
 	} else {
 		audioscrobbler->priv->status = REQUEST_FAILED;
 		audioscrobbler->priv->status_msg = g_strdup (msg->reason_phrase);
@@ -829,6 +786,9 @@ rb_audioscrobbler_do_handshake (RBAudioscrobbler *audioscrobbler)
 	gchar *scrobbler_url;
 	gchar *username;
 	gchar *url;
+	gchar *auth;
+	gchar *autharg;
+	guint timestamp;
 
 	if (!rb_audioscrobbler_should_handshake (audioscrobbler)) {
 		return;
@@ -839,13 +799,24 @@ rb_audioscrobbler_do_handshake (RBAudioscrobbler *audioscrobbler)
 		scrobbler_url = g_strdup (SCROBBLER_URL);
 	}
 
+
+
 	username = soup_uri_encode (audioscrobbler->priv->username, EXTRA_URI_ENCODE_CHARS);
-	url = g_strdup_printf ("%s?hs=true&p=%s&c=%s&v=%s&u=%s",
+	timestamp = time (NULL);
+
+	autharg = g_strdup_printf("%s%d",mkmd5(audioscrobbler->priv->password),timestamp);
+	auth = mkmd5(autharg);
+
+	url = g_strdup_printf ("%s?hs=true&p=%s&c=%s&v=%s&u=%s&t=%d&a=%s",
 			       scrobbler_url,
 			       SCROBBLER_VERSION,
 			       CLIENT_ID,
 			       CLIENT_VERSION,
-			       username);
+			       username,
+			       timestamp,
+			       auth);
+	g_free (auth);
+	g_free (autharg);
 	g_free (scrobbler_url);
 	g_free (username);
 
@@ -872,7 +843,7 @@ rb_audioscrobbler_do_handshake_cb (SoupSession *session, SoupMessage *msg, gpoin
 	RBAudioscrobbler *audioscrobbler = RB_AUDIOSCROBBLER(user_data);
 
 	rb_debug ("Handshake response");
-	rb_audioscrobbler_parse_response (audioscrobbler, msg);
+	rb_audioscrobbler_parse_response (audioscrobbler, msg, TRUE);
 	rb_audioscrobbler_preferences_sync (audioscrobbler);
 
 	switch (audioscrobbler->priv->status) {
@@ -890,77 +861,13 @@ rb_audioscrobbler_do_handshake_cb (SoupSession *session, SoupMessage *msg, gpoin
 	g_idle_add ((GSourceFunc) idle_unref_cb, audioscrobbler);
 }
 
-
 static gchar *
-rb_audioscrobbler_build_authentication_data (RBAudioscrobbler *audioscrobbler)
-{
-	gchar *md5_password;
-	gchar *md5_temp;
-	gchar *md5_response;
-	gchar *username;
-	gchar *post_data;
-	time_t now;
-
-	/* Conditions:
-	 *   - Must have username and password
-	 *   - Must have md5_challenge
-	 *   - Queue must not be empty
-	 */
-	if ((audioscrobbler->priv->username == NULL) 
-	    || (*audioscrobbler->priv->username == '\0')) {
-		rb_debug ("No username set");
-		return NULL;
-	}
-	
-	if ((audioscrobbler->priv->password == NULL) 
-	    || (*audioscrobbler->priv->password == '\0')) {
-		rb_debug ("No password set");
-		return NULL;
-	}
-		
-	if (*audioscrobbler->priv->md5_challenge == '\0') {
-		rb_debug ("No md5 challenge");
-		return NULL;
-	}
-
-	time(&now);
-	if (now < audioscrobbler->priv->submit_next) {
-		rb_debug ("Too soon (next submission in %ld seconds)",
-			  audioscrobbler->priv->submit_next - now);
-		return NULL;
-	}
-
-	if (g_queue_is_empty (audioscrobbler->priv->queue)) {
-		rb_debug ("No queued songs to submit");
-		return NULL;
-	}
-
-	md5_password = mkmd5 (audioscrobbler->priv->password);
-	md5_temp = g_strconcat (md5_password,
-				audioscrobbler->priv->md5_challenge,
-				NULL);
-	md5_response = mkmd5 (md5_temp);
-	
-	username = soup_uri_encode (audioscrobbler->priv->username, 
-				    EXTRA_URI_ENCODE_CHARS);
-	post_data = g_strdup_printf ("u=%s&s=%s&", username, md5_response);
-	
-	g_free (md5_password);
-	g_free (md5_temp);
-	g_free (md5_response);
-	g_free (username);
-	
-	return post_data;
-}
-
-static gchar *
-rb_audioscrobbler_build_post_data (RBAudioscrobbler *audioscrobbler,
-				   const gchar *authentication_data)
+rb_audioscrobbler_build_post_data (RBAudioscrobbler *audioscrobbler)
 {
 	g_return_val_if_fail (!g_queue_is_empty (audioscrobbler->priv->queue),
 			      NULL);
 
-	gchar *post_data = g_strdup (authentication_data);
+	gchar *post_data = g_strdup_printf ("s=%s",audioscrobbler->priv->sessionid);
 	int i = 0;
 	do {
 		AudioscrobblerEntry *entry;
@@ -969,14 +876,17 @@ rb_audioscrobbler_build_post_data (RBAudioscrobbler *audioscrobbler,
 		/* remove first queue entry */
 		entry = g_queue_pop_head (audioscrobbler->priv->queue);
 		encoded = rb_audioscrobbler_entry_encode (entry);
-		new = g_strdup_printf ("%sa[%d]=%s&t[%d]=%s&b[%d]=%s&m[%d]=%s&l[%d]=%d&i[%d]=%s&",
+		new = g_strdup_printf ("%s&a[%d]=%s&t[%d]=%s&b[%d]=%s&m[%d]=%s&l[%d]=%d&i[%d]=%s&o[%d]=%s&n[%d]=%s&r[%d]=",
 				       post_data,
 				       i, encoded->artist,
 				       i, encoded->title,
 				       i, encoded->album,
 				       i, encoded->mbid,
 				       i, encoded->length,
-				       i, encoded->timestamp);
+				       i, encoded->timestamp,
+				       i, encoded->source,
+				       i, encoded->track,
+				       i); //Playing source goes here
 		rb_audioscrobbler_encoded_entry_free (encoded);
 		g_free (post_data);
 		post_data = new;
@@ -993,15 +903,12 @@ rb_audioscrobbler_build_post_data (RBAudioscrobbler *audioscrobbler,
 static void
 rb_audioscrobbler_submit_queue (RBAudioscrobbler *audioscrobbler)
 {
-	gchar *auth_data;
-
-	auth_data = rb_audioscrobbler_build_authentication_data (audioscrobbler);
-	if (auth_data != NULL) {
+	
+	if (audioscrobbler->priv->sessionid != NULL) {
 		gchar *post_data;
 	
-		post_data = rb_audioscrobbler_build_post_data (audioscrobbler,
-							       auth_data);
-		g_free (auth_data);
+		post_data = rb_audioscrobbler_build_post_data (audioscrobbler);
+
 		rb_debug ("Submitting queue to Audioscrobbler");
 		rb_audioscrobbler_print_queue (audioscrobbler, TRUE);
 
@@ -1030,7 +937,7 @@ rb_audioscrobbler_submit_queue_cb (SoupSession *session, SoupMessage *msg, gpoin
 	RBAudioscrobbler *audioscrobbler = RB_AUDIOSCROBBLER (user_data);
 
 	rb_debug ("Submission response");
-	rb_audioscrobbler_parse_response (audioscrobbler, msg);
+	rb_audioscrobbler_parse_response (audioscrobbler, msg, FALSE);
 
 	if (audioscrobbler->priv->status == STATUS_OK) {
 		rb_debug ("Queue submitted successfully");
@@ -1118,11 +1025,8 @@ rb_audioscrobbler_preferences_sync (RBAudioscrobbler *audioscrobbler)
 	case REQUEST_FAILED:
 		status = _("Request failed");
 		break;
-	case BAD_USERNAME:
-		status = _("Incorrect username");
-		break;
-	case BAD_PASSWORD:
-		status = _("Incorrect password");
+	case BADAUTH:
+		status = _("Incorrect username or password");
 		break;
 	case HANDSHAKE_FAILED:
 		status = _("Handshake failed");
@@ -1314,8 +1218,9 @@ rb_audioscrobbler_song_changed_cb (RBShellPlayer *player,
 		/* even if it's the same song, it's being played again from
 		 * the start so we can queue it again.
 		 */
-		as_entry = rb_audioscrobbler_create_entry (entry);
+		as_entry = rb_audioscrobbler_entry_create (entry);
 		audioscrobbler->priv->currently_playing = as_entry;
+		rb_audioscrobbler_nowplaying (audioscrobbler, as_entry);
 	}
 }
 
@@ -1482,3 +1387,45 @@ rb_audioscrobbler_free_queue_entries (RBAudioscrobbler *audioscrobbler, GQueue *
 
 	audioscrobbler->priv->queue_changed = TRUE;
 }
+
+static void
+rb_audioscrobbler_nowplaying  (RBAudioscrobbler *audioscrobbler, AudioscrobblerEntry *entry)
+{
+	AudioscrobblerEncodedEntry *encoded;
+	gchar *post_data;
+
+	if (audioscrobbler->priv->handshake) {
+		encoded = rb_audioscrobbler_entry_encode (entry);
+		
+		post_data = g_strdup_printf ("s=%s&a=%s&t=%s&b=%s&l=%d&n=%s&m=%s",
+					     audioscrobbler->priv->sessionid,
+					     encoded->artist,
+					     encoded->title,
+					     encoded->album,
+					     encoded->length,
+					     encoded->track,
+					     encoded->mbid);
+		
+		rb_audioscrobbler_perform (audioscrobbler,
+					   audioscrobbler->priv->nowplaying_url,
+					   post_data,
+					   rb_audioscrobbler_nowplaying_cb);
+
+		rb_audioscrobbler_encoded_entry_free (encoded);
+	}
+}
+
+static void
+rb_audioscrobbler_nowplaying_cb (SoupSession *session, SoupMessage *msg, gpointer user_data)
+{
+	RBAudioscrobbler *audioscrobbler = RB_AUDIOSCROBBLER (user_data);
+	rb_debug ("Now playing response");
+	rb_audioscrobbler_parse_response (audioscrobbler, msg, FALSE);
+	
+	if (audioscrobbler->priv->status == STATUS_OK) {
+		rb_debug("Submission success!");
+	} else {
+		rb_debug("Error submitting now playing information.");
+	}
+}
+		
