diff --git a/scapy/__init__.py b/scapy/__init__.py
index 9e773ac6c9e420c75899cf506275efe553ab0e74..443b36753f7f543c88564c4b8abe0f9bd5fd84ad 100644
--- a/scapy/__init__.py
+++ b/scapy/__init__.py
@@ -3,7 +3,12 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Scapy: create, send, sniff, dissect and manipulate network packets.
 
+Usable either from an interactive console or as a Python library.
+http://www.secdev.org/projects/scapy
+"""
 
 if __name__ == "__main__":
     from scapy.main import interact
diff --git a/scapy/all.py b/scapy/all.py
index f6cf00eca839d1459b97df485e0ab394bf5ddffa..e0af8b14967f162195eead29c768fdbb232439c3 100644
--- a/scapy/all.py
+++ b/scapy/all.py
@@ -3,6 +3,9 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Aggregate top level objects from all Scapy modules.
+"""
 
 from base_classes import *
 from config import *
diff --git a/scapy/ansmachine.py b/scapy/ansmachine.py
index 88c7f5d2e55d1b4d9ed98a5c817a979c5fc33aa4..2a90adcc65780577f9dac4fc38faf41efa2b1cf8 100644
--- a/scapy/ansmachine.py
+++ b/scapy/ansmachine.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Answering machines.
+"""
+
 ########################
 ## Answering machines ##
 ########################
diff --git a/scapy/arch/__init__.py b/scapy/arch/__init__.py
index 0963c8d0bf45bf04abd4e6bc76200c8f69065aa6..95f95ecfb89895b68edbfead95d66a1b2d34b807 100644
--- a/scapy/arch/__init__.py
+++ b/scapy/arch/__init__.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Operating system specific functionality.
+"""
+
 
 import sys,os,socket
 from scapy.error import *
diff --git a/scapy/arch/bsd.py b/scapy/arch/bsd.py
index 0bcb3ae98138b7deb4c62e9a392247a0168acd2f..1be7bd731acdff9f79f5d7eda4afe905cac415d2 100644
--- a/scapy/arch/bsd.py
+++ b/scapy/arch/bsd.py
@@ -3,7 +3,9 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
-
+"""
+Support for BSD-like operating systems such as FreeBSD, OpenBSD and Mac OS X.
+"""
 
 LOOPBACK_NAME="lo0"
 
diff --git a/scapy/arch/linux.py b/scapy/arch/linux.py
index 4f5bb13155b2d1121ae58e614229780bace397a5..4321bda1fa2dd945371dbb07497d772b94371701 100644
--- a/scapy/arch/linux.py
+++ b/scapy/arch/linux.py
@@ -3,6 +3,9 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Linux specific functions.
+"""
 
 from __future__ import with_statement
 import sys,os,struct,socket,time
diff --git a/scapy/arch/pcapdnet.py b/scapy/arch/pcapdnet.py
index 60fe74258636181cd7972bb2f246d4bb055b86de..bb2419f915f16e433a87287b85b2ee4a7da10089 100644
--- a/scapy/arch/pcapdnet.py
+++ b/scapy/arch/pcapdnet.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Packet sending and receiving with libdnet and libpcap/WinPcap.
+"""
+
 import time,struct,sys
 if not sys.platform.startswith("win"):
     from fcntl import ioctl
diff --git a/scapy/arch/solaris.py b/scapy/arch/solaris.py
index 3b7e2fe6aafebc4e565433e14211a63db9a931da..3117076a277ab5a90a36c124f00f4bf3a24dc478 100644
--- a/scapy/arch/solaris.py
+++ b/scapy/arch/solaris.py
@@ -3,6 +3,9 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Customization for the Solaris operation system.
+"""
 
 # IPPROTO_GRE is missing on Solaris
 import socket
diff --git a/scapy/arch/unix.py b/scapy/arch/unix.py
index b13418cf9daee617fb18948b3e353937470f2fb8..151a08f530a137b1c46e679b91cd50280035c59a 100644
--- a/scapy/arch/unix.py
+++ b/scapy/arch/unix.py
@@ -3,6 +3,9 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Common customizations for all Unix-like operating systems other than Linux
+"""
 
 import sys,os,struct,socket,time
 from fcntl import ioctl
diff --git a/scapy/arch/windows/__init__.py b/scapy/arch/windows/__init__.py
index 06b7d2fa47adf0cd01019f5cefe4e609ea6a25ec..31808eb8df09701866854377e3f184aa8d2ce774 100755
--- a/scapy/arch/windows/__init__.py
+++ b/scapy/arch/windows/__init__.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Customizations needed to support Microsoft Windows.
+"""
+
 import os,re,sys,socket,time
 from glob import glob
 from scapy.config import conf,ConfClass
diff --git a/scapy/as_resolvers.py b/scapy/as_resolvers.py
index 7a82ee0780905fa271384920bb5ff8fea8f4c042..24573c209de83491f4b34479dbd6186f6f5eff1b 100644
--- a/scapy/as_resolvers.py
+++ b/scapy/as_resolvers.py
@@ -3,6 +3,11 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Resolve Autonomous Systems (AS).
+"""
+
+
 import socket
 from config import conf
 
