diff --git a/src/Makefile.am b/src/Makefile.am
index ca6dc4d..a351fc8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -43,6 +43,8 @@
 	hb-ot-layout-gsubgpos-private.hh \
 	hb-ot-layout-gsub-private.hh \
 	hb-ot-layout-private.h \
+	hb-ot-shape.c \
+	hb-ot-shape-private.h \
 	hb-ot-tag.c \
 	$(NULL)
 HBHEADERS += \
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index 5e51800..cf4fc9d 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -377,6 +377,34 @@
   return FALSE;
 }
 
+hb_bool_t
+hb_ot_layout_table_choose_script (hb_face_t      *face,
+				  hb_tag_t        table_tag,
+				  const hb_tag_t *script_tags,
+				  unsigned int   *script_index)
+{
+  ASSERT_STATIC (NO_INDEX == HB_OT_LAYOUT_NO_SCRIPT_INDEX);
+  const GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+  while (*script_tags)
+  {
+    if (g.find_script_index (*script_tags, script_index))
+      return TRUE;
+    script_tags++;
+  }
+
+  /* try finding 'DFLT' */
+  if (g.find_script_index (HB_OT_TAG_DEFAULT_SCRIPT, script_index))
+    return FALSE;
+
+  /* try with 'dflt'; MS site has had typos and many fonts use it now :( */
+  if (g.find_script_index (HB_OT_TAG_DEFAULT_LANGUAGE, script_index))
+    return FALSE;
+
+  if (script_index) *script_index = HB_OT_LAYOUT_NO_SCRIPT_INDEX;
+  return FALSE;
+}
+
 unsigned int
 hb_ot_layout_table_get_feature_tags (hb_face_t    *face,
 				     hb_tag_t      table_tag,
diff --git a/src/hb-ot-layout.h b/src/hb-ot-layout.h
index 2935254..8edca8e 100644
--- a/src/hb-ot-layout.h
+++ b/src/hb-ot-layout.h
@@ -113,6 +113,13 @@
 				hb_tag_t      script_tag,
 				unsigned int *script_index);
 
