diff --git a/src/query/plan/operator.cpp b/src/query/plan/operator.cpp
index 01fbd740d..36eaf8f34 100644
--- a/src/query/plan/operator.cpp
+++ b/src/query/plan/operator.cpp
@@ -253,7 +253,7 @@ VertexAccessor &CreateLocalVertex(const NodeCreationInfo &node_info, Frame *fram
 
   // TODO antepusic check if text search is turned on
   if (flags::run_time::GetTextSearchEnabled()) {
-    // new_node.AddToTextSearch()
+    new_node.impl_.storage_->indices_.text_index_->AddNode(new_node.impl_.vertex_, new_node.impl_.storage_);
   }
 
   (*frame)[node_info.symbol] = new_node;
@@ -2825,8 +2825,9 @@ bool SetProperty::SetPropertyCursor::Pull(Frame &frame, ExecutionContext &contex
                                                                      TypedValue{std::move(old_value)}, TypedValue{rhs});
       }
       // TODO antepusic: update text index
-      // new_node.UpdateInTextSearch()
       if (flags::run_time::GetTextSearchEnabled()) {
+        auto new_node = lhs.ValueVertex();
+        new_node.impl_.storage_->indices_.text_index_->UpdateNode(new_node.impl_.vertex_, new_node.impl_.storage_);
       }
       break;
     }
@@ -2985,8 +2986,9 @@ void SetPropertiesOnRecord(TRecordAccessor *record, const TypedValue &rhs, SetPr
       PropertiesMap new_properties = get_props(rhs.ValueVertex());
       update_props(new_properties);
       // TODO antepusic: update text index
-      // new_node.UpdateInTextSearch()
       if (flags::run_time::GetTextSearchEnabled()) {
+        auto new_node = rhs.ValueVertex();
+        new_node.impl_.storage_->indices_.text_index_->UpdateNode(new_node.impl_.vertex_, new_node.impl_.storage_);
       }
       break;
     }
@@ -3136,7 +3138,7 @@ bool SetLabels::SetLabelsCursor::Pull(Frame &frame, ExecutionContext &context) {
 
   // TODO antepusic check if text search is turned on
   if (flags::run_time::GetTextSearchEnabled()) {
-    // new_node.UpdateInTextSearch()
+    vertex.impl_.storage_->indices_.text_index_->UpdateNode(vertex.impl_.vertex_, vertex.impl_.storage_);
   }
 
   return true;
@@ -3302,7 +3304,7 @@ bool RemoveLabels::RemoveLabelsCursor::Pull(Frame &frame, ExecutionContext &cont
 
   // TODO antepusic check if text search is turned on
   if (flags::run_time::GetTextSearchEnabled()) {
-    // new_node.UpdateInTextSearch()
+    vertex.impl_.storage_->indices_.text_index_->UpdateNode(vertex.impl_.vertex_, vertex.impl_.storage_, self_.labels_);
   }
 
   return true;
diff --git a/src/storage/v2/indices/text_index.cpp b/src/storage/v2/indices/text_index.cpp
index 16916d9f0..66e917aff 100644
--- a/src/storage/v2/indices/text_index.cpp
+++ b/src/storage/v2/indices/text_index.cpp
@@ -53,6 +53,16 @@ void TextIndex::UpdateNode(Vertex *vertex_after_update, Storage *storage) {
   AddNode(vertex_after_update, storage, applicable_text_indices);
 }
 
+void TextIndex::UpdateNode(Vertex *vertex_after_update, Storage *storage, const std::vector<LabelId> &removed_labels) {
+  auto indexes_to_remove_node_from = GetApplicableTextIndices(removed_labels);
+  RemoveNode(vertex_after_update, indexes_to_remove_node_from);
+
+  auto indexes_to_update_node = GetApplicableTextIndices(vertex_after_update);
+  if (indexes_to_update_node.empty()) return;
+  RemoveNode(vertex_after_update, indexes_to_update_node);
+  AddNode(vertex_after_update, storage, indexes_to_update_node);
+}
+
 void TextIndex::RemoveNode(Vertex *vertex_after_update,
                            const std::vector<memcxx::text_search::Context *> &applicable_text_indices) {
   auto search_node_to_be_deleted = memcxx::text_search::SearchInput{
@@ -88,6 +98,16 @@ void TextIndex::UpdateOnSetProperty(Vertex *vertex_after_update, Storage *storag
   UpdateNode(vertex_after_update, storage);
 }
 
+std::vector<memcxx::text_search::Context *> TextIndex::GetApplicableTextIndices(const std::vector<LabelId> &labels) {
+  std::vector<memcxx::text_search::Context *> applicable_text_indices;
+  for (const auto &label : labels) {
+    if (label_to_index_.contains(label)) {
+      applicable_text_indices.push_back(&index_.at(label_to_index_.at(label)));
+    }
+  }
+  return applicable_text_indices;
+}
+
 std::vector<memcxx::text_search::Context *> TextIndex::GetApplicableTextIndices(Vertex *vertex) {
   std::vector<memcxx::text_search::Context *> applicable_text_indices;
   for (const auto &label : vertex->labels) {
@@ -111,6 +131,10 @@ bool TextIndex::CreateIndex(std::string index_name, LabelId label, memgraph::que
   bool has_schema = false;
   std::vector<std::pair<PropertyId, std::string>> indexed_properties{};
   for (const auto &v : db->Vertices(View::OLD)) {
+    if (!v.HasLabel(View::OLD, label).GetValue()) {
+      continue;
+    }
+
     if (!has_schema) [[unlikely]] {
       for (const auto &[prop_id, prop_val] : v.Properties(View::OLD).GetValue()) {
         if (prop_val.IsString()) {
diff --git a/src/storage/v2/indices/text_index.hpp b/src/storage/v2/indices/text_index.hpp
index 91ae32a77..4c559b120 100644
--- a/src/storage/v2/indices/text_index.hpp
+++ b/src/storage/v2/indices/text_index.hpp
@@ -29,6 +29,8 @@ class TextIndex {
   void AddNode(Vertex *vertex, Storage *storage,
                const std::vector<memcxx::text_search::Context *> &applicable_text_indices);
 
+  std::vector<memcxx::text_search::Context *> GetApplicableTextIndices(const std::vector<LabelId> &labels);
+
   void RemoveNode(Vertex *vertex, const std::vector<memcxx::text_search::Context *> &applicable_text_indices);
 
  public:
@@ -48,6 +50,8 @@ class TextIndex {
 
   void UpdateNode(Vertex *vertex, Storage *storage);
 
+  void UpdateNode(Vertex *vertex, Storage *storage, const std::vector<LabelId> &removed_labels);
+
   void RemoveNode(Vertex *vertex);
 
   void UpdateOnAddLabel(LabelId added_label, Vertex *vertex_after_update, Storage *storage, const Transaction &tx);
diff --git a/src/storage/v2/storage.cpp b/src/storage/v2/storage.cpp
index 1dfd06258..a4114eda8 100644
--- a/src/storage/v2/storage.cpp
+++ b/src/storage/v2/storage.cpp
@@ -147,13 +147,13 @@ Result<std::optional<VertexAccessor>> Storage::Accessor::DeleteVertex(VertexAcce
     return res.GetError();
   }
 
+  // TODO antepusic remove from text index
+
   const auto &value = res.GetValue();
   if (!value) {
     return std::optional<VertexAccessor>{};
   }
 
-  // TODO antepusic remove from text index
-
   const auto &[vertices, edges] = *value;
 
   MG_ASSERT(vertices.size() <= 1, "The number of deleted vertices is not less or equal to 1!");