diff -u -p -r src-3.0.6/src/cave.c src-dtrap/src/cave.c
--- src-3.0.6/src/cave.c	2005-02-06 14:28:26.000000000 +0000
+++ src-dtrap/src/cave.c	2006-01-30 17:27:17.000000000 +0000
@@ -3883,6 +3883,7 @@ void wiz_dark(void)
 		{
 			/* Process the grid */
 			cave_info[y][x] &= ~(CAVE_MARK);
+			cave_info2[y][x] &= ~(CAVE2_DTRAP);
 		}
 	}
 
diff -u -p -r src-3.0.6/src/cmd1.c src-dtrap/src/cmd1.c
--- src-3.0.6/src/cmd1.c	2005-02-23 21:00:45.000000000 +0000
+++ src-dtrap/src/cmd1.c	2006-01-30 16:51:30.000000000 +0000
@@ -1231,6 +1231,9 @@ void move_player(int dir, int jumping)
 	int y, x;
 
 
+	bool old_dtrap, new_dtrap;
+
+
 	/* Find the result of moving */
 	y = py + ddy[dir];
 	x = px + ddx[dir];
@@ -1330,8 +1333,27 @@ void move_player(int dir, int jumping)
 		/* Sound XXX XXX XXX */
 		/* sound(MSG_WALK); */
 
-		/* Move player */
-		monster_swap(py, px, y, x);
+		/* See if trap detection status will change */
+		old_dtrap = ((cave_info2[py][px] & (CAVE2_DTRAP)) != 0);
+		new_dtrap = ((cave_info2[y][x] & (CAVE2_DTRAP)) != 0);
+
+		/* Note the change in the detect status */
+		if (old_dtrap != new_dtrap) p_ptr->redraw |= (PR_DTRAP);
+
+		/* Disturb player if the player is about to leave the detect area XXX */
+		if (disturb_detect && p_ptr->running && old_dtrap && !new_dtrap)
+		{
+			/* Disturb the player */
+			disturb(0, 0);
+
+			/* Done XXX */
+			return;
+		}
+
+  		/* Move player */
+  		monster_swap(py, px, y, x);
+  
+
 
 		/* New location */
 		y = py = p_ptr->py;
diff -u -p -r src-3.0.6/src/defines.h src-dtrap/src/defines.h
--- src-3.0.6/src/defines.h	2005-06-18 18:37:15.000000000 +0100
+++ src-dtrap/src/defines.h	2006-01-30 16:42:32.000000000 +0000
@@ -531,14 +531,17 @@
 #define ROW_STATE		(Term->hgt - 1)
 #define COL_STATE		38	/* <state> */
 
+#define ROW_DTRAP		(Term->hgt - 1)
+#define COL_DTRAP		49	/* "DTrap" */
+
 #define ROW_SPEED		(Term->hgt - 1)
-#define COL_SPEED		49	/* "Slow (-NN)" or "Fast (+NN)" */
+#define COL_SPEED		55	/* "Slow (-NN)" or "Fast (+NN)" */
 
 #define ROW_STUDY		(Term->hgt - 1)
-#define COL_STUDY		64	/* "Study" */
+#define COL_STUDY		66	/* "Study" */
 
 #define ROW_DEPTH		(Term->hgt - 1)
-#define COL_DEPTH		70	/* "Lev NNN" / "NNNN ft" */
+#define COL_DEPTH		72	/* "Lev NNN" / "NNNN ft" */
 
 #define ROW_OPPOSE_ELEMENTS	(Term->hgt - 1)
 #define COL_OPPOSE_ELEMENTS	80	/* "Acid Elec Fire Cold Pois" */
@@ -1618,7 +1621,7 @@
 #define PR_CUT			0x00001000L	/* Display Extra (Cut) */
 #define PR_STUN			0x00002000L	/* Display Extra (Stun) */
 #define PR_HUNGER		0x00004000L	/* Display Extra (Hunger) */
-/* xxx */
+#define PR_DTRAP		0x00008000L /* Display Extra (Trap detection) */
 #define PR_BLIND		0x00010000L	/* Display Extra (Blind) */
 #define PR_CONFUSED		0x00020000L	/* Display Extra (Confused) */
 #define PR_AFRAID		0x00040000L	/* Display Extra (Afraid) */
@@ -1679,6 +1682,7 @@
 #define CAVE_TEMP		0x40 	/* temp flag */
 #define CAVE_WALL		0x80 	/* wall flag */
 
