diff --git a/openstackclient/identity/v2_0/project.py b/openstackclient/identity/v2_0/project.py
index 8be482fe57..c4f730e0a7 100644
--- a/openstackclient/identity/v2_0/project.py
+++ b/openstackclient/identity/v2_0/project.py
@@ -189,13 +189,6 @@ class SetProject(command.Command):
     def take_action(self, parsed_args):
         identity_client = self.app.client_manager.identity
 
-        if (not parsed_args.name
-                and not parsed_args.description
-                and not parsed_args.enable
-                and not parsed_args.property
-                and not parsed_args.disable):
-            return
-
         project = utils.find_resource(
             identity_client.tenants,
             parsed_args.project,
@@ -295,7 +288,6 @@ class UnsetProject(command.Command):
             metavar='<key>',
             action='append',
             default=[],
-            required=True,
             help=_('Unset a project property '
                    '(repeat option to unset multiple properties)'),
         )
@@ -307,11 +299,8 @@ class UnsetProject(command.Command):
             identity_client.tenants,
             parsed_args.project,
         )
-        if not parsed_args.property:
-            self.app.log.error(_("No changes requested\n"))
-        else:
-            kwargs = project._info
-            for key in parsed_args.property:
-                if key in kwargs:
-                    kwargs[key] = None
-            identity_client.tenants.update(project.id, **kwargs)
+        kwargs = project._info
+        for key in parsed_args.property:
+            if key in kwargs:
+                kwargs[key] = None
+        identity_client.tenants.update(project.id, **kwargs)
diff --git a/openstackclient/identity/v2_0/user.py b/openstackclient/identity/v2_0/user.py
index 7777bab886..3ee2a65e55 100644
--- a/openstackclient/identity/v2_0/user.py
+++ b/openstackclient/identity/v2_0/user.py
@@ -287,15 +287,6 @@ class SetUser(command.Command):
         if parsed_args.password_prompt:
             parsed_args.password = utils.get_password(self.app.stdin)
 
-        if (not parsed_args.name
-                and not parsed_args.name
-                and not parsed_args.password
-                and not parsed_args.email
-                and not parsed_args.project
-                and not parsed_args.enable
-                and not parsed_args.disable):
-            return
-
         user = utils.find_resource(
             identity_client.users,
             parsed_args.user,
diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py
index d20fdba607..53f9530b96 100644
--- a/openstackclient/image/v2/image.py
+++ b/openstackclient/image/v2/image.py
@@ -817,11 +817,6 @@ class SetImage(command.Command):
                 parsed_args.project_domain,
             ).id
 
-        # Checks if anything that requires getting the image
-        if not (kwargs or parsed_args.deactivate or parsed_args.activate):
-            msg = _("No arguments specified")
-            raise exceptions.CommandError(msg)
-
         image = utils.find_resource(
             image_client.images, parsed_args.image)
 
@@ -833,10 +828,6 @@ class SetImage(command.Command):
             image_client.images.reactivate(image.id)
             activation_status = "activated"
 
-        # Check if need to do the actual update
-        if not kwargs:
-            return {}, {}
-
         if parsed_args.tags:
             # Tags should be extended, but duplicates removed
             kwargs['tags'] = list(set(image.tags).union(set(parsed_args.tags)))
@@ -909,10 +900,6 @@ class UnsetImage(command.Command):
             parsed_args.image,
         )
 
-        if not (parsed_args.tags or parsed_args.properties):
-            msg = _("No arguments specified")
-            raise exceptions.CommandError(msg)
-
         kwargs = {}
         tagret = 0
         propret = 0
diff --git a/openstackclient/tests/identity/v2_0/test_project.py b/openstackclient/tests/identity/v2_0/test_project.py
index 38684aaffe..1eb1260419 100644
--- a/openstackclient/tests/identity/v2_0/test_project.py
+++ b/openstackclient/tests/identity/v2_0/test_project.py
@@ -16,6 +16,7 @@
 import copy
 
 from keystoneauth1 import exceptions as ks_exc
+from osc_lib import exceptions
 
 from openstackclient.identity.v2_0 import project
 from openstackclient.tests import fakes
@@ -410,6 +411,26 @@ class TestProjectSet(TestProject):
 
         self.assertIsNone(result)
 
