Index: src/ch/MiniViewDlg.cpp
===================================================================
diff -u -r814b694086d5dc450efb6a5e5c6902145ddc07fd -r68bbff6670ec7d7010ced69f600493a0ae0c687c
--- src/ch/MiniViewDlg.cpp	(.../MiniViewDlg.cpp)	(revision 814b694086d5dc450efb6a5e5c6902145ddc07fd)
+++ src/ch/MiniViewDlg.cpp	(.../MiniViewDlg.cpp)	(revision 68bbff6670ec7d7010ced69f600493a0ae0c687c)
@@ -25,6 +25,7 @@
 #include "../libchengine/TTaskManager.h"
 #include "../libchengine/TTask.h"
 #include "GuiOptions.h"
+#include "RuleEditDlg.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -341,6 +342,7 @@
 	case ID_TASK_MENU_CANCEL:
 	case ID_TASK_MENU_REMOVE:
 	case ID_TASK_MENU_RESET_FEEDBACK:
+	case ID_TASK_MENU_EDIT_FEEDBACK:
 		ExecTaskCommand(iMenuItem);
 		break;
 
@@ -411,9 +413,37 @@
 	case ID_TASK_MENU_RESET_FEEDBACK:
 		spTask->RestoreFeedbackDefaults();
 		break;
+	case ID_TASK_MENU_EDIT_FEEDBACK:
+		OnEditUserFeedback();
+		break;
 	}
 }
 
