Index: Drawing/VGL/Inc/NsDrawing/VGLFontFace.h
===================================================================
--- Drawing/VGL/Inc/NsDrawing/VGLFontFace.h	(revision 12570)
+++ Drawing/VGL/Inc/NsDrawing/VGLFontFace.h	(working copy)
@@ -58,6 +58,7 @@
     uint32_t SpaceIndex() const { NS_ASSERT(mHandle); return mSpaceIndex; }
 
     ArrayRef<uint32_t> Palette() const { NS_ASSERT(mHandle); return mPalette; }
+    ArrayRef<UnicodeRange> Ranges() const { NS_ASSERT(mHandle); return mRanges; }
 
 private:
     void LoadInternal();
@@ -86,6 +87,7 @@
     float mEllipsisWidth;
 
     Vector<uint32_t> mPalette;
+    Vector<UnicodeRange> mRanges;
 };
 
 NS_WARNING_POP
Index: Drawing/VGL/Src/HarfBuzz.cpp
===================================================================
--- Drawing/VGL/Src/HarfBuzz.cpp	(revision 12570)
+++ Drawing/VGL/Src/HarfBuzz.cpp	(working copy)
@@ -224,12 +224,54 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
+static bool InRange(uint32_t ch, const UnicodeRange* ranges, uint32_t numRanges)
+{
+    for (uint32_t i = 0; i < numRanges; i++)
+    {
+        const UnicodeRange& r = ranges[i];
+
+        if (ch - r.fist <= r.size)
+        {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+static thread_local const UnicodeRange* gUnicodeRanges;
+static thread_local uint32_t gUnicodeRangesSize;
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+static hb_bool_t GetGlyphInRange(hb_font_t* font, void* data, hb_codepoint_t unicode,
+    hb_codepoint_t* glyph, void *user)
+{
+    uint32_t numRanges = gUnicodeRangesSize;
+
+    if (numRanges == 0 || InRange(unicode, gUnicodeRanges, numRanges))
+    {
+        return hb_ot_get_nominal_glyph(font, data, unicode, glyph, user);
+    }
+
+    return false;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
 void* HB::FontCreate(void* blob, uint32_t index)
 {
     NS_ASSERT(blob != nullptr);
     hb_face_t* face = hb_face_create((hb_blob_t*)blob, index);
-    hb_font_t* font = hb_font_create(face);
+    hb_font_t* parent = hb_font_create(face);
     hb_face_destroy(face);
+
+    hb_font_t* font = hb_font_create_sub_font(parent);
+    hb_font_destroy(parent);
+
+    hb_font_funcs_t* funcs = hb_font_funcs_create();
+    hb_font_funcs_set_nominal_glyph_func(funcs, GetGlyphInRange, nullptr, nullptr);
+    hb_font_set_funcs(font, funcs, &face->table, nullptr);
+    hb_font_funcs_destroy(funcs);
+
     return font;
 }
 
@@ -965,12 +1007,18 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
-void HB::Shape(void* font, void* buffer, const FontFeatures& features)
+void HB::Shape(void* font, void* buffer, const FontFeatures& features, const UnicodeRange* ranges,
+    uint32_t numRanges)
 {
     Vector<hb_feature_t, 16> v;
     FillFeatures(features, v);
 
+    gUnicodeRanges = ranges;
+    gUnicodeRangesSize = numRanges;
+
     hb_shape((hb_font_t*)font, (hb_buffer_t*)buffer, v.Data(), v.Size());
+
+    gUnicodeRangesSize = 0;
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
Index: Drawing/VGL/Src/HarfBuzz.h
===================================================================
--- Drawing/VGL/Src/HarfBuzz.h	(revision 12570)
+++ Drawing/VGL/Src/HarfBuzz.h	(working copy)
@@ -18,6 +18,7 @@
 
 class Stream;
 struct FontFeatures;
+struct UnicodeRange;
 enum FontWeight : int32_t;
 enum FontStyle : int32_t;
 enum FontStretch : int32_t;
@@ -76,7 +77,8 @@
         uint32_t offset, uint32_t length, uint32_t script, bool rtl, void* language);
     static void BufferDestroy(void* buffer);
 
-    static void Shape(void* font, void* buffer, const FontFeatures& features);
+    static void Shape(void* font, void* buffer, const FontFeatures& features,
+        const UnicodeRange* ranges, uint32_t numRanges);
 
     static uint32_t BufferGetGlyphCount(void* buffer);
     static void BufferGetGlyph(void* buffer, uint32_t index, uint32_t& glyph, uint32_t& cluster,
Index: Drawing/VGL/Src/ShapingFull.h
===================================================================
--- Drawing/VGL/Src/ShapingFull.h	(revision 12570)
+++ Drawing/VGL/Src/ShapingFull.h	(working copy)
@@ -541,10 +541,12 @@
 
     HB::BufferSetContent(buffer, chars, numChars, start, len, script, rtl, lang);
 
-    properties->faces[faceIndex]->Load();
-    void* font = properties->faces[faceIndex]->Handle();
-    HB::Shape(font, buffer, properties->features);
+    VGLFontFace* face = properties->faces[faceIndex];
+    face->Load();
 
+    ArrayRef<UnicodeRange> ranges = face->Ranges();
+    HB::Shape(face->Handle(), buffer, properties->features, ranges.Data(), ranges.Size());
+
     uint32_t numGlyphs = HB::BufferGetGlyphCount(buffer);
 
     // New glyphs replace the [replacePos, replacePos + replaceSize] range
Index: Drawing/VGL/Src/VGLFontFace.cpp
===================================================================
--- Drawing/VGL/Src/VGLFontFace.cpp	(revision 12570)
+++ Drawing/VGL/Src/VGLFontFace.cpp	(working copy)
@@ -59,6 +59,17 @@
 VGLFontFace::VGLFontFace(const char* uri, Stream* stream, uint32_t index):
     mUriHash(StrCaseHash(uri)), mStream(stream), mIndex(index), mHandle(0)
 {
+    //if (StrEquals(uri, "#Aero Matics"))
+    //{
+    //    {
+    //        UnicodeRange range{ 'H', 1 };
+    //        mRanges.PushBack(range);
+    //    }
+    //    {
+    //        UnicodeRange range{ 'e', 1 };
+    //        mRanges.PushBack(range);
+    //    }
+    //}
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
Index: Gui/Providers/Include/NsGui/FontProperties.h
===================================================================
--- Gui/Providers/Include/NsGui/FontProperties.h	(revision 12570)
+++ Gui/Providers/Include/NsGui/FontProperties.h	(working copy)
@@ -61,6 +61,12 @@
     FontStretch_UltraExpanded = 9
 };
 
+struct UnicodeRange
+{
+    uint32_t fist;
+    uint32_t size;
+};
+
 }
 
 NS_DECLARE_REFLECTION_ENUM_EXPORT(NS_GUI_PROVIDERS_API, Noesis::FontWeight)
