diff -urN --exclude-from=excludes asterisk-unmodified/channel.c asterisk/channel.c
--- asterisk-unmodified/channel.c	2005-09-29 19:40:24.000000000 +0200
+++ asterisk/channel.c	2005-10-01 23:06:07.000000000 +0200
@@ -1647,8 +1647,10 @@
 				} else
 					chan->insmpl += f->samples;
 #endif
-				if (ast_writestream(chan->monitor->read_stream, f) < 0)
-					ast_log(LOG_WARNING, "Failed to write data to channel monitor read stream\n");
+				if (chan->monitor->state == AST_MONITOR_RUNNING) {
+					if (ast_writestream(chan->monitor->read_stream, f) < 0)
+						ast_log(LOG_WARNING, "Failed to write data to channel monitor read stream\n");
+				}
 			}
 			if (chan->readtrans) {
 				f = ast_translate(chan->readtrans, f, 1);
@@ -2000,8 +2002,10 @@
 					} else
 						chan->outsmpl += f->samples;
 #endif
-					if (ast_writestream(chan->monitor->write_stream, f) < 0)
-						ast_log(LOG_WARNING, "Failed to write data to channel monitor write stream\n");
+					if (chan->monitor->state == AST_MONITOR_RUNNING) {
+						if (ast_writestream(chan->monitor->write_stream, f) < 0)
+							ast_log(LOG_WARNING, "Failed to write data to channel monitor write stream\n");
+					}
 				}
 
 				res = chan->tech->write(chan, f);
diff -urN --exclude-from=excludes asterisk-unmodified/include/asterisk/monitor.h asterisk/include/asterisk/monitor.h
--- asterisk-unmodified/include/asterisk/monitor.h	2005-08-30 20:32:09.000000000 +0200
+++ asterisk/include/asterisk/monitor.h	2005-10-02 00:56:42.000000000 +0200
@@ -29,6 +29,11 @@
 
 struct ast_channel;
 
+enum AST_MONITORING_STATE {
+	AST_MONITOR_RUNNING,
+	AST_MONITOR_PAUSED
+};
+
 /*! Responsible for channel monitoring data */
 struct ast_channel_monitor
 {
@@ -40,6 +45,7 @@
 	int filename_changed;
 	char *format;
 	int joinfiles;
+	enum AST_MONITORING_STATE state;
 	int (*stop)( struct ast_channel *chan, int need_lock);
 };
 
@@ -56,4 +62,14 @@
 
 void ast_monitor_setjoinfiles(struct ast_channel *chan, int turnon);
 
+/* Pause monitoring of a channel */
+int ast_monitor_pause(struct ast_channel *chan);
+
+/* Resume monitoring of a channel */
+int ast_monitor_resume(struct ast_channel *chan);
+
+int pause_monitor_exec(struct ast_channel *chan, void *data);
+
+int resume_monitor_exec(struct ast_channel *chan, void *data);
+
 #endif /* _ASTERISK_MONITOR_H */
diff -urN --exclude-from=excludes asterisk-unmodified/res/res_monitor.c asterisk/res/res_monitor.c
--- asterisk-unmodified/res/res_monitor.c	2005-09-14 22:46:50.000000000 +0200
+++ asterisk/res/res_monitor.c	2005-10-03 21:11:42.000000000 +0200
@@ -49,6 +49,23 @@
 
 AST_MUTEX_DEFINE_STATIC(monitorlock);
 
+#define LOCK_IF_NEEDED(lock, needed)								\
+	do {															\
+		if (needed) {												\
+			if (ast_mutex_lock(lock)) {								\
+				ast_log(LOG_WARNING, "Unable to lock channel\n");	\
+				return -1;											\
+			}														\
+		}															\
+	} while(0)
+
+#define UNLOCK_IF_NEEDED(lock, needed)			\
+	do {										\
+		if (needed) {							\
+			ast_mutex_unlock(lock);				\
+		}										\
+	} while(0)									\
+
 static unsigned long seq = 0;
 
 static char *monitor_synopsis = "Monitor a channel";
@@ -88,6 +105,29 @@
 	"Changes monitoring filename of a channel. Has no effect if the channel is not monitored\n"
 	"The argument is the new filename base to use for monitoring this channel.\n";
 