diff --git a/scapy/asn1/__init__.py b/scapy/asn1/__init__.py
index a02c899908b29344a70236d1d40aa80fb7377b90..4827a588e20aec8524bf440cb7d5fb3dc8b795e2 100644
--- a/scapy/asn1/__init__.py
+++ b/scapy/asn1/__init__.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Package holding ASN.1 related modules.
+"""
+
 # We do not import mib.py because it is more bound to scapy and
 # less prone to be used in a standalone fashion
 __all__ = ["asn1","ber"]
diff --git a/scapy/asn1/asn1.py b/scapy/asn1/asn1.py
index f333cbe3ca646fa393556ff4a87e03920204fb25..bad7b2cfd62ae4d1d8e3e419136fb6f461ab444a 100644
--- a/scapy/asn1/asn1.py
+++ b/scapy/asn1/asn1.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+ASN.1 (Abstract Syntax Notation One)
+"""
+
 import random
 from scapy.config import conf
 from scapy.error import Scapy_Exception,warning
diff --git a/scapy/asn1/ber.py b/scapy/asn1/ber.py
index 1e66ffd7dc5ad98fb18fe40d06c9cc4efddef0d3..2312e025ae348ce527d113ab9f96f2dad6b4a5f0 100644
--- a/scapy/asn1/ber.py
+++ b/scapy/asn1/ber.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Basic Encoding Rules (BER) for ASN.1
+"""
+
 from scapy.error import warning
 from scapy.utils import inet_aton,inet_ntoa
 from asn1 import ASN1_Decoding_Error,ASN1_Encoding_Error,ASN1_BadTag_Decoding_Error,ASN1_Codecs,ASN1_Class_UNIVERSAL,ASN1_Error,ASN1_DECODING_ERROR,ASN1_BADTAG
diff --git a/scapy/asn1/mib.py b/scapy/asn1/mib.py
index c5396556ef46b288bd6b7ef7c686117788df265f..8531fcf21479667f80d9f7bd0bbc3e36edfeca96 100644
--- a/scapy/asn1/mib.py
+++ b/scapy/asn1/mib.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Management Information Base (MIB) parsing
+"""
+
 import re
 from glob import glob
 from scapy.dadict import DADict,fixname
diff --git a/scapy/asn1fields.py b/scapy/asn1fields.py
index c32fbe31b6bcb86fa6116478d217ec48a05e63d2..6849ffed6d027ff1f7d8b77ecee2041442b26885 100644
--- a/scapy/asn1fields.py
+++ b/scapy/asn1fields.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Classes that implement ASN.1 data structures.
+"""
+
 from asn1.asn1 import *
 from asn1.ber import *
 from volatile import *
diff --git a/scapy/asn1packet.py b/scapy/asn1packet.py
index dc900b0a2f99ca7a3d51c1ae3010bbc2d163b52b..57287491047e7ec5da28e2f9d38098417c30e67a 100644
--- a/scapy/asn1packet.py
+++ b/scapy/asn1packet.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Packet holding data in Abstract Syntax Notation (ASN.1).
+"""
+
 from packet import *
 
 class ASN1_Packet(Packet):
diff --git a/scapy/automaton.py b/scapy/automaton.py
index 332709d31d2fcc3b268d896672177423af6b56d1..7502ac51d8a8243df303d892adf08bcf2f67008b 100644
--- a/scapy/automaton.py
+++ b/scapy/automaton.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Automata with states, transitions and actions.
+"""
+
 from __future__ import with_statement
 import types,itertools,time,os,sys,socket
 from select import select
diff --git a/scapy/autorun.py b/scapy/autorun.py
index 85eec936bef900b1fdeb8438e5c0ce1eb403bee9..a45349497708b8dfec3fbb9b66b9dd43475b2ff8 100644
--- a/scapy/autorun.py
+++ b/scapy/autorun.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Run commands when the Scapy interpreter starts.
+"""
+
 import code,sys
 from config import conf
 from themes import *
diff --git a/scapy/base_classes.py b/scapy/base_classes.py
index c2fa4b73aa9611f6ddd6a296d1092b988047770c..e54428a2566436d9579ea44fe5490468b2512f47 100644
--- a/scapy/base_classes.py
+++ b/scapy/base_classes.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Generators and packet meta classes.
+"""
+
 ###############
 ## Generators ##
 ################
diff --git a/scapy/config.py b/scapy/config.py
index 394221db9976cfd4325e6e1211a67c04548d5662..ae9ae17a6f837f27f235097a5b49a25c7012bc69 100644
--- a/scapy/config.py
+++ b/scapy/config.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Implementation for of the configuration object.
+"""
+
 import os,time,socket,sys
 from data import *
 import base_classes
