diff --git a/core/fxcrt/bytestring.cpp b/core/fxcrt/bytestring.cpp
index 4516f81..9b8f539 100644
--- a/core/fxcrt/bytestring.cpp
+++ b/core/fxcrt/bytestring.cpp
@@ -332,48 +332,6 @@
   m_pData->m_String[index] = c;
 }
 
-std::optional<size_t> ByteString::Find(char ch, size_t start) const {
-  if (!m_pData)
-    return std::nullopt;
-
-  if (!IsValidIndex(start))
-    return std::nullopt;
-
-  const char* pStr = static_cast<const char*>(FXSYS_memchr(
-      m_pData->m_String + start, ch, m_pData->m_nDataLength - start));
-  return pStr ? std::optional<size_t>(
-                    static_cast<size_t>(pStr - m_pData->m_String))
-              : std::nullopt;
-}
-
-std::optional<size_t> ByteString::Find(ByteStringView subStr,
-                                       size_t start) const {
-  if (!m_pData) {
-    return std::nullopt;
-  }
-  if (!IsValidIndex(start)) {
-    return std::nullopt;
-  }
-  std::optional<size_t> result =
-      spanpos(m_pData->span().subspan(start), subStr.span());
-  if (!result.has_value()) {
-    return std::nullopt;
-  }
-  return start + result.value();
-}
-
-std::optional<size_t> ByteString::ReverseFind(char ch) const {
-  if (!m_pData)
-    return std::nullopt;
-
-  size_t nLength = m_pData->m_nDataLength;
-  while (nLength--) {
-    if (m_pData->m_String[nLength] == ch)
-      return nLength;
-  }
-  return std::nullopt;
-}
-
 void ByteString::MakeLower() {
   if (IsEmpty())
     return;
diff --git a/core/fxcrt/bytestring.h b/core/fxcrt/bytestring.h
index 20de629..98d1019 100644
--- a/core/fxcrt/bytestring.h
+++ b/core/fxcrt/bytestring.h
@@ -109,18 +109,6 @@
   ByteString First(size_t count) const;
   ByteString Last(size_t count) const;
 
-  std::optional<size_t> Find(ByteStringView subStr, size_t start = 0) const;
-  std::optional<size_t> Find(char ch, size_t start = 0) const;
-  std::optional<size_t> ReverseFind(char ch) const;
-
-  bool Contains(ByteStringView lpszSub, size_t start = 0) const {
-    return Find(lpszSub, start).has_value();
-  }
-
-  bool Contains(char ch, size_t start = 0) const {
-    return Find(ch, start).has_value();
-  }
-
   void MakeLower();
   void MakeUpper();
 
diff --git a/core/fxcrt/string_template.cpp b/core/fxcrt/string_template.cpp
index 8eb95cf..9ec367b 100644
--- a/core/fxcrt/string_template.cpp
+++ b/core/fxcrt/string_template.cpp
@@ -139,6 +139,42 @@
 }
 
 template <typename T>
