Index: /trunk/src/target/gsm/src/gsmd/unsolicited.c
===================================================================
--- /trunk/src/target/gsm/src/gsmd/unsolicited.c	(revision 3389)
+++ /trunk/src/target/gsm/src/gsmd/unsolicited.c	(revision 3390)
@@ -146,7 +146,29 @@
 {
 	const char *comma = strchr(param, ',');
-	struct gsmd_ucmd *ucmd = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_NETREG,
-					     sizeof(struct gsmd_evt_auxdata));
+	struct gsmd_ucmd *ucmd;
 	struct gsmd_evt_auxdata *aux;
+	int prev_registered = gsmd->dev_state.registered;
+	int state;
+	char *end;
+
+	state = strtol(param, &end, 10);
+	if (!(end > param)) {
+		gsmd_log(GSMD_ERROR, "Bad +CREG format, not updating state\n");
+		return -EINVAL;
+	}
+
+	/* Update our knowledge about our state */
+	gsmd->dev_state.registered =
+		(state == GSMD_NETREG_REG_HOME ||
+		 state == GSMD_NETREG_REG_ROAMING);
+
+	/* Intialise things that depend on network registration */
+	if (gsmd->dev_state.registered && !prev_registered) {
+		sms_cb_network_init(gsmd);
+	}
+
+	/* Notify clients */
+	ucmd = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_NETREG,
+			sizeof(struct gsmd_evt_auxdata));
 	if (!ucmd)
 		return -ENOMEM;
@@ -164,11 +186,6 @@
 		aux->u.netreg.lac = aux->u.netreg.ci = 0;
 
-	/* Intialise things that depend on network registration */
-	if (aux->u.netreg.state == GSMD_NETREG_REG_HOME ||
-			aux->u.netreg.state == GSMD_NETREG_REG_ROAMING) {
-		sms_cb_network_init(gsmd);
-	}
-
 	return usock_evt_send(gsmd, ucmd, GSMD_EVT_NETREG);
+
 }
 
Index: /trunk/src/target/gsm/src/gsmd/atcmd.c
===================================================================
--- /trunk/src/target/gsm/src/gsmd/atcmd.c	(revision 3389)
+++ /trunk/src/target/gsm/src/gsmd/atcmd.c	(revision 3390)
@@ -669,5 +669,5 @@
         
         llist_add(&cmd->list, &g->pending_atcmds);
-        return atcmd_done(g, cur, "OK");
+        return atcmd_done(g, cur, "ERROR");
 }
 