diff --git a/scapy/crypto/__init__.py b/scapy/crypto/__init__.py
index a29ecf8da77e55ce98073d5bfe6859c5466f625b..b441863e820e6711a0aeaa73e46cc9222a261937 100644
--- a/scapy/crypto/__init__.py
+++ b/scapy/crypto/__init__.py
@@ -3,7 +3,9 @@
 ## Copyright (C) Arnaud Ebalard <arno@natisbad.org>
 ## This program is published under a GPLv2 license
 
-
+"""
+Tools for handling with digital certificates.
+"""
 
 try:
     import Crypto
diff --git a/scapy/crypto/cert.py b/scapy/crypto/cert.py
index b10b4ee5851749112b123ac7cecc22561fd18c1e..3d254fa3935662f6a5d1a3322a11af908a4c4460 100644
--- a/scapy/crypto/cert.py
+++ b/scapy/crypto/cert.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Arnaud Ebalard <arno@natisbad.org>
 ## This program is published under a GPLv2 license
 
+"""
+Cryptographic certificates.
+"""
+
 import os, sys, math, socket, struct, sha, hmac, string, time
 import random, popen2, tempfile
 from scapy.utils import strxor
diff --git a/scapy/dadict.py b/scapy/dadict.py
index 0ba66a6e40f1bb1c601da85e386abb2d59e78482..dcfd2a775ed9bf90a5f1c6e5299aad3b522bb1a1 100644
--- a/scapy/dadict.py
+++ b/scapy/dadict.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Direct Access dictionary.
+"""
+
 from error import Scapy_Exception
 
 ###############################
diff --git a/scapy/data.py b/scapy/data.py
index 820232f92d7af69913f303a644c115df4307d407..de01cfc9cf1458a089a53da53c441b1495376fe4 100644
--- a/scapy/data.py
+++ b/scapy/data.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Global variables and functions for handling external data sets.
+"""
+
 import os,sys,re
 from dadict import DADict
 from error import log_loading
diff --git a/scapy/error.py b/scapy/error.py
index b97c8a9453bdf4b8b18ca9d44acd39753f3067b5..29ebc1ba036c60485723fb9793e416a30f15dd3e 100644
--- a/scapy/error.py
+++ b/scapy/error.py
@@ -3,6 +3,9 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Logging subsystem and basic exception class.
+"""
 
 #############################
 ##### Logging subsystem #####
diff --git a/scapy/fields.py b/scapy/fields.py
index 7989a6737d4a106808023077b1c2dcd2655f0d57..a700a73d9182a32de1a81654690011ac6efac8b8 100644
--- a/scapy/fields.py
+++ b/scapy/fields.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Fields: basic data structures that make up parts of packets.
+"""
+
 import struct,copy,socket
 from config import conf
 from volatile import *
diff --git a/scapy/layers/__init__.py b/scapy/layers/__init__.py
index 881e0e302bc284d44d1e638209a9ed503bf07d6e..a3f2afb9b73e6853d60bc4bcf7775e2da56b66dc 100644
--- a/scapy/layers/__init__.py
+++ b/scapy/layers/__init__.py
@@ -2,3 +2,7 @@
 ## See http://www.secdev.org/projects/scapy for more informations
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
+
+"""
+Layer package.
+"""
diff --git a/scapy/layers/all.py b/scapy/layers/all.py
index 6251c2a594fe6c00cfc7be66889ea6a4308dcc6a..c6bb3791ef02ed2eabc3c16a85044d8b7b18f1d9 100644
--- a/scapy/layers/all.py
+++ b/scapy/layers/all.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+All layers. Configurable with conf.load_layers.
+"""
+
 from scapy.config import conf
 from scapy.error import log_loading
 
diff --git a/scapy/layers/bluetooth.py b/scapy/layers/bluetooth.py
index 89757a98daeb7901c65e25148bd20d8aa8c858a0..40828f4be839c640844a6823ea7001fa6bb26169 100644
--- a/scapy/layers/bluetooth.py
+++ b/scapy/layers/bluetooth.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Bluetooth layers, sockets and send/receive functions.
+"""
+
 import socket,struct
 
 from scapy.config import conf
diff --git a/scapy/layers/dhcp.py b/scapy/layers/dhcp.py
index a542e889c05a9fbb474ea8d76a878ae8d52595e2..ee8645d686a1b6bdf1be838012c89e4008e5c1f5 100644
--- a/scapy/layers/dhcp.py
+++ b/scapy/layers/dhcp.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+DHCP (Dynamic Host Configuration Protocol) d BOOTP
+"""
+
 import struct
 
 from scapy.packet import *
diff --git a/scapy/layers/dhcp6.py b/scapy/layers/dhcp6.py
index 07eee8afb38e309352e7014d6795ca233b8f3b17..8fa8999e63f32a8b807f453eeba4e5fb8c57aa9b 100644
--- a/scapy/layers/dhcp6.py
+++ b/scapy/layers/dhcp6.py
@@ -6,6 +6,10 @@
 ## Copyright (C) 2005  Guillaume Valadon <guedou@hongo.wide.ad.jp>
 ##                     Arnaud Ebalard <arnaud.ebalard@eads.net>
 
+"""
+DHCPv6: Dynamic Host Configuration Protocol for IPv6. [RFC 3315]
+"""
+
 import socket
 from scapy.packet import *
 from scapy.fields import *
diff --git a/scapy/layers/dns.py b/scapy/layers/dns.py
index 7ca570e1a4afc7913970920ef9318deaa1043d21..29c8fbebd640a7cb0b89aff01bfbb2c7f7c78b2f 100644
--- a/scapy/layers/dns.py
+++ b/scapy/layers/dns.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+DNS: Domain Name System.
+"""
+
 import socket,struct
 
 from scapy.packet import *
