diff --git a/plugins/mm-modem-zte.c b/plugins/mm-modem-zte.c
index 2461073..bff1aa4 100644
--- a/plugins/mm-modem-zte.c
+++ b/plugins/mm-modem-zte.c
@@ -95,7 +95,9 @@ pre_init_done (MMSerialPort *port,
     MMCallbackInfo *info = (MMCallbackInfo *) user_data;
     MMModemZtePrivate *priv = MM_MODEM_ZTE_GET_PRIVATE (info->modem);
 
-    if (error) {
+    gboolean mf628 = 1; /* hack! init won't work on the ZTE MF 628 at all (because only AT and AT+CGMM work before AT+CPIN=xxxx) */
+
+    if (error && !mf628) {
         /* Retry the init string one more time; the modem sometimes throws it away */
         if (   !priv->init_retried
             && g_error_matches (error, MM_SERIAL_ERROR, MM_SERIAL_RESPONSE_TIMEOUT)) {
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c
index 55d75f6..7dd6178 100644
--- a/src/mm-generic-gsm.c
+++ b/src/mm-generic-gsm.c
@@ -309,9 +309,9 @@ mm_generic_gsm_grab_port (MMGenericGsm *self,
     port = mm_modem_base_add_port (MM_MODEM_BASE (self), subsys, name, ptype);
     if (port && MM_IS_SERIAL_PORT (port)) {
         mm_serial_port_set_response_parser (MM_SERIAL_PORT (port),
-                                            mm_serial_parser_v1_parse,
-                                            mm_serial_parser_v1_new (),
-                                            mm_serial_parser_v1_destroy);
+                                            mm_serial_parser_v1_e1_parse,   /* ZTE MF628 cannot turn echo off before issuing the pin */
+                                            mm_serial_parser_v1_e1_new (),  /* therefore we can't use the v1 (e0) parser */
+                                            mm_serial_parser_v1_e1_destroy);
 
         regex = g_regex_new ("\\r\\n\\+CREG: (\\d+)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
         mm_serial_port_add_unsolicited_msg_handler (MM_SERIAL_PORT (port), regex, reg_state_changed, self, NULL);
diff --git a/src/mm-plugin-base.c b/src/mm-plugin-base.c
index ad84921..abb1ab0 100644
--- a/src/mm-plugin-base.c
+++ b/src/mm-plugin-base.c
@@ -289,7 +289,8 @@ static guint32
 parse_cgmm (const char *buf)
 {
     if (strstr (buf, "GSM900") || strstr (buf, "GSM1800") ||
-        strstr (buf, "GSM1900") || strstr (buf, "GSM850"))
+        strstr (buf, "GSM1900") || strstr (buf, "GSM850") ||
+        strstr (buf, "MF628"))
         return MM_PLUGIN_BASE_PORT_CAP_GSM;
     return 0;
 }
@@ -365,6 +366,9 @@ real_handle_probe_response (MMPluginBase *self,
             /* Give ATI a try */
             mm_serial_port_queue_command (port, "I", 3, parse_response, task);
         } else if (task_priv->probe_state == PROBE_STATE_CGMM) {
+            /* On the ZTE MF628 only AT+CGMM works (and returns "MF628") */
+            mm_serial_port_queue_command (port, "+CGMM", 3, parse_response, task);
+        } else if (task_priv->probe_state == PROBE_STATE_LAST) {
             /* If CGMM failed, probably not a modem port */
             probe_complete (task);
         }
