diff --git a/src/protean/core/entity.py b/src/protean/core/entity.py
index 2d5bfbed..65bee4ca 100644
--- a/src/protean/core/entity.py
+++ b/src/protean/core/entity.py
@@ -316,6 +316,9 @@ class QuerySet:
     def update(self, *data, **kwargs):
         """Updates all objects with details given if they match a set of conditions supplied.
 
+        This method updates each object individually, to fire callback methods and ensure
+        validations are run.
+
         Returns the number of objects matched (which may not be equal to the number of objects
             updated if objects rows already have the new value).
         """
@@ -336,7 +339,6 @@ class QuerySet:
         """Deletes matching objects from the Repository
 
         Does not throw error if no objects are matched.
-        Throws ObjectNotFoundError if the object was not found in the repository
 
         Returns the number of objects matched (which may not be equal to the number of objects
             deleted if objects rows already have the new value).
@@ -355,6 +357,27 @@ class QuerySet:
 
         return deleted_item_count
 
+    def update_all(self, *args, **kwargs):
+        """Updates all objects with details given if they match a set of conditions supplied.
+
+        This method forwards filters and updates directly to the adapter. It does not instantiate
+        models and it does not trigger Entity callbacks or validations.
+
+        Update values can be specified either as a dict, or keyword arguments.
+
+        Returns the number of objects matched (which may not be equal to the number of objects
+            updated if objects rows already have the new value).
+        """
+        updated_item_count = 0
+        _, adapter = self._retrieve_model()
+        try:
+            updated_item_count = adapter._update_all_objects(self._criteria, *args, **kwargs)
+        except Exception as exc:
+            # FIXME Log Exception
+            raise
+
+        return updated_item_count
+
     ###############################
     # Python Magic method support #
     ###############################
diff --git a/src/protean/core/repository/base.py b/src/protean/core/repository/base.py
index c77fec5b..32254636 100644
--- a/src/protean/core/repository/base.py
+++ b/src/protean/core/repository/base.py
@@ -55,6 +55,10 @@ class BaseAdapter(RegisterLookupMixin, metaclass=ABCMeta):
     def _update_object(self, model_obj: Any):
         """Update a model object in the repository and return it"""
 
+    @abstractmethod
+    def _update_all_objects(self, criteria: Q, *args, **kwargs):
+        """Updates object directly in the repository and returns update count"""
+
     @abstractmethod
     def _delete_objects(self, **filters):
         """Delete a Record from the Repository"""
diff --git a/src/protean/impl/repository/dict_repo.py b/src/protean/impl/repository/dict_repo.py
index 911073b1..af9579e4 100644
--- a/src/protean/impl/repository/dict_repo.py
+++ b/src/protean/impl/repository/dict_repo.py
@@ -139,6 +139,21 @@ class Adapter(BaseAdapter):
             self.conn['data'][self.model_name][identifier] = model_obj
         return model_obj
 
+    def _update_all_objects(self, criteria: Q, *args, **kwargs):
+        """ Update all objects satisfying the criteria """
+        items = self._filter(criteria, self.conn['data'][self.model_name])
+
+        update_count = 0
+        for key in items:
+            item = items[key]
+            item.update(*args)
+            item.update(kwargs)
+            self.conn['data'][self.model_name][key] = item
+
+            update_count += 1
+
+        return update_count
+
     def _delete_objects(self, **filters):
         """ Delete the dictionary object by its id"""
 

Add support for `update_all` and `delete_all` methods that ignore Entity Callbacks
diff --git a/tests/core/test_entity.py b/tests/core/test_entity.py
index de314e2f..50f8f676 100644
--- a/tests/core/test_entity.py
+++ b/tests/core/test_entity.py
@@ -293,6 +293,50 @@ class TestEntity:
         assert u_dog3.owner == 'Jane'
         assert u_dog4.owner == 'Jane'
 
+    def test_update_all_with_args(self):
+        """Try updating all records satisfying filter in one step, passing a dict"""
+        Dog.create(id=1, name='Athos', owner='John', age=2)
+        Dog.create(id=2, name='Porthos', owner='John', age=3)
+        Dog.create(id=3, name='Aramis', owner='John', age=4)
+        Dog.create(id=4, name='dArtagnan', owner='John', age=5)
+
+        # Perform update
+        updated_count = Dog.query.filter(age__gt=3).update_all({'owner': 'Jane'})
+
+        # Query and check if only the relevant records have been updated
+        assert updated_count == 2
+
+        u_dog1 = Dog.get(1)
+        u_dog2 = Dog.get(2)
+        u_dog3 = Dog.get(3)
+        u_dog4 = Dog.get(4)
+        assert u_dog1.owner == 'John'
+        assert u_dog2.owner == 'John'
+        assert u_dog3.owner == 'Jane'
+        assert u_dog4.owner == 'Jane'
+
+    def test_update_all_with_kwargs(self):
+        """Try updating all records satisfying filter in one step"""
+        Dog.create(id=1, name='Athos', owner='John', age=2)
+        Dog.create(id=2, name='Porthos', owner='John', age=3)
+        Dog.create(id=3, name='Aramis', owner='John', age=4)
+        Dog.create(id=4, name='dArtagnan', owner='John', age=5)
+
+        # Perform update
+        updated_count = Dog.query.filter(age__gt=3).update_all(owner='Jane')
+
+        # Query and check if only the relevant records have been updated
+        assert updated_count == 2
+
+        u_dog1 = Dog.get(1)
+        u_dog2 = Dog.get(2)
+        u_dog3 = Dog.get(3)
+        u_dog4 = Dog.get(4)
+        assert u_dog1.owner == 'John'
+        assert u_dog2.owner == 'John'
+        assert u_dog3.owner == 'Jane'
+        assert u_dog4.owner == 'Jane'
+
     def test_unique(self):
         """ Test the unique constraints for the entity """
         Dog.create(id=2, name='Johnny', owner='Carey')
diff --git a/tests/test_config.py b/tests/test_config.py
index 7189f16c..63f81cd7 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -1,22 +1,24 @@
 """ Module to test Config functionality """
 import os
 
-import pytest
-
 from protean.conf import Config
-from protean.core.exceptions import ConfigurationError
-
 
-def test_config_module():
-    """ Test that config module is loaded correctly"""
 
+def test_default_config_module():
+    """ Test that default config module is loaded correctly"""
     # Do not set any config file
     os.environ['PROTEAN_CONFIG'] = ''
-    with pytest.raises(ConfigurationError):
-        Config()
+    config1 = Config()
+
+    # Config should have considered protean.conf.default_config s default config
+    assert config1.SECRET_KEY == 'wR5yJVF!PVA3&bBaFK%e3#MQna%DJfyT'
+
+
+def test_config_module_load():
+    """ Test that specified config module is loaded correctly"""
 
     # Set the config file and make sure values get loaded
     os.environ['PROTEAN_CONFIG'] = 'tests.support.sample_config'
-    config = Config()
-    assert config.TESTING
-    assert config.SECRET_KEY == 'abcdefghijklmn'
+    config2 = Config()
+    assert config2.TESTING
+    assert config2.SECRET_KEY == 'abcdefghijklmn'

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.16
babel==2.17.0
certifi==2025.1.31
charset-normalizer==3.4.1
check-manifest==0.37
Click==7.0
coverage==4.5.1
distlib==0.3.9
docutils==0.14
exceptiongroup==1.2.2
filelock==3.18.0
flake8==3.5.0
idna==3.10
imagesize==1.4.1
iniconfig==2.1.0
Jinja2==3.1.6
MarkupSafe==3.0.2
mccabe==0.6.1
packaging==24.2
pkginfo==1.12.1.2
platformdirs==4.3.7
pluggy==0.13.1
-e git+https://github.com/proteanhq/protean.git@b5079ec645af8d406a7bb0839b229882f3f7c3b4#egg=protean
py==1.11.0
pycodestyle==2.3.1
pyflakes==1.6.0
Pygments==2.19.1
pytest==7.4.4
pytest-flake8==1.0.4
python-dateutil==2.7.3
requests==2.32.3
requests-toolbelt==1.0.0
six==1.17.0
snowballstemmer==2.2.0
Sphinx==1.8.3
sphinxcontrib-serializinghtml==2.0.0
sphinxcontrib-websupport==1.2.4
tomli==2.2.1
tox==3.1.2
tqdm==4.67.1
twine==1.11.0
urllib3==2.3.0
virtualenv==20.29.3

name: protean
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.16
      - babel==2.17.0
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - check-manifest==0.37
      - click==7.0
      - coverage==4.5.1
      - distlib==0.3.9
      - docutils==0.14
      - exceptiongroup==1.2.2
      - filelock==3.18.0
      - flake8==3.5.0
      - idna==3.10
      - imagesize==1.4.1
      - iniconfig==2.1.0
      - jinja2==3.1.6
      - markupsafe==3.0.2
      - mccabe==0.6.1
      - packaging==24.2
      - pkginfo==1.12.1.2
      - platformdirs==4.3.7
      - pluggy==0.13.1
      - py==1.11.0
      - pycodestyle==2.3.1
      - pyflakes==1.6.0
      - pygments==2.19.1
      - pytest==7.4.4
      - pytest-flake8==1.0.4
      - python-dateutil==2.7.3
      - requests==2.32.3
      - requests-toolbelt==1.0.0
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==1.8.3
      - sphinxcontrib-serializinghtml==2.0.0
      - sphinxcontrib-websupport==1.2.4
      - tomli==2.2.1
      - tox==3.1.2
      - tqdm==4.67.1
      - twine==1.11.0
      - urllib3==2.3.0
      - virtualenv==20.29.3
prefix: /opt/conda/envs/protean

tests/core/test_entity.py::TestEntity::test_update_all_with_args tests/core/test_entity.py::TestEntity::test_update_all_with_kwargs
tests/core/test_entity.py::TestEntity::test_init tests/core/test_entity.py::TestEntity::test_individuality tests/core/test_entity.py::TestEntity::test_required_fields tests/core/test_entity.py::TestEntity::test_defaults tests/core/test_entity.py::TestEntity::test_validate_string_length tests/core/test_entity.py::TestEntity::test_validate_data_value_against_type tests/core/test_entity.py::TestEntity::test_template_init tests/core/test_entity.py::TestEntity::test_error_messages tests/core/test_entity.py::TestEntity::test_entity_inheritance tests/core/test_entity.py::TestEntity::test_default_id tests/core/test_entity.py::TestEntity::test_to_dict tests/core/test_entity.py::TestEntity::test_get tests/core/test_entity.py::TestEntity::test_get_object_not_found_error tests/core/test_entity.py::TestEntity::test_find_by tests/core/test_entity.py::TestEntity::test_find_by_object_not_found_error tests/core/test_entity.py::TestEntity::test_find_by_multiple_attributes tests/core/test_entity.py::TestEntity::test_find_by_multiple_attributes_object_not_found_error tests/core/test_entity.py::TestEntity::test_create_error tests/core/test_entity.py::TestEntity::test_create tests/core/test_entity.py::TestEntity::test_save tests/core/test_entity.py::TestEntity::test_save_validation_error tests/core/test_entity.py::TestEntity::test_save_invalid_value tests/core/test_entity.py::TestEntity::test_update_with_invalid_id tests/core/test_entity.py::TestEntity::test_update_with_dict tests/core/test_entity.py::TestEntity::test_update_with_kwargs tests/core/test_entity.py::TestEntity::test_update_with_dict_and_kwargs tests/core/test_entity.py::TestEntity::test_that_update_runs_validations tests/core/test_entity.py::TestEntity::test_update_by tests/core/test_entity.py::TestEntity::test_unique tests/core/test_entity.py::TestEntity::test_query_init tests/core/test_entity.py::TestEntity::test_filter_chain_initialization_from_entity tests/core/test_entity.py::TestEntity::test_filter_chaining tests/core/test_entity.py::TestEntity::test_filter_chain_results_1 tests/core/test_entity.py::TestEntity::test_filter_chain_results_2 tests/core/test_entity.py::TestEntity::test_filter_chain_results_3 tests/core/test_entity.py::TestEntity::test_filter_norm tests/core/test_entity.py::TestEntity::test_exclude tests/core/test_entity.py::TestEntity::test_exclude_multiple tests/core/test_entity.py::TestEntity::test_comparisons tests/core/test_entity.py::TestEntity::test_invalid_comparison_on_query_evaluation tests/core/test_entity.py::TestEntity::test_pagination tests/core/test_entity.py::TestEntity::test_delete tests/core/test_entity.py::TestEntity::test_delete_by tests/core/test_entity.py::TestEntity::test_filter_returns_q_object tests/core/test_entity.py::TestEntityMetaAttributes::test_meta_on_init tests/core/test_entity.py::TestEntityMetaAttributes::test_declared_fields_normal tests/core/test_entity.py::TestEntityMetaAttributes::test_declared_fields_with_reference tests/core/test_entity.py::TestEntityMetaAttributes::test_declared_fields_with_hasone_association tests/test_config.py::test_default_config_module tests/test_config.py::test_config_module_load
src/protean/core/entity.py src/protean/core/repository/base.py src/protean/impl/repository/dict_repo.py
src/protean/core/entity.py src/protean/core/repository/base.py src/protean/impl/repository/dict_repo.py