+    def test_project_set_unexist_project(self):
+        arglist = [
+            "unexist-project",
+        ]
+        verifylist = [
+            ('project', "unexist-project"),
+            ('name', None),
+            ('description', None),
+            ('enable', False),
+            ('disable', False),
+            ('property', None),
+        ]
+        self.projects_mock.get.side_effect = exceptions.NotFound(None)
+        self.projects_mock.find.side_effect = exceptions.NotFound(None)
+
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        self.assertRaises(
+            exceptions.CommandError, self.cmd.take_action, parsed_args)
+
     def test_project_set_name(self):
         arglist = [
             '--name', 'qwerty',
@@ -604,6 +625,19 @@ class TestProjectUnset(TestProject):
         # Get the command object to test
         self.cmd = project.UnsetProject(self.app, None)
 
+    def test_project_unset_no_options(self):
+        arglist = [
+            identity_fakes.project_name,
+        ]
+        verifylist = [
+            ('project', identity_fakes.project_name),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        result = self.cmd.take_action(parsed_args)
+
+        self.assertIsNone(result)
+
     def test_project_unset_key(self):
         arglist = [
             '--property', 'fee',
diff --git a/openstackclient/tests/identity/v2_0/test_user.py b/openstackclient/tests/identity/v2_0/test_user.py
index caf38a6f26..f7a7b08c3f 100644
--- a/openstackclient/tests/identity/v2_0/test_user.py
+++ b/openstackclient/tests/identity/v2_0/test_user.py
@@ -17,6 +17,7 @@ import copy
 import mock
 
 from keystoneauth1 import exceptions as ks_exc
+from osc_lib import exceptions
 
 from openstackclient.identity.v2_0 import user
 from openstackclient.tests import fakes
@@ -563,6 +564,27 @@ class TestUserSet(TestUser):
 
         self.assertIsNone(result)
 
+    def test_user_set_unexist_user(self):
+        arglist = [
+            "unexist-user",
+        ]
+        verifylist = [
+            ('name', None),
+            ('password', None),
+            ('email', None),
+            ('project', None),
+            ('enable', False),
+            ('disable', False),
+            ('user', "unexist-user"),
+        ]
+        self.users_mock.get.side_effect = exceptions.NotFound(None)
+        self.users_mock.find.side_effect = exceptions.NotFound(None)
+
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        self.assertRaises(
+            exceptions.CommandError, self.cmd.take_action, parsed_args)
+
     def test_user_set_name(self):
         arglist = [
             '--name', 'qwerty',
diff --git a/openstackclient/tests/image/v2/test_image.py b/openstackclient/tests/image/v2/test_image.py
index 96e8734f8a..592def21ef 100644
--- a/openstackclient/tests/image/v2/test_image.py
+++ b/openstackclient/tests/image/v2/test_image.py
@@ -842,6 +842,19 @@ class TestImageSet(TestImage):
         # Get the command object to test
         self.cmd = image.SetImage(self.app, None)
 
+    def test_image_set_no_options(self):
+        arglist = [
+            image_fakes.image_id,
+        ]
+        verifylist = [
+            ('image', image_fakes.image_id)
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        result = self.cmd.take_action(parsed_args)
+
+        self.assertIsNone(result)
+
     def test_image_set_options(self):
         arglist = [
             '--name', 'new-name',
@@ -1242,6 +1255,19 @@ class TestImageUnset(TestImage):
         # Get the command object to test
         self.cmd = image.UnsetImage(self.app, None)
 
+    def test_image_unset_no_options(self):
+        arglist = [
+            image_fakes.image_id,
+        ]
+        verifylist = [
+            ('image', image_fakes.image_id)
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        result = self.cmd.take_action(parsed_args)
+
+        self.assertIsNone(result)
+
     def test_image_unset_tag_option(self):
 
         arglist = [
diff --git a/releasenotes/notes/bug-1588588-39927ef06ca35730.yaml b/releasenotes/notes/bug-1588588-39927ef06ca35730.yaml
index 440bb7d31c..c745b6bef2 100644
--- a/releasenotes/notes/bug-1588588-39927ef06ca35730.yaml
+++ b/releasenotes/notes/bug-1588588-39927ef06ca35730.yaml
@@ -1,6 +1,6 @@
 ---
 upgrade:
-  - All ``set`` and ``unset`` commands in network and volume now return
-    normally when nothing specified to modify. This will become the default
+  - All ``set`` and ``unset`` commands in network, identity, image, and volume now
+    return normally when nothing specified to modify. This will become the default
     behavior of OSC ``set`` and ``unset`` commands.
     [Bug `1588588 <https://bugs.launchpad.net/python-openstackclient/+bug/1588588>`_]