diff --git a/scapy/layers/dot11.py b/scapy/layers/dot11.py
index 5fbf5121f0f435282dabd889e8f65cea542c9c27..a96def3622020b2bba14d5e814154315a94fb091 100644
--- a/scapy/layers/dot11.py
+++ b/scapy/layers/dot11.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Wireless LAN according to IEEE 802.11.
+"""
+
 import re,struct
 
 from scapy.packet import *
diff --git a/scapy/layers/gprs.py b/scapy/layers/gprs.py
index fa944d8ad78a75aadfde0c31e0e4770e716979c7..31a931fe82c3bd7479f79f546c81f7d87a1f1a8b 100644
--- a/scapy/layers/gprs.py
+++ b/scapy/layers/gprs.py
@@ -3,6 +3,9 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+GPRS (General Packet Radio Service) for mobile data communication.
+"""
 
 from scapy.fields import *
 from scapy.packet import *
diff --git a/scapy/layers/hsrp.py b/scapy/layers/hsrp.py
index 2e7e4a42fe12903ebcb7e9f6faed2fe01859e6ef..c981f39b84206b1b7775c2e28d049974e9780126 100644
--- a/scapy/layers/hsrp.py
+++ b/scapy/layers/hsrp.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+HSRP (Hot Standby Router Protocol): proprietary redundancy protocol for Cisco routers.
+"""
+
 from scapy.fields import *
 from scapy.packet import *
 from scapy.layers.inet import UDP
diff --git a/scapy/layers/inet.py b/scapy/layers/inet.py
index b26a0cd8f8b6faddfe935b9ff48daee5f018a3d4..0de93e73f8f9d5b14e79c47c1df4f072ee1055e0 100644
--- a/scapy/layers/inet.py
+++ b/scapy/layers/inet.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+IPv4 (Internet Protocol v4).
+"""
+
 import os,time,struct,re,socket,new
 from select import select
 from collections import defaultdict
diff --git a/scapy/layers/inet6.py b/scapy/layers/inet6.py
index f30ac79a7f7aec004e74b9d64737b4f46ba676f4..372dac7598a7469c3a6e9525ef9d67407804dad0 100644
--- a/scapy/layers/inet6.py
+++ b/scapy/layers/inet6.py
@@ -19,6 +19,10 @@
 ##                                                                         ##
 #############################################################################
 
+"""
+IPv6 (Internet Protocol v6).
+"""
+
 
 import socket
 if not socket.has_ipv6:
diff --git a/scapy/layers/ir.py b/scapy/layers/ir.py
index daf49a63dcee041b153b88d821947acf7d84a271..fc738c559f1286061ac7e88444cc047244a6bfbb 100644
--- a/scapy/layers/ir.py
+++ b/scapy/layers/ir.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+IrDA infrared data communication.
+"""
+
 from scapy.packet import *
 from scapy.fields import *
 from scapy.layers.l2 import CookedLinux
diff --git a/scapy/layers/isakmp.py b/scapy/layers/isakmp.py
index ccbad10deb2a29906499abfb01122d423b20dc95..8fab225ce7c51103f95b89929a03c4bb374ff38c 100644
--- a/scapy/layers/isakmp.py
+++ b/scapy/layers/isakmp.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+ISAKMP (Internet Security Association and Key Management Protocol).
+"""
+
 import struct
 from scapy.packet import *
 from scapy.fields import *
diff --git a/scapy/layers/l2.py b/scapy/layers/l2.py
index 6fd1141f51698bd5eea17f3a63b0fdcde5efbb72..c90545d69694c5ef31093df03450f7e9e4076685 100644
--- a/scapy/layers/l2.py
+++ b/scapy/layers/l2.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Classes and functions for layer 2 protocols.
+"""
+
 import os,struct,time
 from scapy.base_classes import Net
 from scapy.config import conf
diff --git a/scapy/layers/l2tp.py b/scapy/layers/l2tp.py
index 62c39f4af1b373389d7a0008cc8affa6eda3ec05..0b56db2114bc79cac6462d0de782cd5a964439b5 100644
--- a/scapy/layers/l2tp.py
+++ b/scapy/layers/l2tp.py
@@ -3,6 +3,12 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+L2TP (Layer 2 Tunneling Protocol) for VPNs.
+
+[RFC 2661]
+"""
+
 import struct
 
 from scapy.packet import *
