diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt
index d8d613ca9b2..3dee5754d4b 100644
--- a/resources/CMakeLists.txt
+++ b/resources/CMakeLists.txt
@@ -23,5 +23,17 @@ if (MSVC_IDE)
visualstudio/stllist.natvis
visualstudio/stlvector.natvis
visualstudio/unicodestring.natvis
+ visualstudio/wwlib/hash.natvis
+ visualstudio/wwlib/hashtemplate.natvis
+ visualstudio/wwlib/listnode.natvis
+ visualstudio/wwlib/mpsc_intrusive_queue.natvis
+ visualstudio/wwlib/multilist.natvis
+ visualstudio/wwlib/sharebuf.natvis
+ visualstudio/wwlib/simplevec.natvis
+ visualstudio/wwlib/slist.natvis
+ visualstudio/wwlib/uarray.natvis
+ visualstudio/wwlib/vector.natvis
+ visualstudio/wwlib/widestring.natvis
+ visualstudio/wwlib/wwstring.natvis
)
endif()
diff --git a/resources/visualstudio/asciistring.natvis b/resources/visualstudio/asciistring.natvis
index 8f88151691e..4f9a8f1c48d 100644
--- a/resources/visualstudio/asciistring.natvis
+++ b/resources/visualstudio/asciistring.natvis
@@ -1,11 +1,16 @@
+
- {(const char *)(& m_data[1]),s8}
- ""
+ ""
+ {(const char *)(m_data + 1),s8}
+ (const char *)(m_data + 1),s8
- - m_data
- - (const char *)(& m_data[1])
+ - m_data == 0 ? 0 : (int)strnlen((const char *)(m_data + 1), m_data->m_numCharsAllocated)
+ - (int)m_data->m_numCharsAllocated
+ - (int)m_data->m_refCount
+ - (const char *)(m_data + 1),s8
-
\ No newline at end of file
+
diff --git a/resources/visualstudio/unicodestring.natvis b/resources/visualstudio/unicodestring.natvis
index 22aaf299cdc..a71be3c4ed9 100644
--- a/resources/visualstudio/unicodestring.natvis
+++ b/resources/visualstudio/unicodestring.natvis
@@ -1,11 +1,16 @@
+
- {(const wchar_t *)(& m_data[1]),su}
- ""
+ ""
+ {(const wchar_t *)(m_data + 1),su}
+ (const wchar_t *)(m_data + 1),su
- - m_data
- - (const wchar_t *)(& m_data[1])
+ - m_data == 0 ? 0 : (int)wcsnlen((const wchar_t *)(m_data + 1), m_data->m_numCharsAllocated)
+ - (int)m_data->m_numCharsAllocated
+ - (int)m_data->m_refCount
+ - (const wchar_t *)(m_data + 1),su
-
\ No newline at end of file
+
diff --git a/resources/visualstudio/wwlib/hash.natvis b/resources/visualstudio/wwlib/hash.natvis
new file mode 100644
index 00000000000..d31c64f960a
--- /dev/null
+++ b/resources/visualstudio/wwlib/hash.natvis
@@ -0,0 +1,36 @@
+
+
+
+
+ {{ buckets={HashTableSize} }}
+
+ - HashTableSize
+
+
+
+
+
+ entry = HashTable[bucket]
+
+
+ - entry
+ entry = entry->NextHash
+
+ bucket = bucket + 1
+
+
+
+
+
+
+ {{ done }}
+ {*CurrentEntry}
+
+ - CurrentEntry
+ - NextEntry
+ - Index
+ - Table
+
+
+
diff --git a/resources/visualstudio/wwlib/hashtemplate.natvis b/resources/visualstudio/wwlib/hashtemplate.natvis
new file mode 100644
index 00000000000..dbf81cc1d50
--- /dev/null
+++ b/resources/visualstudio/wwlib/hashtemplate.natvis
@@ -0,0 +1,36 @@
+
+
+
+
+ {{ buckets={(int)Size} }}
+
+ - (int)Size
+
+
+
+
+
+ handle = Hash[bucket]
+
+
+ - Table[handle].Value
+ handle = Table[handle].Next
+
+ bucket = bucket + 1
+
+
+
+
+
+
+ {{ done }}
+ {HashTable.Table[Handle].Value}
+
+ - HashTable.Table[Handle].Key
+ - HashTable.Table[Handle].Value
+ - HashIndex
+ - HashTable
+
+
+
diff --git a/resources/visualstudio/wwlib/listnode.natvis b/resources/visualstudio/wwlib/listnode.natvis
new file mode 100644
index 00000000000..dc33d3d54e2
--- /dev/null
+++ b/resources/visualstudio/wwlib/listnode.natvis
@@ -0,0 +1,64 @@
+
+
+
+
+ {{ size=0 }}
+ {{ GenericList }}
+
+
+
+
+
+ - node
+ node = node->NextNode
+
+
+
+
+
+
+
+ {{ size=0 }}
+ {{ List }}
+
+
+
+
+
+ - ($T1)node
+ node = node->NextNode
+
+
+
+
+
+
+ {{ unlinked }}
+ {{ GenericNode }}
+
+ - NextNode
+ - PrevNode
+
+
+
+
+ {{ unlinked }}
+ {{ Node }}
+
+ - ($T1)NextNode
+ - ($T1)PrevNode
+
+
+
+
+ {Value}
+
+ - Value
+ - (DataNode<$T1> *)NextNode
+ - (DataNode<$T1> *)PrevNode
+
+
+
diff --git a/resources/visualstudio/wwlib/mpsc_intrusive_queue.natvis b/resources/visualstudio/wwlib/mpsc_intrusive_queue.natvis
new file mode 100644
index 00000000000..543f35d07ff
--- /dev/null
+++ b/resources/visualstudio/wwlib/mpsc_intrusive_queue.natvis
@@ -0,0 +1,19 @@
+
+
+
+
+ {{ empty }}
+ {{ MPSCIntrusiveQueue }}
+
+
+
+
+
+ - node
+ node = node->next
+
+
+
+
+
diff --git a/resources/visualstudio/wwlib/multilist.natvis b/resources/visualstudio/wwlib/multilist.natvis
new file mode 100644
index 00000000000..22e9d604af9
--- /dev/null
+++ b/resources/visualstudio/wwlib/multilist.natvis
@@ -0,0 +1,103 @@
+
+
+
+
+ {{ size=0 }}
+ {{ GenericMultiList }}
+
+
+
+
+
+ - node->Object
+ node = node->Next
+
+
+
+
+
+
+
+ {{ size=0 }}
+ {{ MultiList }}
+
+
+
+
+
+ - ($T1 *)node->Object
+ node = node->Next
+
+
+
+
+
+
+ {{ size=0 }}
+ {{ RefMultiList }}
+
+
+
+
+
+ - ($T1 *)node->Object
+ node = node->Next
+
+
+
+
+
+
+
+ {{ not in any list }}
+ {{ in list(s) }}
+
+
+ lists this object belongs to
+
+
+
+
+
+ - node->List
+ node = node->NextList
+
+
+
+
+
+
+
+
+ {{ object={Object} }}
+
+ - Object
+ - List
+ - Next
+ - Prev
+ - NextList
+
+
+
+
+ {{ done }}
+ {CurNode->Object}
+
+ - CurNode->Object
+ - List
+
+
+
+
+
+
+ {{ done }}
+ {*($T1 *)CurNode->Object}
+
+ - ($T1 *)CurNode->Object
+ - List
+
+
+
diff --git a/resources/visualstudio/wwlib/sharebuf.natvis b/resources/visualstudio/wwlib/sharebuf.natvis
new file mode 100644
index 00000000000..ed69a353423
--- /dev/null
+++ b/resources/visualstudio/wwlib/sharebuf.natvis
@@ -0,0 +1,16 @@
+
+
+
+ {{ size={Count} }}
+
+ - Count
+ - NumRefs
+
+ - Msg,s
+
+ Count
+ Array
+
+
+
+
diff --git a/resources/visualstudio/wwlib/simplevec.natvis b/resources/visualstudio/wwlib/simplevec.natvis
new file mode 100644
index 00000000000..8d46ec4fc69
--- /dev/null
+++ b/resources/visualstudio/wwlib/simplevec.natvis
@@ -0,0 +1,27 @@
+
+
+
+ {{ size={VectorMax} }}
+
+ - VectorMax
+
+ VectorMax
+ Vector
+
+
+
+
+
+
+ {{ size={ActiveCount} }}
+
+ - ActiveCount
+ - VectorMax
+
+ ActiveCount
+ Vector
+
+
+
+
diff --git a/resources/visualstudio/wwlib/slist.natvis b/resources/visualstudio/wwlib/slist.natvis
new file mode 100644
index 00000000000..f7f26038b3e
--- /dev/null
+++ b/resources/visualstudio/wwlib/slist.natvis
@@ -0,0 +1,27 @@
+
+
+
+
+ {{ size=0 }}
+ {{ SList }}
+
+
+
+
+
+ - ($T1 *)node->NodeData
+ node = (SLNode<$T1> *)node->NodeNext
+
+
+
+
+
+
+ {*($T1 *)NodeData}
+
+ - ($T1 *)NodeData
+ - (SLNode<$T1> *)NodeNext
+
+
+
diff --git a/resources/visualstudio/wwlib/uarray.natvis b/resources/visualstudio/wwlib/uarray.natvis
new file mode 100644
index 00000000000..93a7368af86
--- /dev/null
+++ b/resources/visualstudio/wwlib/uarray.natvis
@@ -0,0 +1,17 @@
+
+
+
+
+ {{ size={UniqueItems.ActiveCount} }}
+
+ - UniqueItems.ActiveCount
+ - UniqueItems.VectorMax
+ - HashTableSize
+
+ UniqueItems.ActiveCount
+ UniqueItems.Vector[$i].Item
+
+
+
+
diff --git a/resources/visualstudio/wwlib/vector.natvis b/resources/visualstudio/wwlib/vector.natvis
new file mode 100644
index 00000000000..af37c172136
--- /dev/null
+++ b/resources/visualstudio/wwlib/vector.natvis
@@ -0,0 +1,44 @@
+
+
+
+ {{ size={VectorMax} }}
+
+ - VectorMax
+ - IsAllocated
+
+ VectorMax
+ Vector
+
+
+
+
+
+
+ {{ size={ActiveCount} }}
+
+ - ActiveCount
+ - VectorMax
+ - GrowthStep
+
+ ActiveCount
+ Vector
+
+
+
+
+
+
+ {{ size={BitCount} }}
+
+ - BitCount
+ - LastIndex
+ - Copy
+
+ BitCount
+ $i == LastIndex ? Copy : (bool)((BitArray.Vector[$i / 8] >> ($i % 8)) & 1)
+
+
+
+
diff --git a/resources/visualstudio/wwlib/widestring.natvis b/resources/visualstudio/wwlib/widestring.natvis
new file mode 100644
index 00000000000..815f6c61fab
--- /dev/null
+++ b/resources/visualstudio/wwlib/widestring.natvis
@@ -0,0 +1,18 @@
+
+
+
+
+ {m_Buffer,su}
+ m_Buffer,su
+
+ - ((int *)m_Buffer)[-1] != 0 ? ((int *)m_Buffer)[-1] : (int)wcsnlen(m_Buffer, ((int *)m_Buffer)[-2])
+ - ((int *)m_Buffer)[-2]
+ - m_Buffer,su
+ - m_Buffer
+
+
+
diff --git a/resources/visualstudio/wwlib/wwstring.natvis b/resources/visualstudio/wwlib/wwstring.natvis
new file mode 100644
index 00000000000..9a4a1118879
--- /dev/null
+++ b/resources/visualstudio/wwlib/wwstring.natvis
@@ -0,0 +1,18 @@
+
+
+
+
+ {m_Buffer,s}
+ m_Buffer,s
+
+ - ((int *)m_Buffer)[-1] != 0 ? ((int *)m_Buffer)[-1] : (int)strnlen(m_Buffer, ((int *)m_Buffer)[-2])
+ - ((int *)m_Buffer)[-2]
+ - m_Buffer,s
+ - m_Buffer
+
+
+