+/* Like find_script, but takes zero-terminated array of scripts to test */
+hb_bool_t
+hb_ot_layout_table_choose_script (hb_face_t      *face,
+				  hb_tag_t        table_tag,
+				  const hb_tag_t *script_tags,
+				  unsigned int   *script_index);
+
 unsigned int
 hb_ot_layout_table_get_feature_tags (hb_face_t    *face,
 				     hb_tag_t      table_tag,
diff --git a/src/hb-ot-shape.c b/src/hb-ot-shape.c
new file mode 100644
index 0000000..92b3a77
--- /dev/null
+++ b/src/hb-ot-shape.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2009  Red Hat, Inc.
+ *
+ *  This is part of HarfBuzz, an OpenType Layout engine library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ */
+
+#include "hb-ot-shape-private.h"
+
+#include "hb-buffer-private.h"
+
+#include "hb-ot-layout.h"
+
+hb_tag_t default_features[] = {
+  /* GSUB */
+  HB_TAG('c','c','m','p'),
+  HB_TAG('l','o','c','l'),
+  HB_TAG('l','i','g','a'),
+  HB_TAG('c','l','i','g'),
+  /* GPOS */
+  HB_TAG('k','e','r','n'),
+  HB_TAG('m','a','r','k'),
+  HB_TAG('m','k','m','k'),
+};
+
+
+static void
+add_feature (hb_face_t    *face,
+	     hb_tag_t      table_tag,
+	     unsigned int  feature_index,
+	     unsigned int *lookups,
+	     unsigned int *num_lookups,
+	     unsigned int  room_lookups)
+{
+  unsigned int i = room_lookups - *num_lookups;
+  hb_ot_layout_feature_get_lookup_indexes (face, table_tag, feature_index, 0,
+					   &i,
+					   lookups + *num_lookups);
+  *num_lookups += i;
+}
+
+static int
+cmp_lookups (const void *p1, const void *p2)
+{
+  unsigned int a = * (const unsigned int *) p1;
+  unsigned int b = * (const unsigned int *) p2;
+
+  return a - b;
+}
+
+static void
+setup_lookups (hb_font_t    *font,
+	       hb_face_t    *face,
+	       hb_buffer_t  *buffer,
+	       hb_feature_t *features,
+	       unsigned int  num_features,
+	       hb_tag_t      table_tag,
+	       unsigned int *lookups,
+	       unsigned int *num_lookups)
+{
+  unsigned int i, j, script_index, language_index, feature_index, room_lookups;
+
+  room_lookups = *num_lookups;
+  *num_lookups = 0;
+
+  hb_ot_layout_table_choose_script (face, table_tag,
+				    hb_ot_tags_from_script (buffer->script),
+				    &script_index);
+  hb_ot_layout_script_find_language (face, table_tag, script_index,
+				     hb_ot_tag_from_language (buffer->language),
+				     &language_index);
+
+  if (hb_ot_layout_language_get_required_feature_index (face, table_tag, script_index, language_index,
+							&feature_index))
+    add_feature (face, table_tag, feature_index, lookups, num_lookups, room_lookups);
+
+  for (i = 0; i < ARRAY_LENGTH (default_features); i++)
+  {
+    if (hb_ot_layout_language_find_feature (face, table_tag, script_index, language_index,
+					    default_features[i],
+					    &feature_index))
+      add_feature (face, table_tag, feature_index, lookups, num_lookups, room_lookups);
+  }
+
+  qsort (lookups, *num_lookups, sizeof (lookups[0]), cmp_lookups);
+
+  if (*num_lookups)
+  {
+    for (i = 1, j = 0; i < *num_lookups; i++)
+      if (lookups[i] != lookups[j])
+	lookups[++j] = lookups[i];
+    lookups[j++] = lookups[i - 1];
+    *num_lookups = j;
+  }
+}
+
+
+gboolean
+_hb_ot_substitute_complex (hb_font_t    *font,
+			   hb_face_t    *face,
+			   hb_buffer_t  *buffer,
+			   hb_feature_t *features,
+			   unsigned int  num_features)
+{
+  unsigned int lookups[1000];
+  unsigned int num_lookups = ARRAY_LENGTH (lookups);
+  unsigned int i;
+
+  if (!hb_ot_layout_has_substitution (face))
+    return FALSE;
+
+  setup_lookups (font, face, buffer, features, num_features,
+		 HB_OT_TAG_GSUB,
+		 lookups, &num_lookups);
+
+  for (i = 0; i < num_lookups; i++)
+    hb_ot_layout_substitute_lookup (face, buffer, lookups[i], 0xFFFF);
+
+  return TRUE;
+}
+
+gboolean
+_hb_ot_position_complex (hb_font_t    *font,
+			 hb_face_t    *face,
+			 hb_buffer_t  *buffer,
+			 hb_feature_t *features,
+			 unsigned int  num_features)
+{
+  unsigned int lookups[1000];
+  unsigned int num_lookups = ARRAY_LENGTH (lookups);
+  unsigned int i;
+
+  if (!hb_ot_layout_has_positioning (face))
+    return FALSE;
+
+  setup_lookups (font, face, buffer, features, num_features,
+		 HB_OT_TAG_GPOS,
+		 lookups, &num_lookups);
+
+  for (i = 0; i < num_lookups; i++)
+    hb_ot_layout_position_lookup (font, face, buffer, lookups[i], 0xFFFF);
+
+  hb_ot_layout_position_finish (font, face, buffer);
+
+  return TRUE;
+}
diff --git a/src/hb-shape.c b/src/hb-shape.c
index 4def4c9..1819a85 100644
--- a/src/hb-shape.c
+++ b/src/hb-shape.c
@@ -30,6 +30,8 @@
 
 #include "hb-buffer-private.h"
 
+#include "hb-ot-shape-private.h"
+
 
 /* Prepare */
 
@@ -125,8 +127,7 @@
 		       hb_feature_t *features,
 		       unsigned int  num_features)
 {
-  /* TODO GSUB */
- return FALSE;
+  return _hb_ot_substitute_complex (font, face, buffer, features, num_features);
 }
 
 static void
@@ -169,8 +170,7 @@
 		     hb_feature_t *features,
 		     unsigned int  num_features)
 {
-  /* TODO GPOS */
-  return FALSE;
+  return _hb_ot_position_complex (font, face, buffer, features, num_features);
 }
 
 static void
