look up subscriber in memory before loading from DB
diff --git a/openbsc/src/gsm_04_08.c b/openbsc/src/gsm_04_08.c
index 5c4465e..0523538 100644
--- a/openbsc/src/gsm_04_08.c
+++ b/openbsc/src/gsm_04_08.c
@@ -1151,6 +1151,10 @@
 
 	switch (mi_type) {
 	case GSM_MI_TYPE_IMSI:
+		/* look up subscriber based on IMSI, create if not found */
+		if (!lchan->subscr) {
+			lchan->subscr = subscr_get_by_imsi(net, mi_string);
+		}
 		if (!lchan->subscr) {
 			lchan->subscr = db_create_subscriber(net, mi_string);
 			if (lchan->subscr->flags & GSM_SUBSCRIBER_FIRST_CONTACT) {
@@ -1247,8 +1251,11 @@
 		rc = mm_tx_identity_req(lchan, GSM_MI_TYPE_IMEI);
 		lchan->loc_operation->waiting_for_imei = 1;
 
-		/* look up subscriber based on IMSI */
-		subscr = db_create_subscriber(bts->network, mi_string);
+		/* look up subscriber based on IMSI, create if not found */
+		subscr = subscr_get_by_imsi(bts->network, mi_string);
+		if (!subscr) {
+			subscr = db_create_subscriber(bts->network, mi_string);
+		}
 		if (subscr->flags & GSM_SUBSCRIBER_FIRST_CONTACT) {
 			dispatch_signal(SS_SUBSCR, S_SUBSCR_FIRST_CONTACT, &subscr);
 		}