diff --git a/scapy/layers/inet.py b/scapy/layers/inet.py
index 1ed71e97f35b95031e26c06fbfe5a57b4f59aee0..760e0675de19a1d79ee84f13ef19c45effc0362c 100644
--- a/scapy/layers/inet.py
+++ b/scapy/layers/inet.py
@@ -462,13 +462,11 @@ class IP(Packet, IPTools):
                 del(q[fnb].payload)
                 del(q[fnb].chksum)
                 del(q[fnb].len)
-                if i == nb-1:
-                    q[IP].flags &= ~1
-                else:
-                    q[IP].flags |= 1 
-                q[IP].frag = i*fragsize/8
+                if i != nb - 1:
+                    q[fnb].flags |= 1
+                q[fnb].frag += i * fragsize / 8
                 r = conf.raw_layer(load=s[i*fragsize:(i+1)*fragsize])
-                r.overload_fields = p[IP].payload.overload_fields.copy()
+                r.overload_fields = p[fnb].payload.overload_fields.copy()
                 q.add_payload(r)
                 lst.append(q)
         return lst
@@ -816,11 +814,9 @@ def fragment(pkt, fragsize=1480):
             del(q[IP].payload)
             del(q[IP].chksum)
             del(q[IP].len)
-            if i == nb-1:
-                q[IP].flags &= ~1
-            else:
-                q[IP].flags |= 1 
-            q[IP].frag = i*fragsize/8
+            if i != nb - 1:
+                q[IP].flags |= 1
+            q[IP].frag += i * fragsize / 8
             r = conf.raw_layer(load=s[i*fragsize:(i+1)*fragsize])
             r.overload_fields = p[IP].payload.overload_fields.copy()
             q.add_payload(r)
diff --git a/test/regression.uts b/test/regression.uts
index f4f410ffe704e8eb6561afa59c1069965ff49d4d..7c379a502190553ff289704d22c571bf7abcc28b 100644
--- a/test/regression.uts
+++ b/test/regression.uts
@@ -4787,6 +4787,22 @@ pkt2 = fragment(pkt1)[0]
 pkt3 = pkt2.__class__(str(pkt2))
 assert pkt1[IP].proto == pkt2[IP].proto == pkt3[IP].proto
 
+= fragment() already fragmented packets
+payloadlen = 1480 * 3
+ffrags = fragment(IP() / ("X" * payloadlen), 1480)
+ffrags = fragment(ffrags, 1400)
+len(ffrags) == 6
+* each fragment except the last one should have MF set
+assert all(p.flags == 1 for p in ffrags[:-1])
+assert ffrags[-1].flags == 0
+* fragment offset should be well computed
+plen = 0
+for p in ffrags:
+    assert p.frag == plen / 8
+    plen += len(p.payload)
+
+assert plen == payloadlen
+
 = defragment()
 defrags = defragment(frags)
 * we should have one single packet