diff --git a/scapy/layers/llmnr.py b/scapy/layers/llmnr.py
index 561729c876fa4547d6e91f0102edf4928d976be7..f87425ff3d452255d64dfddb11e03fbaec73bf1d 100644
--- a/scapy/layers/llmnr.py
+++ b/scapy/layers/llmnr.py
@@ -3,6 +3,11 @@ from scapy.packet import *
 from scapy.layers.inet import UDP
 from scapy.layers.dns import DNSQRField, DNSRRField, DNSRRCountField
 
+"""
+LLMNR (Link Local Multicast Node Resolution).
+
+[RFC 4795]
+"""
 
 #############################################################################
 ###                           LLMNR (RFC4795)                             ###
diff --git a/scapy/layers/mgcp.py b/scapy/layers/mgcp.py
index aee14cabdd9d194e5f788879bcc6ec5a621d7619..5d8a064ec3500d7a5a3ad57db4a65778ebdb2141 100644
--- a/scapy/layers/mgcp.py
+++ b/scapy/layers/mgcp.py
@@ -3,6 +3,12 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+MGCP (Media Gateway Control Protocol)
+
+[RFC 2805]
+"""
+
 from scapy.packet import *
 from scapy.fields import *
 from scapy.layers.inet import UDP
diff --git a/scapy/layers/mobileip.py b/scapy/layers/mobileip.py
index af8186605b3781efbb99c005b067863e60b6cafc..bbaa8ce7659f87f7dac228ffe1bb2d6a001ee688 100644
--- a/scapy/layers/mobileip.py
+++ b/scapy/layers/mobileip.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Mobile IP.
+"""
+
 from scapy.fields import *
 from scapy.packet import *
 from scapy.layers.inet import IP,UDP
diff --git a/scapy/layers/netbios.py b/scapy/layers/netbios.py
index 3253c52f04487ad665fcefaa03938a8acd28ec07..605e06f15c432859dded8bba5da08b61b86ee64b 100644
--- a/scapy/layers/netbios.py
+++ b/scapy/layers/netbios.py
@@ -3,6 +3,12 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+NetBIOS over TCP/IP
+
+[RFC 1001/1002]
+"""
+
 import struct
 from scapy.packet import *
 from scapy.fields import *
diff --git a/scapy/layers/netflow.py b/scapy/layers/netflow.py
index 02addee51b691a4b5631f821ee7aa8c0c92c79a9..44567737a5c08a4edccd491145757a8970bd8816 100644
--- a/scapy/layers/netflow.py
+++ b/scapy/layers/netflow.py
@@ -3,6 +3,11 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Cisco NetFlow protocol v1
+"""
+
+
 from scapy.fields import *
 from scapy.packet import *
 
diff --git a/scapy/layers/ntp.py b/scapy/layers/ntp.py
index ffebdfc6b3b5e54fc0b53a1fdc138e991e99e483..6d11966c9a51825cc443e213dbbfb2db862b9fb0 100644
--- a/scapy/layers/ntp.py
+++ b/scapy/layers/ntp.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+NTP (Network Time Protocol).
+"""
+
 import time
 from scapy.packet import *
 from scapy.fields import *
diff --git a/scapy/layers/pflog.py b/scapy/layers/pflog.py
index 3c62941a7722b0bb93a4d7692d82d6bef517d3d0..a8fc9fe057affe04d2c8b65a1e3d65a31be35389 100644
--- a/scapy/layers/pflog.py
+++ b/scapy/layers/pflog.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+PFLog: OpenBSD PF packet filter logging.
+"""
+
 from scapy.packet import *
 from scapy.fields import *
 from scapy.layers.inet import IP
diff --git a/scapy/layers/ppp.py b/scapy/layers/ppp.py
index 67fc3f2fb89509e34ac196310299aa0fad377a83..50c68465565ff77e57e130e9d8db9347023297a7 100644
--- a/scapy/layers/ppp.py
+++ b/scapy/layers/ppp.py
@@ -3,6 +3,12 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+PPP (Point to Point Protocol)
+
+[RFC 1661]
+"""
+
 import struct
 from scapy.packet import *
 from scapy.layers.l2 import *
diff --git a/scapy/layers/radius.py b/scapy/layers/radius.py
index e3661e013fa473b975e6a8c66025291d7f6230d7..132396036c6704032187bfb77473d8bce88c129b 100644
--- a/scapy/layers/radius.py
+++ b/scapy/layers/radius.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+RADIUS (Remote Authentication Dial In User Service)
+"""
+
 import struct
 from scapy.packet import *
 from scapy.fields import *