+static char *pausemonitor_synopsis = "Pause monitoring of a channel";
+
+static char *pausemonitor_descrip = "PauseMonitor\n"
+	"Pauses monitoring of a channel until it is re-enabled by a call to ResumeMonitor.\n";
+
+static char *resumemonitor_synopsis = "Resume monitoring of a channel";
+
+static char *resumemonitor_descrip = "ResumeMonitor\n"
+	"Resumes monitoring of a channel on which monitoring had\n"
+	"previously been paused with PauseMonitor.\n";
+
+static int ast_monitor_set_state(struct ast_channel *chan, int state)
+{
+	LOCK_IF_NEEDED(&chan->lock, 1);
+	if (!chan->monitor) {
+		UNLOCK_IF_NEEDED(&chan->lock, 1);
+		return -1;
+	}
+	chan->monitor->state = state;
+	UNLOCK_IF_NEEDED(&chan->lock, 1);
+	return 0;
+}
+
 /* Start monitoring a channel */
 int ast_monitor_start(	struct ast_channel *chan, const char *format_spec,
 		const char *fname_base, int need_lock)
@@ -95,12 +135,7 @@
 	int res = 0;
 	char tmp[256];
 
-	if (need_lock) {
-		if (ast_mutex_lock(&chan->lock)) {
-			ast_log(LOG_WARNING, "Unable to lock channel\n");
-			return -1;
-		}
-	}
+	LOCK_IF_NEEDED(&chan->lock, need_lock);
 
 	if (!(chan->monitor)) {
 		struct ast_channel_monitor *monitor;
@@ -116,8 +151,7 @@
 
 		monitor = malloc(sizeof(struct ast_channel_monitor));
 		if (!monitor) {
-			if (need_lock) 
-				ast_mutex_unlock(&chan->lock);
+			UNLOCK_IF_NEEDED(&chan->lock, need_lock);
 			return -1;
 		}
 		memset(monitor, 0, sizeof(struct ast_channel_monitor));
@@ -195,6 +229,7 @@
 			return -1;
 		}
 		chan->monitor = monitor;
+		ast_monitor_set_state(chan, AST_MONITOR_RUNNING);
 		/* so we know this call has been monitored in case we need to bill for it or something */
 		pbx_builtin_setvar_helper(chan, "__MONITORED","true");
 	} else {
@@ -203,9 +238,8 @@
 		res = -1;
 	}
 
-	if (need_lock) {
-		ast_mutex_unlock(&chan->lock);
-	}
+	UNLOCK_IF_NEEDED(&chan->lock, need_lock);
+
 	return res;
 }
 
@@ -215,12 +249,7 @@
 	char *execute, *execute_args;
 	int delfiles = 0;
 
-	if (need_lock) {
-		if (ast_mutex_lock(&chan->lock)) {
-			ast_log(LOG_WARNING, "Unable to lock channel\n");
-			return -1;
-		}
-	}
+	LOCK_IF_NEEDED(&chan->lock, need_lock);
 
 	if (chan->monitor) {
 		char filename[ FILENAME_MAX ];
@@ -288,11 +317,34 @@
 		chan->monitor = NULL;
 	}
 
-	if (need_lock)
-		ast_mutex_unlock(&chan->lock);
+	UNLOCK_IF_NEEDED(&chan->lock, need_lock);
+
 	return 0;
 }
 
+
+/* Pause monitoring of a channel */
+int ast_monitor_pause(struct ast_channel *chan)
+{
+	return ast_monitor_set_state(chan, AST_MONITOR_PAUSED);
+}
+
+/* Resume monitoring of a channel */
+int ast_monitor_resume(struct ast_channel *chan)
+{
+	return ast_monitor_set_state(chan, AST_MONITOR_RUNNING);
+}
+
+int pause_monitor_exec(struct ast_channel *chan, void *data)
+{
+	return ast_monitor_pause(chan);
+}
+
+int resume_monitor_exec(struct ast_channel *chan, void *data)
+{
+	return ast_monitor_resume(chan);
+}
+
 /* Change monitoring filename of a channel */
 int ast_monitor_change_fname(struct ast_channel *chan, const char *fname_base, int need_lock)
 {
@@ -301,13 +353,8 @@
 		ast_log(LOG_WARNING, "Cannot change monitor filename of channel %s to null", chan->name);
 		return -1;
 	}
-	
-	if (need_lock) {
-		if (ast_mutex_lock(&chan->lock)) {
-			ast_log(LOG_WARNING, "Unable to lock channel\n");
-			return -1;
-		}
-	}
+
+	LOCK_IF_NEEDED(&chan->lock, need_lock);
 
 	if (chan->monitor) {
 		int directory = strchr(fname_base, '/') ? 1 : 0;
@@ -324,8 +371,7 @@
 		ast_log(LOG_WARNING, "Cannot change monitor filename of channel %s to %s, monitoring not started\n", chan->name, fname_base);
 	}
 