+std::optional<size_t> StringTemplate<T>::Find(T ch, size_t start) const {
+  return Find(StringView(ch), start);
+}
+
+template <typename T>
+std::optional<size_t> StringTemplate<T>::Find(StringView str,
+                                              size_t start) const {
+  if (!m_pData) {
+    return std::nullopt;
+  }
+  if (!IsValidIndex(start)) {
+    return std::nullopt;
+  }
+  std::optional<size_t> result =
+      spanpos(m_pData->span().subspan(start), str.span());
+  if (!result.has_value()) {
+    return std::nullopt;
+  }
+  return start + result.value();
+}
+
+template <typename T>
+std::optional<size_t> StringTemplate<T>::ReverseFind(T ch) const {
+  if (!m_pData) {
+    return std::nullopt;
+  }
+  size_t nLength = m_pData->m_nDataLength;
+  while (nLength--) {
+    if (m_pData->m_String[nLength] == ch) {
+      return nLength;
+    }
+  }
+  return std::nullopt;
+}
+
+template <typename T>
 void StringTemplate<T>::ReallocBeforeWrite(size_t nNewLength) {
   if (m_pData && m_pData->CanOperateInPlace(nNewLength)) {
     return;
@@ -147,7 +183,6 @@
     clear();
     return;
   }
-
   RetainPtr<StringData> pNewData = StringData::Create(nNewLength);
   if (m_pData) {
     size_t nCopyLength = std::min(m_pData->m_nDataLength, nNewLength);
diff --git a/core/fxcrt/string_template.h b/core/fxcrt/string_template.h
index 4df22ce..fd850ad 100644
--- a/core/fxcrt/string_template.h
+++ b/core/fxcrt/string_template.h
@@ -24,6 +24,7 @@
  public:
   using CharType = T;
   using UnsignedType = typename std::make_unsigned<CharType>::type;
+  using StringView = StringViewTemplate<T>;
   using const_iterator = T*;
   using const_reverse_iterator = std::reverse_iterator<const_iterator>;
 
@@ -37,11 +38,9 @@
                    : nullptr;
   }
 
-  // Explicit conversion to ByteStringView.
+  // Explicit conversion to StringView.
   // Note: Any subsequent modification of |this| will invalidate the result.
-  StringViewTemplate<CharType> AsStringView() const {
-    return StringViewTemplate<CharType>(raw_str(), GetLength());
-  }
+  StringView AsStringView() const { return StringView(raw_str(), GetLength()); }
 
   // Explicit conversion to span.
   // Note: Any subsequent modification of |this| will invalidate the result.
@@ -115,8 +114,19 @@
   // Returns size of the string following deletion.
   size_t Delete(size_t index, size_t count = 1);
 
+  // Returns the index within in the string when found.
+  std::optional<size_t> Find(StringView str, size_t start = 0) const;
+  std::optional<size_t> Find(T ch, size_t start = 0) const;
+  std::optional<size_t> ReverseFind(T ch) const;
+
+  bool Contains(StringView str, size_t start = 0) const {
+    return Find(str, start).has_value();
+  }
+  bool Contains(T ch, size_t start = 0) const {
+    return Find(ch, start).has_value();
+  }
+
  protected:
-  using StringView = StringViewTemplate<T>;
   using StringData = StringDataTemplate<T>;
 
   StringTemplate() = default;
diff --git a/core/fxcrt/widestring.cpp b/core/fxcrt/widestring.cpp
index cdbf47d..6f14a26 100644
--- a/core/fxcrt/widestring.cpp
+++ b/core/fxcrt/widestring.cpp
@@ -647,48 +647,6 @@
   return Substr(GetLength() - count, count);
 }
 
-std::optional<size_t> WideString::Find(wchar_t ch, size_t start) const {
-  if (!m_pData)
-    return std::nullopt;
-
-  if (!IsValidIndex(start))
-    return std::nullopt;
-
-  const wchar_t* pStr = FXSYS_wmemchr(m_pData->m_String + start, ch,
-                                      m_pData->m_nDataLength - start);
-  return pStr ? std::optional<size_t>(
-                    static_cast<size_t>(pStr - m_pData->m_String))
-              : std::nullopt;
-}
-
-std::optional<size_t> WideString::Find(WideStringView subStr,
-                                       size_t start) const {
-  if (!m_pData) {
-    return std::nullopt;
-  }
-  if (!IsValidIndex(start)) {
-    return std::nullopt;
-  }
-  std::optional<size_t> result =
-      spanpos(m_pData->span().subspan(start), subStr.span());
-  if (!result.has_value()) {
-    return std::nullopt;
-  }
-  return start + result.value();
-}
-
-std::optional<size_t> WideString::ReverseFind(wchar_t ch) const {
-  if (!m_pData)
-    return std::nullopt;
-
-  size_t nLength = m_pData->m_nDataLength;
-  while (nLength--) {
-    if (m_pData->m_String[nLength] == ch)
-      return nLength;
-  }
-  return std::nullopt;
-}
-
 void WideString::MakeLower() {
   if (IsEmpty())
     return;
diff --git a/core/fxcrt/widestring.h b/core/fxcrt/widestring.h
index 8c18b00..479e1be 100644
--- a/core/fxcrt/widestring.h
+++ b/core/fxcrt/widestring.h
@@ -135,18 +135,6 @@
 
   int GetInteger() const;
 
-  std::optional<size_t> Find(WideStringView subStr, size_t start = 0) const;
-  std::optional<size_t> Find(wchar_t ch, size_t start = 0) const;
-  std::optional<size_t> ReverseFind(wchar_t ch) const;
-
-  bool Contains(WideStringView lpszSub, size_t start = 0) const {
-    return Find(lpszSub, start).has_value();
-  }
-
-  bool Contains(char ch, size_t start = 0) const {
-    return Find(ch, start).has_value();
-  }
-
   size_t Replace(WideStringView pOld, WideStringView pNew);
 
   bool IsASCII() const { return AsStringView().IsASCII(); }
