diff --git a/wpiformat/wpiformat/includeorder.py b/wpiformat/wpiformat/includeorder.py
index 7c0fb48..f1af44c 100644
--- a/wpiformat/wpiformat/includeorder.py
+++ b/wpiformat/wpiformat/includeorder.py
@@ -263,10 +263,10 @@ def header_sort(self, config_file, lines_list, file_name, start, end, ifdef_leve
 
         i = start
         while i < end:
-            if "#ifdef" in lines_list[i]:
+            if "#ifdef" in lines_list[i] or "#ifndef" in lines_list[i]:
                 ifdef_count = 1
                 for j in range(i + 1, end):
-                    if "#ifdef" in lines_list[j]:
+                    if "#ifdef" in lines_list[j] or "#ifndef" in lines_list[j]:
                         ifdef_count += 1
                     elif "#endif" in lines_list[j]:
                         ifdef_count -= 1
@@ -420,7 +420,9 @@ def run_pipeline(self, config_file, name, lines):
         # Write lines from beginning of file to headers
         i = 0
         while i < len(lines_list) and (
-            "#ifdef" not in lines_list[i] and "#include" not in lines_list[i]
+            "#ifdef" not in lines_list[i]
+            and "#ifndef" not in lines_list[i]
+            and "#include" not in lines_list[i]
         ):
             i += 1
         output_list = lines_list[0:i]
diff --git a/wpiformat/wpiformat/test/test_includeorder.py b/wpiformat/wpiformat/test/test_includeorder.py
index ebec039..8cae81f 100644
--- a/wpiformat/wpiformat/test/test_includeorder.py
+++ b/wpiformat/wpiformat/test/test_includeorder.py
@@ -950,4 +950,83 @@ def test_includeorder():
     )
     test.add_latest_input_as_output(True)
 
+    # Ensure #ifndef is handled properly
+    test.add_input(
+        "./Test.h",
+        "#ifndef __APPLE__"
+        + os.linesep
+        + "#include <util.h>"
+        + os.linesep
+        + "#elif !defined(_WIN32)"
+        + os.linesep
+        + "#include <pty.h>"
+        + os.linesep
+        + "#endif"
+        + os.linesep,
+    )
+    test.add_latest_input_as_output(True)
+
+    # Ensure #ifndef is handled properly
+    test.add_input(
+        "./Test.h",
+        "#ifndef _WIN32"
+        + os.linesep
+        + "#include <pty.h>"
+        + os.linesep
+        + "#endif"
+        + os.linesep,
+    )
+    test.add_latest_input_as_output(True)
+
+    # Ensure include guards are handled properly
+    test.add_input(
+        "./Test.h",
+        "#ifndef CSCORE_CONFIGURABLESOURCEIMPL_H_"
+        + os.linesep
+        + "#define CSCORE_CONFIGURABLESOURCEIMPL_H_"
+        + os.linesep
+        + os.linesep
+        + "#include <atomic>"
+        + os.linesep
+        + "#include <functional>"
+        + os.linesep
+        + "#include <memory>"
+        + os.linesep
+        + "#include <string>"
+        + os.linesep
+        + "#include <string_view>"
+        + os.linesep
+        + "#include <vector>"
+        + os.linesep
+        + os.linesep
+        + "#include <wpi/span.h>"
+        + os.linesep
+        + os.linesep
+        + '#include "SourceImpl.h"'
+        + os.linesep
+        + os.linesep
+        + "namespace cs {"
+        + os.linesep
+        + os.linesep
+        + "class ConfigurableSourceImpl : public SourceImpl {"
+        + os.linesep
+        + " protected:"
+        + os.linesep
+        + "  ConfigurableSourceImpl(std::string_view name, wpi::Logger& logger,"
+        + os.linesep
+        + "                         Notifier& notifier, Telemetry& telemetry,"
+        + os.linesep
+        + "                         const VideoMode& mode);"
+        + os.linesep
+        + "};"
+        + os.linesep
+        + os.linesep
+        + "}  // namespace cs"
+        + os.linesep
+        + os.linesep
+        + "#endif  // CSCORE_CONFIGURABLESOURCEIMPL_H_"
+        + os.linesep,
+    )
+    test.add_latest_input_as_output(True)
+
     test.run(OutputType.FILE)