diff --git a/ChangeLog.d/bugfix/ZBX-17035 b/ChangeLog.d/bugfix/ZBX-17035
new file mode 100644
index 0000000000..6e819067ee
--- /dev/null
+++ b/ChangeLog.d/bugfix/ZBX-17035
@@ -0,0 +1 @@
+........S. [ZBX-17035] internal events are not created if there is no enabled internal actions (atumilovics)
diff --git a/include/db.h b/include/db.h
index f400642404..3ead043fd2 100644
--- a/include/db.h
+++ b/include/db.h
@@ -336,6 +336,7 @@ typedef struct
 #define ZBX_FLAGS_DB_EVENT_UNSET		0x0000
 #define ZBX_FLAGS_DB_EVENT_CREATE		0x0001
 #define ZBX_FLAGS_DB_EVENT_NO_ACTION		0x0002
+#define ZBX_FLAGS_DB_EVENT_RECOVER		0x0004
 	zbx_uint64_t		flags;
 }
 DB_EVENT;
diff --git a/include/dbcache.h b/include/dbcache.h
index 55fb83ae57..14402f2dd2 100644
--- a/include/dbcache.h
+++ b/include/dbcache.h
@@ -734,6 +734,8 @@ int	DCget_data_expected_from(zbx_uint64_t itemid, int *seconds);
 void	DCget_hostids_by_functionids(zbx_vector_uint64_t *functionids, zbx_vector_uint64_t *hostids);
 void	DCget_hosts_by_functionids(const zbx_vector_uint64_t *functionids, zbx_hashset_t *hosts);
 
+unsigned int	DCget_internal_action_count(void);
+
 /* global configuration support */
 #define ZBX_DISCOVERY_GROUPID_UNDEFINED	0
 void	zbx_config_get(zbx_config_t *cfg, zbx_uint64_t flags);
diff --git a/src/libs/zbxdbcache/dbcache.c b/src/libs/zbxdbcache/dbcache.c
index 6a681d2a48..6e104cfedd 100644
--- a/src/libs/zbxdbcache/dbcache.c
+++ b/src/libs/zbxdbcache/dbcache.c
@@ -3010,7 +3010,8 @@ static void	sync_server_history(int *values_num, int *triggers_num, int *more)
 					recalculate_triggers(history, history_num, &timer_triggerids, &trigger_diff);
 
 					/* process trigger events generated by recalculate_triggers() */
-					if (0 != zbx_process_events(&trigger_diff, &triggerids))
+					zbx_process_events(&trigger_diff, &triggerids);
+					if (0 != trigger_diff.values_num)
 						zbx_db_save_trigger_changes(&trigger_diff);
 
 					if (ZBX_DB_OK == (txn_error = DBcommit()))
diff --git a/src/libs/zbxdbcache/dbconfig.c b/src/libs/zbxdbcache/dbconfig.c
index a8daf10825..fa673c6e4b 100644
--- a/src/libs/zbxdbcache/dbconfig.c
+++ b/src/libs/zbxdbcache/dbconfig.c
@@ -3540,8 +3540,16 @@ static void	DCsync_actions(zbx_dbsync_t *sync)
 		ZBX_STR2UINT64(actionid, row[0]);
 		action = (zbx_dc_action_t *)DCfind_id(&config->actions, actionid, sizeof(zbx_dc_action_t), &found);
 
+		ZBX_STR2UCHAR(action->eventsource, row[1]);
+		ZBX_STR2UCHAR(action->evaltype, row[2]);
+
+		DCstrpool_replace(found, &action->formula, row[3]);
+
 		if (0 == found)
 		{
+			if (EVENT_SOURCE_INTERNAL == action->eventsource)
+				config->internal_actions++;
+
 			zbx_vector_ptr_create_ext(&action->conditions, __config_mem_malloc_func,
 					__config_mem_realloc_func, __config_mem_free_func);
 
@@ -3549,11 +3557,6 @@ static void	DCsync_actions(zbx_dbsync_t *sync)
 
 			action->opflags = ZBX_ACTION_OPCLASS_NONE;
 		}
-
-		ZBX_STR2UCHAR(action->eventsource, row[1]);
-		ZBX_STR2UCHAR(action->evaltype, row[2]);
-
-		DCstrpool_replace(found, &action->formula, row[3]);
 	}
 
 	/* remove deleted actions */