diff --git a/scapy/layers/rip.py b/scapy/layers/rip.py
index 51eab6658b35dc68478f9a3ac6dedef675173b4a..baf323360e35cc2a01ab719a6c4c3bfbc68ffd4b 100644
--- a/scapy/layers/rip.py
+++ b/scapy/layers/rip.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+RIP (Routing Information Protocol).
+"""
+
 from scapy.packet import *
 from scapy.fields import *
 from scapy.layers.inet import UDP
diff --git a/scapy/layers/rtp.py b/scapy/layers/rtp.py
index 83116f4b8e5c3443f5e9649ed148e53a354453ad..629dccdd0a6e5c2b681c5ce25effe8a076f892ab 100644
--- a/scapy/layers/rtp.py
+++ b/scapy/layers/rtp.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+RTP (Real-time Transport Protocol).
+"""
+
 from scapy.packet import *
 from scapy.fields import *
 
diff --git a/scapy/layers/sctp.py b/scapy/layers/sctp.py
index 82e4e4fbd7dc69b5cd1307f9a2b105a096d2af5e..5e3a1820ce04d27b68489a471144b44302e8f65d 100644
--- a/scapy/layers/sctp.py
+++ b/scapy/layers/sctp.py
@@ -4,6 +4,10 @@
 ## Copyright (C) 6WIND <olivier.matz@6wind.com>
 ## This program is published under a GPLv2 license
 
+"""
+SCTP (Stream Control Transmission Protocol).
+"""
+
 import struct
 
 from scapy.packet import *
diff --git a/scapy/layers/sebek.py b/scapy/layers/sebek.py
index 2459ae87acf13899fb6f2b1683821868cb5ead5a..c54e6728f2e0a3f9e4e34d2267afb16b75a02cd6 100644
--- a/scapy/layers/sebek.py
+++ b/scapy/layers/sebek.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Sebek: Linux kernel module for data collection on honeypots.
+"""
+
 from scapy.fields import *
 from scapy.packet import *
 from scapy.layers.inet import UDP
diff --git a/scapy/layers/skinny.py b/scapy/layers/skinny.py
index 827c6bc332d4baa13616fd8b1c4d108fc23db32c..9fb6ac060f218c5bf513b87aeb3f3c2eaf999810 100644
--- a/scapy/layers/skinny.py
+++ b/scapy/layers/skinny.py
@@ -3,12 +3,14 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Cisco Skinny protocol.
+"""
+
 from scapy.packet import *
 from scapy.fields import *
 from scapy.layers.inet import TCP
 
