diff --git a/scapy/contrib/gtp.py b/scapy/contrib/gtp.py
index e54b0ac634e87ff5ce30231660aa2e83f6ff115d..3fc1fe350100db1a595122af8c8db46477444253 100644
--- a/scapy/contrib/gtp.py
+++ b/scapy/contrib/gtp.py
@@ -104,6 +104,34 @@ Selection_Mode = { 11111100: "MS or APN",
 TeardownInd_value = { 254: "False",
                       255: "True" }
  
+class TBCDField(StrFixedLenField):
+
+    def i2h(self, pkt, val):
+        ret = []
+        for i in range(len(val)):
+           byte = ord(val[i])
+           left = byte >> 4
+           right = byte & 0xF
+           if left == 0xF:
+               ret += [ "%d" % right ]
+           else:
+               ret += [ "%d" % right, "%d" % left ]
+        return "".join(ret)
+
+    def i2repr(self, pkt, x):
+        return repr(self.i2h(pkt,x))
+
+    def i2m(self, pkt, val):
+        ret_string = ""
+        for i in range(0, len(val), 2):
+            tmp = val[i:i+2]
+            if len(tmp) == 2:
+              ret_string += chr(int(tmp[1] + tmp[0], 16))
+            else:
+              ret_string += chr(int("F" + tmp[0], 16))
+        return ret_string
+
+
 class GTPHeader(Packet):
     # 3GPP TS 29.060 V9.1.0 (2009-12)
     name = "GTP Header"
@@ -144,7 +172,7 @@ class IE_Cause(Packet):
 class IE_IMSI(Packet):
     name = "IMSI - Subscriber identity of the MS"
     fields_desc = [ ByteEnumField("ietype", 2, IEType),
-                    StrFixedLenField("IMSI", "", 8) ]
+                    TBCDField("imsi", "", 8) ]
     def extract_padding(self, pkt):
         return "",pkt