--- network-manager-0.7~~svn20081018t105859/src/nm-gsm-device.c	2009-02-21 10:53:42.000000000 +0100
+++ network-manager-0.7~~svn20081018t105859.new/src/nm-gsm-device.c	2009-02-21 12:31:53.000000000 +0100
@@ -158,24 +158,55 @@
 
 	setting = NM_SETTING_GSM (gsm_device_get_setting (NM_GSM_DEVICE (device), NM_TYPE_SETTING_GSM));
 
-	if (cid) {
+	/* GPRS service commands are defined in:
+	3GPP TS 07.07 V7.8.0 (2003-03)
+	http://www.3gpp.org/ftp/Specs/archive/07_series/07.07/0707-780.zip 
+	0707-780.doc
+	10.2.1 MT originated PDP context activation (pp 104-106) */
+
+	if (cid && (strlen (setting->number) < 5)) {
+		/* If the number is a shortcut to *99***<cid># (GPRS service 'D')
+ 		or *98*<cid># (GPRS IP service 'D') */
 		GString *str;
 
-		str = g_string_new ("ATD");
+		nm_info ("GPRS service shortcut: %s", setting->number);
+		str = g_string_new ("");
 		if (g_str_has_suffix (setting->number, "#"))
 			str = g_string_append_len (str, setting->number, strlen (setting->number) - 1);
 		else
 			str = g_string_append (str, setting->number);
-
-		g_string_append_printf (str, "***%d#", cid);
+		if (strcmp (str->str,"*99") == 0) {
+			/* 10.2.1.1	GPRS service 'D' (pp104-105)
+			D*<GPRS_SC>[*[<called_address>] [*[<L2P>][*[<cid>]]]]# */
+			g_string_append_printf (str, "***%d#", cid);
+			nm_info ("GPRS service 'D': %s", str->str);
+		} else {
+			if (strcmp (str->str,"*98") == 0) {
+				/* 10.2.1.2 Request GPRS IP service 'D' (pp105-106)
+				D*<GPRS_SC_IP>[*<cid>]#
+				Defined Values
+				<GPRS_SC_IP>: (GPRS Service Code for IP) a digit string (value 98) which identifies a request to use the GPRS with IP (PDP types IP and PPP) 
+				<cid>: a digit string which specifies a particular PDP context definition (see +CGDCONT command).
+				ex. Bouyges Telecom Enterprise (french provider, APN: a2bouygtel.com) requires *98*1# */
+				g_string_append_printf (str, "*%d#", cid);
+				nm_info ("GPRS IP service 'D': %s", str->str);
+			} else {
+				g_string_append_printf (str, "***%d#", cid);
+				nm_warning ("Unknown \"Service Code\", using default format: %s", str->str);
+			}
+		}
+ 		g_string_prepend (str, "ATD"); 
 		command = g_string_free (str, FALSE);
-	} else
+	} else {
+		/* Don't change numbers when they aren't shortcuts. Consider that the user knows the right dialstring,
+		or that some other type of Service Code/dialstring could (one day?) be specified */
+		nm_warning ("You know your GPRS service number better than us, make sure it is correct if something fails later: %s", setting->number);
 		command = g_strconcat ("ATDT", setting->number, NULL);
+	}
 
 	modem_wait_for_reply (device, command, 60, responses, responses, dial_done, NULL);
 	g_free (command);
 }
-
 static void
 set_apn_done (NMSerialDevice *device,
               int reply_index,