+#define CAVE2_DTRAP		0x01	/* trap detected grid */
 
 
 /*** Object flags ***/
@@ -2418,7 +2422,7 @@
 #define OPT_run_use_corners			19
 #define OPT_disturb_move			20
 #define OPT_disturb_near			21
-#define OPT_disturb_panel			22
+#define OPT_disturb_detect			22
 #define OPT_disturb_state			23
 #define OPT_disturb_minor			24
 /* xxx OPT_disturb_other */
@@ -2538,7 +2542,7 @@
 #define run_use_corners			op_ptr->opt[OPT_run_use_corners]
 #define disturb_move			op_ptr->opt[OPT_disturb_move]
 #define disturb_near			op_ptr->opt[OPT_disturb_near]
-#define disturb_panel			op_ptr->opt[OPT_disturb_panel]
+#define disturb_detect			op_ptr->opt[OPT_disturb_detect]
 #define disturb_state			op_ptr->opt[OPT_disturb_state]
 #define disturb_minor			op_ptr->opt[OPT_disturb_minor]
 /* xxx disturb_other */
diff -u -p -r src-3.0.6/src/externs.h src-dtrap/src/externs.h
--- src-3.0.6/src/externs.h	2005-02-08 10:46:02.000000000 +0000
+++ src-dtrap/src/externs.h	2006-01-30 16:31:06.000000000 +0000
@@ -147,6 +147,7 @@ extern u16b *temp_g;
 extern byte *temp_y;
 extern byte *temp_x;
 extern byte (*cave_info)[256];
+extern byte (*cave_info2)[256];
 extern byte (*cave_feat)[DUNGEON_WID];
 extern s16b (*cave_o_idx)[DUNGEON_WID];
 extern s16b (*cave_m_idx)[DUNGEON_WID];
diff -u -p -r src-3.0.6/src/generate.c src-dtrap/src/generate.c
--- src-3.0.6/src/generate.c	2004-05-31 16:15:23.000000000 +0100
+++ src-dtrap/src/generate.c	2006-01-30 16:36:51.000000000 +0000
@@ -3383,6 +3383,7 @@ void generate_cave(void)
 			{
 				/* No flags */
 				cave_info[y][x] = 0;
+				cave_info2[y][x] = 0;
 
 				/* No features */
 				cave_feat[y][x] = 0;
diff -u -p -r src-3.0.6/src/init2.c src-dtrap/src/init2.c
--- src-3.0.6/src/init2.c	2005-01-16 14:35:57.000000000 +0000
+++ src-dtrap/src/init2.c	2006-01-30 16:36:37.000000000 +0000
@@ -1373,6 +1373,7 @@ static errr init_other(void)
 
 	/* Padded into array */
 	C_MAKE(cave_info, DUNGEON_HGT, byte_256);
+	C_MAKE(cave_info2, DUNGEON_HGT, byte_256);
 
 	/* Feature array */
 	C_MAKE(cave_feat, DUNGEON_HGT, byte_wid);
@@ -2103,6 +2104,7 @@ void cleanup_angband(void)
 	FREE(cave_o_idx);
 	FREE(cave_m_idx);
 	FREE(cave_feat);
+	FREE(cave_info2);
 	FREE(cave_info);
 
 	/* Free the "update_view()" array */
diff -u -p -r src-3.0.6/src/load.c src-dtrap/src/load.c
--- src-3.0.6/src/load.c	2005-05-07 13:30:37.000000000 +0100
+++ src-dtrap/src/load.c	2006-01-30 16:34:16.000000000 +0000
@@ -1501,6 +1501,31 @@ static errr rd_dungeon(void)
 		}
 	}
 
+	/* Load the dungeon data */
+	for (x = y = 0; y < DUNGEON_HGT; )
+	{
+		/* Grab RLE info */
+		rd_byte(&count);
+		rd_byte(&tmp8u);
+
+		/* Apply the RLE info */
+		for (i = count; i > 0; i--)
+		{
+			/* Extract "info" */
+			cave_info2[y][x] = tmp8u;
+
+			/* Advance/Wrap */
+			if (++x >= DUNGEON_WID)
+			{
+				/* Wrap */
+				x = 0;
+
+				/* Advance/Wrap */
+				if (++y >= DUNGEON_HGT) break;
+			}
+		}
+	}
+
 
 	/*** Run length decoding ***/
 