-# Cisco Skinny protocol
-
 # shamelessly ripped from Ethereal dissector
 skinny_messages = { 
 # Station -> Callmanager
diff --git a/scapy/layers/smb.py b/scapy/layers/smb.py
index b851f51bcbddda01f5246d49e459623e0fa386be..73ebe5b15160cfb36d69145bf27c1af36d0a8eb9 100644
--- a/scapy/layers/smb.py
+++ b/scapy/layers/smb.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+SMB (Server Message Block), also known as CIFS.
+"""
+
 from scapy.packet import *
 from scapy.fields import *
 from scapy.layers.netbios import NBTSession
diff --git a/scapy/layers/snmp.py b/scapy/layers/snmp.py
index 0681825c1ae9613cdf9da1746bcf7704eb15f9e5..2c58825036b0351a94e187aba23db7cd43127d69 100644
--- a/scapy/layers/snmp.py
+++ b/scapy/layers/snmp.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+SNMP (Simple Network Management Protocol).
+"""
+
 from scapy.asn1packet import *
 from scapy.asn1fields import *
 from scapy.layers.inet import UDP
diff --git a/scapy/layers/tftp.py b/scapy/layers/tftp.py
index 28c569eddec4e2519715fcfc06d0016574081d6a..16a782c21eeab9efab31c357994e4affd32c1f7e 100644
--- a/scapy/layers/tftp.py
+++ b/scapy/layers/tftp.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+TFTP (Trivial File Transfer Protocol).
+"""
+
 import os,random
 from scapy.packet import *
 from scapy.fields import *
diff --git a/scapy/layers/vrrp.py b/scapy/layers/vrrp.py
index a08a42f7d0a8412fba881dc1e81820ff99cf4466..f874b352ab8c2ef6a2e03e4d303acd5a23af8e6c 100644
--- a/scapy/layers/vrrp.py
+++ b/scapy/layers/vrrp.py
@@ -4,6 +4,10 @@
 ## Copyright (C) 6WIND <olivier.matz@6wind.com>
 ## This program is published under a GPLv2 license
 
+"""
+VRRP (Virtual Router Redundancy Protocol).
+"""
+
 from scapy.packet import *
 from scapy.fields import *
 from scapy.layers.inet import IP
diff --git a/scapy/layers/x509.py b/scapy/layers/x509.py
index f8388d1d4f4ebe8e9b93ae013407bede00add393..18aaa5e3391d401bdf95150cf1f8305c67f87a85 100644
--- a/scapy/layers/x509.py
+++ b/scapy/layers/x509.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+X.509 certificates.
+"""
+
 from scapy.asn1packet import *
 from scapy.asn1fields import *
 
diff --git a/scapy/main.py b/scapy/main.py
index beb70afa7c29861602d264c94c49d8f38b705a5e..ec9aee2ca34fec817544e8765f7a899b2768016e 100644
--- a/scapy/main.py
+++ b/scapy/main.py
@@ -3,6 +3,9 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Main module for interactive startup.
+"""
 
 from __future__ import generators
 import os,sys
diff --git a/scapy/modules/__init__.py b/scapy/modules/__init__.py
index 881e0e302bc284d44d1e638209a9ed503bf07d6e..6303dad0d69d78df1ae20426177f90e38311bba0 100644
--- a/scapy/modules/__init__.py
+++ b/scapy/modules/__init__.py
@@ -2,3 +2,7 @@
 ## See http://www.secdev.org/projects/scapy for more informations
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
+
+"""
+Package of extension modules that have to be loaded explicitly.
+"""
diff --git a/scapy/modules/geoip.py b/scapy/modules/geoip.py
index e63596923828c3814d93dbf3cf3f393664b08147..8b308a4ce4ed0a99d759bdefeed0e20ce14d108c 100644
--- a/scapy/modules/geoip.py
+++ b/scapy/modules/geoip.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+GeoIP: find out the geographical location of IP addresses
+"""
+
 from scapy.data import KnowledgeBase
 from scapy.config import conf
 
diff --git a/scapy/modules/nmap.py b/scapy/modules/nmap.py
index ffed334a63a80918f7e90391c4afa56b902677fa..fc53f427584ef28b3cf98d4d0021d4526a9d330f 100644
--- a/scapy/modules/nmap.py
+++ b/scapy/modules/nmap.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Clone of Nmap's first generation OS fingerprinting.
+"""
+
 import os
 
 from scapy.data import KnowledgeBase
diff --git a/scapy/modules/p0f.py b/scapy/modules/p0f.py
index ebcf68d05940be09298b95365ccd5d3692906b78..21bbd925380704df5e446198e4d925df2ae7d032 100644
--- a/scapy/modules/p0f.py
+++ b/scapy/modules/p0f.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Clone of p0f passive OS fingerprinting
+"""
+
 from scapy.data import KnowledgeBase
 from scapy.config import conf
 from scapy.layers.inet import IP, TCP, TCPOptions
diff --git a/scapy/modules/queso.py b/scapy/modules/queso.py
index 6284cd90815bfa0e2ee389304b90f2c0410ee4e0..ebc5486e13878b1a853612707ae910c5db0264e4 100644
--- a/scapy/modules/queso.py
+++ b/scapy/modules/queso.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Clone of queso OS fingerprinting
+"""
+
 from scapy.data import KnowledgeBase
 from scapy.config import conf
 from scapy.layers.inet import IP,TCP
diff --git a/scapy/modules/voip.py b/scapy/modules/voip.py
index 0d0b4daf93c50cc450d20c849fbdb6a2059f2399..d221ecf24675e3e8d7e74c7a03deadf7a066cda4 100644
--- a/scapy/modules/voip.py
+++ b/scapy/modules/voip.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+VoIP (Voice over IP) related functions
+"""
+
 import os
 ###################
 ## Testing stuff ##
diff --git a/scapy/packet.py b/scapy/packet.py
index 1f51f3181109c046f84d0df4c34a66d92c63afba..0accd354dc91a06ad3be6f57f1a2fce9ff1647ae 100644
--- a/scapy/packet.py
+++ b/scapy/packet.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Packet class. Binding mechanism. fuzz() method.
+"""
+
 import time,itertools,os
 from fields import StrField,ConditionalField,Emph,PacketListField
 from config import conf
diff --git a/scapy/plist.py b/scapy/plist.py
index 4cb01a7aa88eab6460773d8a590e1d14669f47e5..0abe460ebed4d4f1ba8ae92f5431137276a289c0 100644
--- a/scapy/plist.py
+++ b/scapy/plist.py
@@ -3,6 +3,11 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+PacketList: holds several packets and allows to do operations on them.
+"""
+
+
 import os,subprocess
 from config import conf
 from base_classes import BasePacket,BasePacketList
diff --git a/scapy/pton_ntop.py b/scapy/pton_ntop.py
index 8f83697d31d81f31e946bd3eb2ee6149047e11b4..1bd88920e15f939725030eed1e22ce366b7e7dae 100644
--- a/scapy/pton_ntop.py
+++ b/scapy/pton_ntop.py
@@ -3,11 +3,14 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Convert IPv6 addresses between textual representation and binary.
 
-import socket,struct
+These functions are missing when python is compiled
+without IPv6 support, on Windows for instance.
+"""
 
-# These functions are missing when python is compiled
-# without IPv6 support, on Windows for instance
+import socket,struct
 
 def inet_pton(af, addr):
     """Convert an IP address from text representation into binary form"""
diff --git a/scapy/route.py b/scapy/route.py
index d63176c0be56f43b8299910a2083b95343fa5931..52a95629388f0c050ec2f58fa3abd95b59cc3377 100644
--- a/scapy/route.py
+++ b/scapy/route.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Routing and handling of network interfaces.
+"""
+
 import socket
 from arch import read_routes,get_if_addr,LOOPBACK_NAME
 from utils import atol,ltoa,itom
diff --git a/scapy/route6.py b/scapy/route6.py
index 953339905820363c3ba8014a42162fedaaf0fae4..51116aaf54d519ad510cd9a9f236083454054d3d 100644
--- a/scapy/route6.py
+++ b/scapy/route6.py
@@ -6,6 +6,9 @@
 ## Copyright (C) 2005  Guillaume Valadon <guedou@hongo.wide.ad.jp>
 ##                     Arnaud Ebalard <arnaud.ebalard@eads.net>
 
+"""
+Routing and network interface handling for IPv6.
+"""
 
 #############################################################################
 #############################################################################
diff --git a/scapy/sendrecv.py b/scapy/sendrecv.py
index b72d96541f7c487b05d66a0187ba8272910b781f..a50bd7e1b731da04aeb47ea9029945cf9f003a70 100644
--- a/scapy/sendrecv.py
+++ b/scapy/sendrecv.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Functions to send and receive packets.
+"""
+
 import cPickle,os,sys,time,subprocess
 from select import select
 from data import *
diff --git a/scapy/supersocket.py b/scapy/supersocket.py
index acd498929f9b8c34aab559cbc03b84facfad4b6b..c5ebe46a6253c9668377d063f83016290e16ce31 100644
--- a/scapy/supersocket.py
+++ b/scapy/supersocket.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+SuperSocket.
+"""
+
 import socket,time
 from config import conf
 from data import *
diff --git a/scapy/themes.py b/scapy/themes.py
index 866de0e151e5dc5cf6e670c9ffcd91926741f158..188fd5470b75f6b98b86f7ad0a070219139d7f4b 100644
--- a/scapy/themes.py
+++ b/scapy/themes.py
@@ -3,6 +3,9 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Color themes for the interactive console.
+"""
 
 ##################
 ## Color themes ##
diff --git a/scapy/tools/UTscapy.py b/scapy/tools/UTscapy.py
index f8790ac8f73e7a8c5b04f9eb741ba1544df0174d..ff8460c52010f53d4adf41a336f378105929cd51 100755
--- a/scapy/tools/UTscapy.py
+++ b/scapy/tools/UTscapy.py
@@ -3,6 +3,9 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Unit testing infrastructure for Scapy
+"""
 
 import sys,getopt,imp
 import bz2, base64, os.path, time, traceback, zlib, sha
diff --git a/scapy/tools/__init__.py b/scapy/tools/__init__.py
index 881e0e302bc284d44d1e638209a9ed503bf07d6e..af6eec747b2d7c2aa22810ed69591d52396298f1 100644
--- a/scapy/tools/__init__.py
+++ b/scapy/tools/__init__.py
@@ -2,3 +2,7 @@
 ## See http://www.secdev.org/projects/scapy for more informations
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
+
+"""
+Additional tools to be run separately
+"""
diff --git a/scapy/utils.py b/scapy/utils.py
index 06f451e07cfa7d500c1684078b126165aae24425..07e3a8ae89af2d99124fc94ad0f0e0c7323ef422 100644
--- a/scapy/utils.py
+++ b/scapy/utils.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+General utility functions.
+"""
+
 import os,sys,socket,types
 import random,time
 import gzip,zlib,cPickle
diff --git a/scapy/utils6.py b/scapy/utils6.py
index eab813b35019a6576812f9cc60dddea42736d06f..9d12081f5214691cd2fb614bc9a39df43d7126ca 100644
--- a/scapy/utils6.py
+++ b/scapy/utils6.py
@@ -6,6 +6,9 @@
 ## Copyright (C) 2005  Guillaume Valadon <guedou@hongo.wide.ad.jp>
 ##                     Arnaud Ebalard <arnaud.ebalard@eads.net>
 
+"""
+Utility functions for IPv6.
+"""
 
 from config import conf
 from data import *
diff --git a/scapy/volatile.py b/scapy/volatile.py
index de2945935e6f5f87e2fbf611664c652c9bec2532..dcb704c1c8b5fa5f9928df182a938835f7a5d599 100644
--- a/scapy/volatile.py
+++ b/scapy/volatile.py
@@ -3,6 +3,10 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+"""
+Fields that hold random numbers.
+"""
+
 import random,time,math
 from base_classes import Net
 from utils import corrupt_bits,corrupt_bytes
diff --git a/setup.py b/setup.py
index 92a0c53cfeb4266833d3da82f727ea1dd1c683bf..aecd37fb4fcef23358ac38f8b85b6a84fc8529cb 100755
--- a/setup.py
+++ b/setup.py
@@ -1,5 +1,9 @@
 #! /usr/bin/env python
 
+"""
+Distutils setup file for Scapy.
+"""
+
 
 from distutils import archive_util
 from distutils import sysconfig