diff --git a/storyboard/db/api/projects.py b/storyboard/db/api/projects.py
index f113e064..5dd67423 100644
--- a/storyboard/db/api/projects.py
+++ b/storyboard/db/api/projects.py
@@ -13,6 +13,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+
+import datetime
+import pytz
 from storyboard.common.master_branch_helper import MasterBranchHelper
 from storyboard.db.api import base as api_base
 from storyboard.db.api import branches as branches_api
@@ -94,6 +97,16 @@ def project_update(project_id, values):
     return api_base.entity_update(models.Project, project_id, values)
 
 
+def project_update_updated_at(project_id):
+    session = api_base.get_session()
+    project = project_get(project_id)
+    if project:
+        with session.begin(subtransactions=True):
+            project.updated_at = datetime.datetime.now(tz=pytz.utc)
+            session.add(project)
+        session.expunge(project)
+
+
 def project_build_query(project_group_id, **kwargs):
     # Construct the query
     query = api_base.model_query(models.Project)
diff --git a/storyboard/db/api/stories.py b/storyboard/db/api/stories.py
index 88f9850e..dd07030b 100644
--- a/storyboard/db/api/stories.py
+++ b/storyboard/db/api/stories.py
@@ -21,6 +21,7 @@ from sqlalchemy.orm import subqueryload
 from storyboard._i18n import _
 from storyboard.common import exception as exc
 from storyboard.db.api import base as api_base
+from storyboard.db.api import projects as projects_api
 from storyboard.db.api import story_tags
 from storyboard.db.api import story_types
 from storyboard.db.api import teams as teams_api
@@ -77,7 +78,6 @@ def story_get_all(title=None, description=None, status=None, assignee_id=None,
         sort_field = 'id'
     if not sort_dir:
         sort_dir = 'asc'
-
     if not isinstance(status, list) and status is not None:
         status = [status]
 
@@ -253,12 +253,29 @@ def story_create(values):
 
 def story_update(story_id, values, current_user=None):
     api_base.entity_update(models.Story, story_id, values)
+    project_ids = get_project_ids(story_id, current_user=current_user)
+
+    for project_id in project_ids:
+        projects_api.project_update_updated_at(project_id)
+
     return story_get(story_id, current_user=current_user)
 
 
+def get_project_ids(story_id, current_user=None):
+    session = api_base.get_session()
+    with session.begin(subtransactions=True):
+        story = story_get_simple(story_id, session=session,
+                current_user=current_user)
+        if not story:
+            raise exc.NotFound(_("%(name)s not found") %
+                               {'name': "Story"})
+        project_ids = {task.project_id for task in story.tasks}
+    session.expunge(story)
+    return project_ids
+
+
 def story_update_updated_at(story_id):
     session = api_base.get_session()
-
     with session.begin(subtransactions=True):
         story = story_get_simple(story_id, session=session,
                                  no_permissions=True)
@@ -293,6 +310,7 @@ def story_add_tag(story_id, tag_name, current_user=None):
 
         story.tags.append(tag)
         story.updated_at = datetime.datetime.now(tz=pytz.utc)
+
         session.add(story)
     session.expunge(story)
 
diff --git a/storyboard/db/api/tasks.py b/storyboard/db/api/tasks.py
index ec04f0ca..af3f75fd 100644
--- a/storyboard/db/api/tasks.py
+++ b/storyboard/db/api/tasks.py
@@ -14,6 +14,7 @@
 # limitations under the License.
 
 from storyboard.db.api import base as api_base
+from storyboard.db.api import projects as projects_api
 from storyboard.db.api import stories as stories_api
 from storyboard.db import models
 
@@ -66,14 +67,17 @@ def task_create(values):
 
     if task:
         stories_api.story_update_updated_at(task.story_id)
+        # Update updated_at in projects when task is created
+        projects_api.project_update_updated_at(task.project_id)
     return task
 
 
 def task_update(task_id, values):
     task = api_base.entity_update(models.Task, task_id, values)
-
     if task:
         stories_api.story_update_updated_at(task.story_id)
+        # Update updated_at in projects when task is updated
+        projects_api.project_update_updated_at(task.project_id)
     return task
 
 
@@ -82,6 +86,8 @@ def task_delete(task_id):
 
     if task:
         stories_api.story_update_updated_at(task.story_id)
+        # Update updated_at in projects when task/story is deleted
+        projects_api.project_update_updated_at(task.project_id)
         api_base.entity_hard_delete(models.Task, task_id)