+void CMiniViewDlg::OnEditUserFeedback()
+{
+	taskid_t taskID = m_currentTaskId;
+	TTaskPtr spTask = m_pTasks->GetTaskByTaskID(taskID);
+	if(!spTask)
+		return;
+
+	if(spTask)
+	{
+		FeedbackRules rules = spTask->GetFeedbackRules();
+		spTask.reset();
+
+		RuleEditDlg dlg(rules);
+		if(dlg.DoModal() == IDOK)
+		{
+			rules = dlg.GetRules();
+
+			// re-try searching for specific task to ensure it was not deleted in the meantime
+			spTask = m_pTasks->GetTaskByTaskID(taskID);
+			if(spTask)
+				spTask->SetFeedbackRules(rules);
+		}
+	}
+}
+
 void CMiniViewDlg::OnLanguageChanged()
 {
 	ResizeDialog();
Index: src/ch/MiniViewDlg.h
===================================================================
diff -u -r814b694086d5dc450efb6a5e5c6902145ddc07fd -r68bbff6670ec7d7010ced69f600493a0ae0c687c
--- src/ch/MiniViewDlg.h	(.../MiniViewDlg.h)	(revision 814b694086d5dc450efb6a5e5c6902145ddc07fd)
+++ src/ch/MiniViewDlg.h	(.../MiniViewDlg.h)	(revision 68bbff6670ec7d7010ced69f600493a0ae0c687c)
@@ -64,6 +64,7 @@
 	afx_msg LRESULT OnTaskRClick(WPARAM wParam, LPARAM lParam);
 
 	void ExecTaskCommand(int idCmd);
+	void OnEditUserFeedback();
 
 	DECLARE_MESSAGE_MAP()
 
Index: src/ch/StatusDlg.cpp
===================================================================
diff -u -re8897f4f07ba4523376c2d6599d87428424a4772 -r68bbff6670ec7d7010ced69f600493a0ae0c687c
--- src/ch/StatusDlg.cpp	(.../StatusDlg.cpp)	(revision e8897f4f07ba4523376c2d6599d87428424a4772)
+++ src/ch/StatusDlg.cpp	(.../StatusDlg.cpp)	(revision 68bbff6670ec7d7010ced69f600493a0ae0c687c)
@@ -28,6 +28,7 @@
 #include "../libchengine/TTaskManager.h"
 #include "../libchengine/TLocalFilesystem.h"
 #include "GuiOptions.h"
+#include "RuleEditDlg.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -260,7 +261,7 @@
 		return;
 
 	int iCurrentBufferIndex = 0;
-	chengine::TTaskStatsSnapshotPtr spTaskStats = m_spTaskMgrStats->GetTaskStatsForTaskID(boost::numeric_cast<chengine::taskid_t>(GetSelectedItemSessionUniqueID()));
+	chengine::TTaskStatsSnapshotPtr spTaskStats = m_spTaskMgrStats->GetTaskStatsForTaskID(boost::numeric_cast<chengine::taskid_t>(GetSelectedItemTaskID()));
 	if(spTaskStats)
 	{
 		chengine::TSubTaskStatsSnapshotPtr spSubTaskStats = spTaskStats->GetSubTasksStats().GetCurrentSubTaskSnapshot();
@@ -278,28 +279,23 @@
 
 chengine::TTaskPtr CStatusDlg::GetSelectedItemPointer()
 {
-	// returns ptr to a TTask for a given element in listview
-	if(m_ctlStatusList.GetSelectedCount() == 1)
-	{
-		POSITION pos = m_ctlStatusList.GetFirstSelectedItemPosition();
-		int nPos = m_ctlStatusList.GetNextSelectedItem(pos);
-		return m_pTasks->GetTaskByTaskID(boost::numeric_cast<chengine::taskid_t>(m_ctlStatusList.GetItemData(nPos)));
-	}
+	taskid_t taskID = GetSelectedItemTaskID();
+	if(taskID != chengine::NoTaskID)
+		return m_pTasks->GetTaskByTaskID(taskID);
 
 	return chengine::TTaskPtr();
 }
 
-size_t CStatusDlg::GetSelectedItemSessionUniqueID()
+chengine::taskid_t CStatusDlg::GetSelectedItemTaskID()
 {
-	// returns ptr to a TTask for a given element in listview
 	if(m_ctlStatusList.GetSelectedCount() == 1)
 	{
 		POSITION pos = m_ctlStatusList.GetFirstSelectedItemPosition();
 		int nPos = m_ctlStatusList.GetNextSelectedItem(pos);
-		return m_ctlStatusList.GetItemData(nPos);
+		return boost::numeric_cast<chengine::taskid_t>(m_ctlStatusList.GetItemData(nPos));
 	}
 
-	return std::numeric_limits<size_t>::max();
+	return chengine::NoTaskID;
 }
 
 void CStatusDlg::StickDialogToScreenEdge()
@@ -408,6 +404,30 @@
 		spSelectedTask->RestoreFeedbackDefaults();
 }
 
+void CStatusDlg::OnEditUserFeedback()
+{
+	chengine::TTaskPtr spSelectedTask = GetSelectedItemPointer();
+
+	if(spSelectedTask)
+	{
+		taskid_t selectedTaskID = GetSelectedItemTaskID();
+
+		FeedbackRules rules = spSelectedTask->GetFeedbackRules();
+		spSelectedTask.reset();
+
+		RuleEditDlg dlg(rules);
+		if(dlg.DoModal() == IDOK)
+		{
+			rules = dlg.GetRules();
+
+			// re-try searching for specific task to ensure it was not deleted in the meantime
+			spSelectedTask = m_pTasks->GetTaskByTaskID(selectedTaskID);
+			if(spSelectedTask)
+				spSelectedTask->SetFeedbackRules(rules);
+		}
+	}
+}
+
 void CStatusDlg::OnPauseButton() 
 {
 	chengine::TTaskPtr spTask = GetSelectedItemPointer();
@@ -594,7 +614,7 @@
 void CStatusDlg::RefreshStatus()
 {
 	// remember address of a current selection
-	size_t stSelectedTaskID = GetSelectedItemSessionUniqueID();
+	size_t stSelectedTaskID = GetSelectedItemTaskID();
 
 	// get all the stats needed
 	m_pTasks->GetStatsSnapshot(m_spTaskMgrStats);
@@ -687,6 +707,9 @@
 	case ID_TASK_MENU_RESET_FEEDBACK:
 		OnResetUserFeedback();
 		break;
+	case ID_TASK_MENU_EDIT_FEEDBACK:
+		OnEditUserFeedback();
+		break;
 
 	case ID_TASK_MENU_PAUSE_ALL:
 		OnPauseAllButton();
Index: src/ch/StatusDlg.h
===================================================================
diff -u -re45315d2ecd008df0162cba53a77dc6b8c5880d0 -r68bbff6670ec7d7010ced69f600493a0ae0c687c
--- src/ch/StatusDlg.h	(.../StatusDlg.h)	(revision e45315d2ecd008df0162cba53a77dc6b8c5880d0)
+++ src/ch/StatusDlg.h	(.../StatusDlg.h)	(revision 68bbff6670ec7d7010ced69f600493a0ae0c687c)
@@ -25,6 +25,7 @@
 #include "../libchengine/TTask.h"
 #include "../libchengine/TTaskManager.h"
 #include "TaskContextMenu.h"
+#include "../libchengine/TaskID.h"
 
 namespace chengine {
 	class TTaskManager;
@@ -50,7 +51,7 @@
 
 	void ApplyButtonsState();
 	chengine::TTaskPtr GetSelectedItemPointer();
-	size_t GetSelectedItemSessionUniqueID();
+	chengine::taskid_t GetSelectedItemTaskID();
 
 	void EnableControls(bool bEnable=true);
 
@@ -59,6 +60,7 @@
 	BOOL OnCommand(WPARAM wParam, LPARAM lParam) override;
 
 	void OnResetUserFeedback();
+	void OnEditUserFeedback();
 
 	LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam) override;
 
Index: src/ch/ch.rc
===================================================================
diff -u -r4d8adf81cb22d447a71925f4631623280c796e6f -r68bbff6670ec7d7010ced69f600493a0ae0c687c
--- src/ch/ch.rc	(.../ch.rc)	(revision 4d8adf81cb22d447a71925f4631623280c796e6f)
+++ src/ch/ch.rc	(.../ch.rc)	(revision 68bbff6670ec7d7010ced69f600493a0ae0c687c)
@@ -1050,7 +1050,8 @@
         MENUITEM "&Cancel",                     ID_TASK_MENU_CANCEL
         MENUITEM "Re&move",                     ID_TASK_MENU_REMOVE
         MENUITEM SEPARATOR
-        MENUITEM "Reset user-feedback state",   ID_TASK_MENU_RESET_FEEDBACK
+        MENUITEM "Edit automatic responses",   ID_TASK_MENU_EDIT_FEEDBACK
+        MENUITEM "Reset automatic responses",   ID_TASK_MENU_RESET_FEEDBACK
         MENUITEM SEPARATOR
         MENUITEM "Pause all",                   ID_TASK_MENU_PAUSE_ALL
         MENUITEM "Resume all",                  ID_TASK_MENU_RESUME_ALL
Index: src/ch/resource.h
===================================================================
diff -u -re45315d2ecd008df0162cba53a77dc6b8c5880d0 -r68bbff6670ec7d7010ced69f600493a0ae0c687c
--- src/ch/resource.h	(.../resource.h)	(revision e45315d2ecd008df0162cba53a77dc6b8c5880d0)
+++ src/ch/resource.h	(.../resource.h)	(revision 68bbff6670ec7d7010ced69f600493a0ae0c687c)
@@ -866,6 +866,7 @@
 #define ID_TASK_MENU_CANCEL             32859
 #define ID_TASK_MENU_REMOVE             32860
 #define ID_TASK_MENU_RESET_FEEDBACK     32861
+#define ID_TASK_MENU_EDIT_FEEDBACK      32862
 #define ID_TASK_MENU_RESUME_ALL         32867
 #define ID_TASK_MENU_PAUSE_ALL          32868
 #define ID_TASK_MENU_RESTART_ALL        32869
Index: src/libchengine/TTask.cpp
===================================================================
diff -u -re45315d2ecd008df0162cba53a77dc6b8c5880d0 -r68bbff6670ec7d7010ced69f600493a0ae0c687c
--- src/libchengine/TTask.cpp	(.../TTask.cpp)	(revision e45315d2ecd008df0162cba53a77dc6b8c5880d0)
+++ src/libchengine/TTask.cpp	(.../TTask.cpp)	(revision 68bbff6670ec7d7010ced69f600493a0ae0c687c)
@@ -360,6 +360,16 @@
 		m_spFeedbackManager->RestoreDefaults();
 	}
 
+	chengine::FeedbackRules TTask::GetFeedbackRules()
+	{
+		return m_spFeedbackManager->GetRules();
+	}
+
+	void TTask::SetFeedbackRules(const chengine::FeedbackRules& feedbackRules)
+	{
+		m_spFeedbackManager->SetRules(feedbackRules);
+	}
+
 	void TTask::PauseProcessing()
 	{
 		if (GetTaskState() != eTaskState_Finished && GetTaskState() != eTaskState_Cancelled)
Index: src/libchengine/TTask.h
===================================================================
diff -u -r08717141ce5f6926116c298cbc9442094a45bb67 -r68bbff6670ec7d7010ced69f600493a0ae0c687c
--- src/libchengine/TTask.h	(.../TTask.h)	(revision 08717141ce5f6926116c298cbc9442094a45bb67)
+++ src/libchengine/TTask.h	(.../TTask.h)	(revision 68bbff6670ec7d7010ced69f600493a0ae0c687c)
@@ -87,6 +87,8 @@
 		void SetForceFlag(bool bFlag = true);
 		bool GetForceFlag();
 
+		chengine::FeedbackRules GetFeedbackRules();
+		void SetFeedbackRules(const chengine::FeedbackRules& feedbackRules);
 		void RestoreFeedbackDefaults();
 
 	private: