diff --git a/Source/cmIDEFlagTable.h b/Source/cmIDEFlagTable.h
index adc7763..9dedb71 100644
--- a/Source/cmIDEFlagTable.h
+++ b/Source/cmIDEFlagTable.h
@@ -33,6 +33,8 @@ struct cmIDEFlagTable
                                   // IgnoreDefaultLibraryNames)
     UserFollowing = (1<<5), // expect value in following argument
     CaseInsensitive = (1<<6), // flag may be any case
+    RegularExpression = (1<<7), // commandFlag contains regular expression
+                                // value field can contain placeholders for matches
 
     UserValueIgnored  = UserValue | UserIgnored,
     UserValueRequired = UserValue | UserRequired
diff --git a/Source/cmIDEOptions.cxx b/Source/cmIDEOptions.cxx
index 509602f..8afd56c 100644
--- a/Source/cmIDEOptions.cxx
+++ b/Source/cmIDEOptions.cxx
@@ -14,6 +14,7 @@
 #include "cmSystemTools.h"
 
 #include <cmsys/String.h>
+#include <cmsys/RegularExpression.hxx>
 
 //----------------------------------------------------------------------------
 cmIDEOptions::cmIDEOptions()
@@ -100,7 +101,33 @@ bool cmIDEOptions::CheckFlagTable(cmIDEFlagTable const* table,
   for(cmIDEFlagTable const* entry = table; entry->IDEName; ++entry)
     {
     bool entry_found = false;
-    if(entry->special & cmIDEFlagTable::UserValue)
+    // This flag accepts regular expressions within the command flag.
+    // Placeholders (e.g \1, \2, etc.) within the value field will be
+    // replaced by the matched subexpressions.
+    if (entry->special & cmIDEFlagTable::RegularExpression)
+      {
+      cmsys::RegularExpression regex(entry->commandFlag);
+      
+      if (regex.find(flag))
+        {
+        char placeholder[32];
+        std::string value = entry->value;
+        for (int i = cmsys::RegularExpression::NSUBEXP - 1; i >= 0; --i)
+          {
+          int len = sprintf_s(placeholder, sizeof(placeholder), "\\%d", i);
+          if (len > 0)
+            {
+            int pos;
+            while ((pos = value.find(placeholder, 0)) != std::string::npos)
+              value.replace(pos, pos + len, regex.match(i));
+            }
+          }
+        
+        this->FlagMapUpdate(entry, value.c_str());
+        entry_found = true;
+        }
+      }
+    else if(entry->special & cmIDEFlagTable::UserValue)
       {
       // This flag table entry accepts a user-specified value.  If
       // the entry specifies UserRequired we must match only if a
@@ -151,7 +178,8 @@ bool cmIDEOptions::CheckFlagTable(cmIDEFlagTable const* table,
 void cmIDEOptions::FlagMapUpdate(cmIDEFlagTable const* entry,
                                  const char* new_value)
 {
-  if(entry->special & cmIDEFlagTable::UserIgnored)
+  if(entry->special & cmIDEFlagTable::UserIgnored &&
+     !(entry->special & cmIDEFlagTable::RegularExpression))
     {
     // Ignore the user-specified value.
     this->FlagMap[entry->IDEName] = entry->value;
diff --git a/Source/cmVS10LinkFlagTable.h b/Source/cmVS10LinkFlagTable.h
index dd92329..7f4c2be 100644
--- a/Source/cmVS10LinkFlagTable.h
+++ b/Source/cmVS10LinkFlagTable.h
@@ -195,8 +195,14 @@ static cmVS7FlagTable cmVS10LinkFlagTable[] =
   {"EnableUAC", "MANIFESTUAC:NO", "", "false", 0},
   {"EnableUAC", "MANIFESTUAC:", "", "true",
    cmVS7FlagTable::UserValueIgnored | cmVS7FlagTable::Continue},
-  {"UACUIAccess", "MANIFESTUAC:", "Enable User Account Control (UAC)", "",
-   cmVS7FlagTable::UserValueRequired},
+  {"UACExecutionLevel", "MANIFESTUAC:level=([a-zA-Z]+)$", "", "\\1",
+   cmVS7FlagTable::RegularExpression},
+  {"UACUIAccess", "MANIFESTUAC:uiAccess=([a-zA-Z]+)$", "", "\\1",
+   cmVS7FlagTable::RegularExpression},
+  {"UACExecutionLevel", "MANIFESTUAC:level=([a-zA-Z]+) uiAccess=([a-zA-Z]+)$", "", "\\1",
+   cmVS7FlagTable::RegularExpression | cmVS7FlagTable::Continue},
+  {"UACUIAccess", "MANIFESTUAC:level=([a-zA-Z]+) uiAccess=([a-zA-Z]+)$", "", "\\2",
+   cmVS7FlagTable::RegularExpression},
   {"GenerateMapFile", "MAP", "", "true",
    cmVS7FlagTable::UserValueIgnored | cmVS7FlagTable::Continue},
   {"MapFileName", "MAP:", "Generate Map File", "",
diff --git a/Source/cmVS11LinkFlagTable.h b/Source/cmVS11LinkFlagTable.h
index 2d6f6c0..03bdfa6 100644
--- a/Source/cmVS11LinkFlagTable.h
+++ b/Source/cmVS11LinkFlagTable.h
@@ -221,8 +221,14 @@ static cmVS7FlagTable cmVS11LinkFlagTable[] =
   {"EnableUAC", "MANIFESTUAC:NO", "", "false", 0},
   {"EnableUAC", "MANIFESTUAC:", "", "true",
    cmVS7FlagTable::UserValueIgnored | cmVS7FlagTable::Continue},
-  {"UACUIAccess", "MANIFESTUAC:", "Enable User Account Control (UAC)", "",
-   cmVS7FlagTable::UserValueRequired},
+  {"UACExecutionLevel", "MANIFESTUAC:level=([a-zA-Z]+)$", "", "\\1",
+   cmVS7FlagTable::RegularExpression},
+  {"UACUIAccess", "MANIFESTUAC:uiAccess=([a-zA-Z]+)$", "", "\\1",
+   cmVS7FlagTable::RegularExpression},
+  {"UACExecutionLevel", "MANIFESTUAC:level=([a-zA-Z]+) uiAccess=([a-zA-Z]+)$", "", "\\1",
+   cmVS7FlagTable::RegularExpression | cmVS7FlagTable::Continue},
+  {"UACUIAccess", "MANIFESTUAC:level=([a-zA-Z]+) uiAccess=([a-zA-Z]+)$", "", "\\2",
+   cmVS7FlagTable::RegularExpression},
   {"GenerateMapFile", "MAP", "", "true",
    cmVS7FlagTable::UserValueIgnored | cmVS7FlagTable::Continue},
   {"MapFileName", "MAP:", "Generate Map File", "",
diff --git a/Source/cmVS12LinkFlagTable.h b/Source/cmVS12LinkFlagTable.h
index 0be5e34..fae33cb 100644
--- a/Source/cmVS12LinkFlagTable.h
+++ b/Source/cmVS12LinkFlagTable.h
@@ -221,8 +221,14 @@ static cmVS7FlagTable cmVS12LinkFlagTable[] =
   {"EnableUAC", "MANIFESTUAC:NO", "", "false", 0},
   {"EnableUAC", "MANIFESTUAC:", "", "true",
    cmVS7FlagTable::UserValueIgnored | cmVS7FlagTable::Continue},
-  {"UACUIAccess", "MANIFESTUAC:", "Enable User Account Control (UAC)", "",
-   cmVS7FlagTable::UserValueRequired},
+  {"UACExecutionLevel", "MANIFESTUAC:level=([a-zA-Z]+)$", "", "\\1",
+   cmVS7FlagTable::RegularExpression},
+  {"UACUIAccess", "MANIFESTUAC:uiAccess=([a-zA-Z]+)$", "", "\\1",
+   cmVS7FlagTable::RegularExpression},
+  {"UACExecutionLevel", "MANIFESTUAC:level=([a-zA-Z]+) uiAccess=([a-zA-Z]+)$", "", "\\1",
+   cmVS7FlagTable::RegularExpression | cmVS7FlagTable::Continue},
+  {"UACUIAccess", "MANIFESTUAC:level=([a-zA-Z]+) uiAccess=([a-zA-Z]+)$", "", "\\2",
+   cmVS7FlagTable::RegularExpression},
   {"GenerateMapFile", "MAP", "", "true",
    cmVS7FlagTable::UserValueIgnored | cmVS7FlagTable::Continue},
   {"MapFileName", "MAP:", "Generate Map File", "",
diff --git a/Source/cmVS14LinkFlagTable.h b/Source/cmVS14LinkFlagTable.h
index 29e3d86..88d1997 100644
--- a/Source/cmVS14LinkFlagTable.h
+++ b/Source/cmVS14LinkFlagTable.h
@@ -223,8 +223,14 @@ static cmVS7FlagTable cmVS14LinkFlagTable[] =
   {"EnableUAC", "MANIFESTUAC:NO", "", "false", 0},
   {"EnableUAC", "MANIFESTUAC:", "", "true",
    cmVS7FlagTable::UserValueIgnored | cmVS7FlagTable::Continue},
-  {"UACUIAccess", "MANIFESTUAC:", "Enable User Account Control (UAC)", "",
-   cmVS7FlagTable::UserValueRequired},
+  {"UACExecutionLevel", "MANIFESTUAC:level=([a-zA-Z]+)$", "", "\\1",
+   cmVS7FlagTable::RegularExpression},
+  {"UACUIAccess", "MANIFESTUAC:uiAccess=([a-zA-Z]+)$", "", "\\1",
+   cmVS7FlagTable::RegularExpression},
+  {"UACExecutionLevel", "MANIFESTUAC:level=([a-zA-Z]+) uiAccess=([a-zA-Z]+)$", "", "\\1",
+   cmVS7FlagTable::RegularExpression | cmVS7FlagTable::Continue},
+  {"UACUIAccess", "MANIFESTUAC:level=([a-zA-Z]+) uiAccess=([a-zA-Z]+)$", "", "\\2",
+   cmVS7FlagTable::RegularExpression},
   {"GenerateMapFile", "MAP", "", "true",
    cmVS7FlagTable::UserValueIgnored | cmVS7FlagTable::Continue},
   {"MapFileName", "MAP:", "Generate Map File", "",
