diff --git a/README.md b/README.md
index 81820354..9ed9ab37 100644
--- a/README.md
+++ b/README.md
@@ -340,6 +340,7 @@ following rules are enabled by default:
 * `tmux` – fixes `tmux` commands;
 * `unknown_command` – fixes hadoop hdfs-style "unknown command", for example adds missing '-' to the command on `hdfs dfs ls`;
 * `unsudo` – removes `sudo` from previous command if a process refuses to run on superuser privilege.
+* `upper_to_lower_case` – replaces the uppercase letters with lowercase, so the command is correct;
 * `vagrant_up` – starts up the vagrant instance;
 * `whois` – fixes `whois` command;
 * `workon_doesnt_exists` – fixes `virtualenvwrapper` env name os suggests to create new.
diff --git a/tests/rules/test_upper_to_lower_case.py b/tests/rules/test_upper_to_lower_case.py
new file mode 100644
index 00000000..d873c523
--- /dev/null
+++ b/tests/rules/test_upper_to_lower_case.py
@@ -0,0 +1,44 @@
+import pytest
+
+from thefuck.rules.upper_to_lower_case import match, get_new_command
+from thefuck.types import Command
+
+
+
+@pytest.mark.parametrize(
+    "script, output",
+    [
+        ("LS", "command not found"),
+        ("LS -A", "command not found"),
+    ],
+)
+def test_match(script, output):
+    assert match(Command(script, output))
+
+
+@pytest.mark.parametrize(
+    "script, output",
+    [
+        ("ls", ""),
+        ("cd thefuck", ""),
+        ("mv tests testing", ""),
+        ("git add .", ""),
+    ],
+)
+def test_not_match(script, output):
+    assert not match(Command(script, output))
+
+
+@pytest.mark.parametrize(
+    "script, output, new_command",
+    [
+        ("LS", "command not found", "ls"),
+        ("CD TESTS", "command not found", "cd tests"),
+        ("CAT README.MD", "command not found", "cat readme.md"),
+        ("GIT ADD .", "command not found", "git add ."),
+        ("GIT ADD .", "command not found", "git add ."),
+        ("MV TESTS TESTING", "command not found", "mv tests testing"),
+    ],
+)
+def test_get_new_command(script, output, new_command):
+    assert get_new_command(Command(script, output)) == new_command
diff --git a/thefuck/rules/upper_to_lower_case.py b/thefuck/rules/upper_to_lower_case.py
new file mode 100644
index 00000000..afdad5dd
--- /dev/null
+++ b/thefuck/rules/upper_to_lower_case.py
@@ -0,0 +1,21 @@
+from thefuck.utils import get_all_executables, which
+
+# this rule is activated when the typed command is
+# in uppercase letters and if the command is not 
+# executed. However in order to activate this rule
+# it is necessary the first word of the whole command
+# to be valid.
+def match(command):
+    return (command.script.isupper()
+    	    and not which(command.script_parts[0])
+            and ('not found' in command.output
+                 or 'is not recognized as' in command.output)
+            and (command.script_parts[0].lower() in get_all_executables()))
+
+# returns the same command in lowercase letters
+def get_new_command(cmd):
+    return cmd.script.lower()
+
+
+requires_output = False
+priority = 100
\ No newline at end of file