@@ -3562,6 +3565,9 @@ static void	DCsync_actions(zbx_dbsync_t *sync)
 		if (NULL == (action = (zbx_dc_action_t *)zbx_hashset_search(&config->actions, &rowid)))
 			continue;
 
+		if (EVENT_SOURCE_INTERNAL == action->eventsource)
+			config->internal_actions--;
+
 		zbx_strpool_release(action->formula);
 		zbx_vector_ptr_destroy(&action->conditions);
 
@@ -5796,6 +5802,8 @@ int	init_configuration_cache(char **error)
 	config->sync_ts = 0;
 	config->item_sync_ts = 0;
 
+	config->internal_actions = 0;
+
 	/* maintenance data are used only when timers are defined (server) */
 	if (0 != CONFIG_TIMER_FORKS)
 	{
@@ -10246,6 +10254,28 @@ void	DCget_hosts_by_functionids(const zbx_vector_uint64_t *functionids, zbx_hash
 	zabbix_log(LOG_LEVEL_DEBUG, "End of %s(): found %d hosts", __function_name, hosts->num_data);
 }
 
+/******************************************************************************
+ *                                                                            *
+ * Function: DCget_internal_action_count                                      *
+ *                                                                            *
+ * Purpose: get number of enabled internal actions                            *
+ *                                                                            *
+ * Return value: number of enabled internal actions                           *
+ *                                                                            *
+ ******************************************************************************/
+unsigned int	DCget_internal_action_count(void)
+{
+	unsigned int count;
+
+	RDLOCK_CACHE;
+
+	count = config->internal_actions;
+
+	UNLOCK_CACHE;
+
+	return count;
+}
+
 /******************************************************************************
  *                                                                            *
  * Function: zbx_config_get                                                   *
diff --git a/src/libs/zbxdbcache/dbconfig.h b/src/libs/zbxdbcache/dbconfig.h
index 4a90407e8a..026cef1155 100644
--- a/src/libs/zbxdbcache/dbconfig.h
+++ b/src/libs/zbxdbcache/dbconfig.h
@@ -691,6 +691,8 @@ typedef struct
 	int			sync_ts;
 	int			item_sync_ts;
 
+	unsigned int		internal_actions;		/* number of enabled internal actions */
+
 	/* maintenance processing management */
 	unsigned char		maintenance_update;		/* flag to trigger maintenance update by timers  */
 	zbx_uint64_t		*maintenance_update_flags;	/* Array of flags to manage timer maintenance updates.*/
diff --git a/src/libs/zbxdbcache/dbsync.c b/src/libs/zbxdbcache/dbsync.c
index cf0fce5d05..4134c8415b 100644
--- a/src/libs/zbxdbcache/dbsync.c
+++ b/src/libs/zbxdbcache/dbsync.c
@@ -2302,8 +2302,7 @@ static int	dbsync_compare_action(const zbx_dc_action_t *action, const DB_ROW dbr
  *                                                                            *
  * Purpose: compares actions table with cached configuration data             *
  *                                                                            *
- * Parameter: cache - [IN] the configuration cache                            *
- *            sync  - [OUT] the changeset                                     *
+ * Parameter: sync - [OUT] the changeset                                      *
  *                                                                            *
  * Return value: SUCCEED - the changeset was successfully calculated          *
  *               FAIL    - otherwise                                          *
diff --git a/src/zabbix_server/events.c b/src/zabbix_server/events.c
index 8ebcf4c466..373f3b7bfe 100644
--- a/src/zabbix_server/events.c
+++ b/src/zabbix_server/events.c
@@ -1998,6 +1998,9 @@ static void	recover_event(zbx_uint64_t eventid, int source, int object, zbx_uint
 		return;
 	}
 
+	if (EVENT_SOURCE_INTERNAL == source)
+		event->flags |= ZBX_FLAGS_DB_EVENT_RECOVER;
+
 	recovery_local.eventid = eventid;
 
 	if (NULL != zbx_hashset_search(&event_recovery, &recovery_local))
@@ -2119,6 +2122,39 @@ out:
 	zbx_vector_uint64_destroy(&triggerids);
 }
 
+/******************************************************************************
+ *                                                                            *
+ * Function: process_internal_events_without_actions                          *
+ *                                                                            *
+ * Purpose: do not generate unnecessary internal events if there are no       *
+ *          internal actions and no problem recovery from when actions were   *
+ *          enabled                                                           *
+ *                                                                            *
+ * Parameters: internal_problem_events - [IN/OUT] problem events to process   *
+ * Parameters: internal_ok_events      - [IN/OUT] recovery events to process  *
+ *                                                                            *
+ ******************************************************************************/
+static void	process_internal_events_without_actions(zbx_vector_ptr_t *internal_problem_events,
+		zbx_vector_ptr_t *internal_ok_events)
+{
+	DB_EVENT	*event;
+	int		i;
+
+	if (0 != DCget_internal_action_count())
+		return;
+
+	for (i = 0; i < internal_problem_events->values_num; i++)
+		((DB_EVENT *)internal_problem_events->values[i])->flags = ZBX_FLAGS_DB_EVENT_UNSET;
+
+	for (i = 0; i < internal_ok_events->values_num; i++)
+	{
+		event = (DB_EVENT *)internal_ok_events->values[i];
+
+		if (0 == (event->flags & ZBX_FLAGS_DB_EVENT_RECOVER))
+			event->flags = ZBX_FLAGS_DB_EVENT_UNSET;
+	}
+}
+
 /******************************************************************************
  *                                                                            *
  * Function: get_open_problems                                                *
@@ -2574,7 +2610,7 @@ int	zbx_process_events(zbx_vector_ptr_t *trigger_diff, zbx_vector_uint64_t *trig
 	const char		*__function_name = "zbx_process_events";
 	int			i, processed_num = 0;
 	zbx_uint64_t		eventid;
-	zbx_vector_ptr_t	internal_ok_events, trigger_events, internal_events;
+	zbx_vector_ptr_t	internal_problem_events, internal_ok_events, trigger_events, internal_events;
 
 	zabbix_log(LOG_LEVEL_DEBUG, "In %s() events_num:" ZBX_FS_SIZE_T, __function_name,
 			(zbx_fs_size_t)events.values_num);
@@ -2584,6 +2620,8 @@ int	zbx_process_events(zbx_vector_ptr_t *trigger_diff, zbx_vector_uint64_t *trig
 
 	if (0 != events.values_num)
 	{
+		zbx_vector_ptr_create(&internal_problem_events);
+		zbx_vector_ptr_reserve(&internal_problem_events, events.values_num);
 		zbx_vector_ptr_create(&internal_ok_events);
 		zbx_vector_ptr_reserve(&internal_ok_events, events.values_num);
 
@@ -2614,15 +2652,21 @@ int	zbx_process_events(zbx_vector_ptr_t *trigger_diff, zbx_vector_uint64_t *trig
 					case EVENT_OBJECT_TRIGGER:
 						if (TRIGGER_STATE_NORMAL == event->value)
 							zbx_vector_ptr_append(&internal_ok_events, event);
+						else
+							zbx_vector_ptr_append(&internal_problem_events, event);
 						zbx_vector_ptr_append(&internal_events, event);
 						break;
 					case EVENT_OBJECT_ITEM:
 						if (ITEM_STATE_NORMAL == event->value)
 							zbx_vector_ptr_append(&internal_ok_events, event);
+						else
+							zbx_vector_ptr_append(&internal_problem_events, event);
 						break;
 					case EVENT_OBJECT_LLDRULE:
 						if (ITEM_STATE_NORMAL == event->value)
 							zbx_vector_ptr_append(&internal_ok_events, event);
+						else
+							zbx_vector_ptr_append(&internal_problem_events, event);
 						break;
 				}
 			}
@@ -2634,6 +2678,9 @@ int	zbx_process_events(zbx_vector_ptr_t *trigger_diff, zbx_vector_uint64_t *trig
 		if (0 != internal_ok_events.values_num)
 			process_internal_ok_events(&internal_ok_events);
 
+		if (0 != internal_problem_events.values_num || 0 != internal_ok_events.values_num)
+			process_internal_events_without_actions(&internal_problem_events, &internal_ok_events);
+
 		if (0 != trigger_events.values_num)
 		{
 			process_trigger_events(&trigger_events, trigger_diff);
@@ -2648,6 +2695,7 @@ int	zbx_process_events(zbx_vector_ptr_t *trigger_diff, zbx_vector_uint64_t *trig
 
 		zbx_vector_ptr_destroy(&trigger_events);
 		zbx_vector_ptr_destroy(&internal_ok_events);
+		zbx_vector_ptr_destroy(&internal_problem_events);
 		zbx_vector_ptr_destroy(&internal_events);
 	}
 