diff -u -p -r src-3.0.6/src/monster2.c src-dtrap/src/monster2.c
--- src-3.0.6/src/monster2.c	2004-05-31 13:01:32.000000000 +0100
+++ src-dtrap/src/monster2.c	2006-01-30 16:40:56.000000000 +0000
@@ -1329,6 +1329,9 @@ void monster_swap(int y1, int x1, int y2
 		p_ptr->py = y2;
 		p_ptr->px = x2;
 
+		/* Update the trap detection status */
+		p_ptr->redraw |= (PR_DTRAP);
+
 		/* Update the panel */
 		p_ptr->update |= (PU_PANEL);
 
@@ -1362,6 +1365,9 @@ void monster_swap(int y1, int x1, int y2
 		p_ptr->py = y1;
 		p_ptr->px = x1;
 
+		/* Update the trap detection status */
+		p_ptr->redraw |= (PR_DTRAP);
+
 		/* Update the panel */
 		p_ptr->update |= (PU_PANEL);
 
diff -u -p -r src-3.0.6/src/save.c src-dtrap/src/save.c
--- src-3.0.6/src/save.c	2004-02-05 20:25:15.000000000 +0000
+++ src-dtrap/src/save.c	2006-01-30 16:33:53.000000000 +0000
@@ -1256,6 +1256,44 @@ static void wr_dungeon(void)
 		wr_byte((byte)prev_char);
 	}
 
+	/** Now dump the cave_info2[][] stuff **/
+
+	/* Note that this will induce two wasted bytes */
+	count = 0;
+	prev_char = 0;
+
+	/* Dump the cave */
+	for (y = 0; y < DUNGEON_HGT; y++)
+	{
+		for (x = 0; x < DUNGEON_WID; x++)
+		{
+			/* Keep all the information from info2 */
+			tmp8u = cave_info2[y][x];
+
+			/* If the run is broken, or too full, flush it */
+			if ((tmp8u != prev_char) || (count == MAX_UCHAR))
+			{
+				wr_byte((byte)count);
+				wr_byte((byte)prev_char);
+				prev_char = tmp8u;
+				count = 1;
+			}
+
+			/* Continue the run */
+			else
+			{
+				count++;
+			}
+		}
+	}
+
+	/* Flush the data (if any) */
+	if (count)
+	{
+		wr_byte((byte)count);
+		wr_byte((byte)prev_char);
+	}
+
 
 	/*** Simple "Run-Length-Encoding" of cave ***/
 
diff -u -p -r src-3.0.6/src/spells2.c src-dtrap/src/spells2.c
--- src-3.0.6/src/spells2.c	2005-05-07 17:16:29.000000000 +0100
+++ src-dtrap/src/spells2.c	2006-01-30 17:37:40.000000000 +0000
@@ -999,20 +999,24 @@ bool detect_traps(void)
 				/* Redraw */
 				lite_spot(y, x);
 
-				/* Obvious */
+				/* We found something to detect */
 				detect = TRUE;
 			}
+
+			/* Mark as trap-detected */
+			cave_info2[y][x] |= (CAVE2_DTRAP);
 		}
 	}
 
 	/* Describe */
 	if (detect)
-	{
 		msg_print("You sense the presence of traps!");
-	}
+
+	/* Mark the redraw flag */
+	p_ptr->redraw |= (PR_DTRAP);
 
 	/* Result */
-	return (detect);
+	return (TRUE);
 }
 
 
Only in src-dtrap/src: spells2.o
Only in src-dtrap/src: store.o
diff -u -p -r src-3.0.6/src/tables.c src-dtrap/src/tables.c
--- src-3.0.6/src/tables.c	2004-09-25 10:50:00.000000000 +0100
+++ src-dtrap/src/tables.c	2006-01-30 16:40:57.000000000 +0000
@@ -1418,7 +1418,7 @@ cptr option_text[OPT_MAX] =
 	"run_use_corners",			/* OPT_run_use_corners */
 	"disturb_move",				/* OPT_disturb_move */
 	"disturb_near",				/* OPT_disturb_near */
-	"disturb_panel",			/* OPT_disturb_panel */
+	"disturb_detect",			/* OPT_disturb_detect */
 	"disturb_state",			/* OPT_disturb_state */
 	"disturb_minor",			/* OPT_disturb_minor */
 	NULL,						/* xxx disturb_other */
@@ -1682,7 +1682,7 @@ cptr option_desc[OPT_MAX] =
 	"When running, use corners",				/* OPT_run_use_corners */
 	"Disturb whenever any monster moves",		/* OPT_disturb_move */
 	"Disturb whenever viewable monster moves",	/* OPT_disturb_near */