-	if (need_lock)
-		ast_mutex_unlock(&chan->lock);
+	UNLOCK_IF_NEEDED(&chan->lock, need_lock);
 
 	return 0;
 }
@@ -545,14 +591,75 @@
 		chan->monitor->joinfiles = turnon;
 }
 
+#define IS_NULL_STRING(string) ((!(string)) || (ast_strlen_zero((string))))
+
+enum MONITOR_PAUSING_ACTION
+{
+	MONITOR_ACTION_PAUSE,
+	MONITOR_ACTION_RESUME
+};
+	  
+static int do_pause_or_resume(struct mansession *s, struct message *m, int action)
+{
+	struct ast_channel *c = NULL;
+	char *name = astman_get_header(m, "Channel");
+	
+	if (IS_NULL_STRING(name)) {
+		astman_send_error(s, m, "No channel specified");
+		return -1;
+	}
+	
+	c = ast_get_channel_by_name_locked(name);
+	if (!c) {
+		astman_send_error(s, m, "No such channel");
+		return -1;
+	}
+
+	if (action == MONITOR_ACTION_PAUSE)
+		ast_monitor_pause(c);
+	else
+		ast_monitor_resume(c);
+	
+	ast_mutex_unlock(&c->lock);
+	astman_send_ack(s, m, "Paused monitoring of the channel");
+	return 0;	
+}
+
+static char pause_monitor_action_help[] =
+	"Description: The 'PauseMonitor' action may be used to temporarily stop the\n"
+	" recording of a channel.  The following parameters may\n"
+	" be used to control this:\n"
+	"  Channel     - Required.  Used to specify the channel to record.\n";
+
+static int pause_monitor_action(struct mansession *s, struct message *m)
+{
+	return do_pause_or_resume(s, m, MONITOR_ACTION_PAUSE);
+}
+
+static char resume_monitor_action_help[] =
+	"Description: The 'ResumeMonitor' action may be used to re-enable recording\n"
+	"  of a channel after calling PauseMonitor.  The following parameters may\n"
+	"  be used to control this:\n"
+	"  Channel     - Required.  Used to specify the channel to record.\n";
+
+static int resume_monitor_action(struct mansession *s, struct message *m)
+{
+	return do_pause_or_resume(s, m, MONITOR_ACTION_RESUME);
+}
+	
+
 int load_module(void)
 {
 	ast_register_application("Monitor", start_monitor_exec, monitor_synopsis, monitor_descrip);
 	ast_register_application("StopMonitor", stop_monitor_exec, stopmonitor_synopsis, stopmonitor_descrip);
 	ast_register_application("ChangeMonitor", change_monitor_exec, changemonitor_synopsis, changemonitor_descrip);
+	ast_register_application("PauseMonitor", pause_monitor_exec, pausemonitor_synopsis, pausemonitor_descrip);
+	ast_register_application("ResumeMonitor", resume_monitor_exec, resumemonitor_synopsis, resumemonitor_descrip);
 	ast_manager_register2("Monitor", EVENT_FLAG_CALL, start_monitor_action, monitor_synopsis, start_monitor_action_help);
 	ast_manager_register2("StopMonitor", EVENT_FLAG_CALL, stop_monitor_action, stopmonitor_synopsis, stop_monitor_action_help);
 	ast_manager_register2("ChangeMonitor", EVENT_FLAG_CALL, change_monitor_action, changemonitor_synopsis, change_monitor_action_help);
+	ast_manager_register2("PauseMonitor", EVENT_FLAG_CALL, pause_monitor_action, pausemonitor_synopsis, pause_monitor_action_help);
+	ast_manager_register2("ResumeMonitor", EVENT_FLAG_CALL, resume_monitor_action, resumemonitor_synopsis, resume_monitor_action_help);
 
 	return 0;
 }
@@ -562,9 +669,14 @@
 	ast_unregister_application("Monitor");
 	ast_unregister_application("StopMonitor");
 	ast_unregister_application("ChangeMonitor");
+	ast_unregister_application("PauseMonitor");
+	ast_unregister_application("ResumeMonitor");
 	ast_manager_unregister("Monitor");
 	ast_manager_unregister("StopMonitor");
 	ast_manager_unregister("ChangeMonitor");
+	ast_unregister_application("PauseMonitor");
+	ast_unregister_application("ResumeMonitor");
+
 	return 0;
 }
 
