diff --git a/imgui.cpp b/imgui.cpp
index 805844f..45d90f7 100644
--- a/imgui.cpp
+++ b/imgui.cpp
@@ -2148,24 +2148,33 @@
     return new_best;
 }
 
-void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id)
+void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags)
 {
     ImGuiContext& g = *GImGui;
-    if (id != g.NavId || g.NavDisableHighlight)
+    if (id != g.NavId)
         return;
+    if (g.NavDisableHighlight && !(flags & ImGuiNavHighlightFlags_AlwaysRender))
+        return;    
     ImGuiWindow* window = ImGui::GetCurrentWindow();
 
     ImRect display_rect = bb;
     display_rect.ClipWith(window->ClipRect);
-    const float THICKNESS = 2.0f;
-    const float DISTANCE = 3.0f + THICKNESS * 0.5f;
-    display_rect.Expand(ImVec2(DISTANCE,DISTANCE));
-    bool fully_visible = window->ClipRect.Contains(display_rect);
-    if (!fully_visible)
-        window->DrawList->PushClipRect(display_rect.Min, display_rect.Max);
-    window->DrawList->AddRect(display_rect.Min + ImVec2(THICKNESS*0.5f,THICKNESS*0.5f), display_rect.Max - ImVec2(THICKNESS*0.5f,THICKNESS*0.5f), GetColorU32(ImGuiCol_NavHighlight), g.Style.FrameRounding, 0x0F, THICKNESS);
-    if (!fully_visible)
-        window->DrawList->PopClipRect();
+    if (flags & ImGuiNavHighlightFlags_TypeDefault)
+    {
+        const float THICKNESS = 2.0f;
+        const float DISTANCE = 3.0f + THICKNESS * 0.5f;
+        display_rect.Expand(ImVec2(DISTANCE,DISTANCE));
+        bool fully_visible = window->ClipRect.Contains(display_rect);
+        if (!fully_visible)
+            window->DrawList->PushClipRect(display_rect.Min, display_rect.Max);
+        window->DrawList->AddRect(display_rect.Min + ImVec2(THICKNESS*0.5f,THICKNESS*0.5f), display_rect.Max - ImVec2(THICKNESS*0.5f,THICKNESS*0.5f), GetColorU32(ImGuiCol_NavHighlight), g.Style.FrameRounding, 0x0F, THICKNESS);
+        if (!fully_visible)
+            window->DrawList->PopClipRect();
+    }
+    if (flags & ImGuiNavHighlightFlags_TypeThin)
+    {
+        window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), g.Style.FrameRounding, ~0, 1.0f);
+    }
 }
 
 // Declare item bounding box for clipping and interaction.
diff --git a/imgui_internal.h b/imgui_internal.h
index 3798e7f..9ef0fbb 100644
--- a/imgui_internal.h
+++ b/imgui_internal.h
@@ -51,6 +51,7 @@
 typedef int ImGuiSliderFlags;     // enum ImGuiSliderFlags_
 typedef int ImGuiSeparatorFlags;  // enum ImGuiSeparatorFlags_
 typedef int ImGuiItemFlags;       // enum ImGuiItemFlags_
+typedef int ImGuiNavHighlightFlags;
 
 //-------------------------------------------------------------------------
 // STB libraries
@@ -250,6 +251,13 @@
     ImGuiDir_Down    = 3
 };
 
+enum ImGuiNavHighlightFlags_
+{
+    ImGuiNavHighlightFlags_TypeDefault  = 1 << 0,
+    ImGuiNavHighlightFlags_TypeThin     = 1 << 1,
+    ImGuiNavHighlightFlags_AlwaysRender = 1 << 2
+};
+
 enum ImGuiCorner
 {
     ImGuiCorner_TopLeft     = 1 << 0, // 1
@@ -895,7 +903,7 @@
     IMGUI_API void          RenderCollapseTriangle(ImVec2 pos, bool is_open, float scale = 1.0f);
     IMGUI_API void          RenderBullet(ImVec2 pos);
     IMGUI_API void          RenderCheckMark(ImVec2 pos, ImU32 col);
-    IMGUI_API void          RenderNavHighlight(const ImRect& bb, ImGuiID id);                   // Navigation highlight
+    IMGUI_API void          RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight
     IMGUI_API void          RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding);
     IMGUI_API const char*   FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
 