-	"Disturb whenever map panel changes",		/* OPT_disturb_panel */
+	"Disturb whenever leaving trap detected area", /* OPT_disturb_detect */
 	"Disturb whenever player state changes",	/* OPT_disturb_state */
 	"Disturb whenever boring things happen",	/* OPT_disturb_minor */
 	NULL,										/* xxx disturb_other */
@@ -1946,7 +1946,7 @@ const bool option_norm[OPT_MAX] =
 	TRUE,		/* OPT_run_use_corners */
 	TRUE,		/* OPT_disturb_move */
 	TRUE,		/* OPT_disturb_near */
-	TRUE,		/* OPT_disturb_panel */
+	TRUE,		/* OPT_disturb_detect */
 	TRUE,		/* OPT_disturb_state */
 	TRUE,		/* OPT_disturb_minor */
 	FALSE,		/* xxx disturb_other */
@@ -2222,7 +2222,7 @@ const byte option_page[OPT_PAGE_MAX][OPT
 		OPT_run_use_corners,
 		OPT_disturb_move,
 		OPT_disturb_near,
-		OPT_disturb_panel,
+		OPT_disturb_detect,
 		OPT_disturb_state,
 		OPT_disturb_minor,
 		OPT_verify_destroy,
diff -u -p -r src-3.0.6/src/variable.c src-dtrap/src/variable.c
--- src-3.0.6/src/variable.c	2005-03-05 09:50:56.000000000 +0000
+++ src-dtrap/src/variable.c	2006-01-30 16:30:03.000000000 +0000
@@ -396,10 +396,11 @@ byte *temp_x;
 /*
  * Array[DUNGEON_HGT][256] of cave grid info flags (padded)
  *
- * This array is padded to a width of 256 to allow fast access to elements
+ * These arrays are padded to a width of 256 to allow fast access to elements
  * in the array via "grid" values (see the GRID() macros).
  */
 byte (*cave_info)[256];
+byte (*cave_info2)[256];
 
 /*
  * Array[DUNGEON_HGT][DUNGEON_WID] of cave grid feature codes
diff -u -p -r src-3.0.6/src/xtra1.c src-dtrap/src/xtra1.c
--- src-3.0.6/src/xtra1.c	2004-06-25 18:14:35.000000000 +0100
+++ src-dtrap/src/xtra1.c	2006-01-30 17:39:51.000000000 +0000
@@ -625,6 +625,31 @@ static void prt_state(int row, int col)
 
 
 /*
+ * Prints trap detection status
+ *
+ * One could use another p_ptr flag to divorce this function from
+ * cave_info[][], with codes to update it properly in some places.
+ * I can't decide which is better. -- pelpel
+ */
+static void prt_dtrap(int row, int col)
+{
+	byte info = cave_info2[p_ptr->py][p_ptr->px];
+
+	/* The player is in a trap-detected grid */
+	if (info & (CAVE2_DTRAP))
+	{
+		c_put_str(TERM_GREEN, "DTrap", row, col);
+	}
+
+	/* Not in a trap-detected grid */
+	else
+	{
+		put_str("     ", row, col);
+	}
+}
+
+
+/*
  * Prints the speed of a character.			-CJS-
  */
 static void prt_speed(int row, int col)
@@ -652,7 +677,7 @@ static void prt_speed(int row, int col)
 	}
 
 	/* Display the speed */
-	c_put_str(attr, format("%-14s", buf), row, col);
+	c_put_str(attr, format("%-10s", buf), row, col);
 }
 
 
@@ -1154,6 +1179,9 @@ static void prt_status_line(void)
 	/* State */
 	prt_state(row, COL_STATE);
 
+	/* Trap detection */
+	prt_dtrap(row, COL_DTRAP);
+
 	/* Speed */
 	prt_speed(row, COL_SPEED);
 
@@ -3091,6 +3119,12 @@ void redraw_stuff(void)
 		prt_state(ROW_STATE, COL_STATE);
 	}
 
+	if (p_ptr->redraw & (PR_DTRAP))
+	{
+		p_ptr->redraw &= ~(PR_DTRAP);
+		prt_dtrap(ROW_DTRAP, COL_DTRAP);
+	}
+
 	if (p_ptr->redraw & (PR_SPEED))
 	{
 		p_ptr->redraw &= ~(PR_SPEED);
