diff --git a/src/core/browser_accessibility_qt.cpp b/src/core/browser_accessibility_qt.cpp
index 405bafb947c130f375be4496a76ca078abf7c956..b5cd26f2ff451eca647eb3908386f66a019df450 100644
--- a/src/core/browser_accessibility_qt.cpp
+++ b/src/core/browser_accessibility_qt.cpp
@@ -173,6 +173,22 @@ void *BrowserAccessibilityQt::interface_cast(QAccessible::InterfaceType type)
             return static_cast<QAccessibleValueInterface*>(this);
         break;
     }
+    case QAccessible::TableInterface: {
+        QAccessible::Role r = role();
+        if (r == QAccessible::Table ||
+            r == QAccessible::List ||
+            r == QAccessible::Tree)
+            return static_cast<QAccessibleTableInterface*>(this);
+        break;
+    }
+    case QAccessible::TableCellInterface: {
+        QAccessible::Role r = role();
+        if (r == QAccessible::Cell ||
+            r == QAccessible::ListItem ||
+            r == QAccessible::TreeItem)
+            return static_cast<QAccessibleTableCellInterface*>(this);
+        break;
+    }
     default:
         break;
     }
@@ -701,4 +717,184 @@ QVariant BrowserAccessibilityQt::minimumStepSize() const
     return QVariant();
 }
 
+QAccessibleInterface *BrowserAccessibilityQt::cellAt(int row, int column) const
+{
+    int columns = 0;
+    int rows = 0;
+    if (!GetIntAttribute(ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) ||
+        !GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows) ||
+        columns <= 0 ||
+        rows <= 0) {
+      return 0;
+    }
+
+    if (row < 0 || row >= rows || column < 0 || column >= columns)
+      return 0;
+
+    const std::vector<int32>& cell_ids = GetIntListAttribute(ui::AX_ATTR_CELL_IDS);
+    DCHECK_EQ(columns * rows, static_cast<int>(cell_ids.size()));
+
+    int cell_id = cell_ids[row * columns + column];
+    BrowserAccessibility* cell = manager()->GetFromID(cell_id);
+    if (cell) {
+      QAccessibleInterface *iface = static_cast<BrowserAccessibilityQt*>(cell);
+      return iface;
+    }
+
+    return 0;
+}
+
+QAccessibleInterface *BrowserAccessibilityQt::caption() const
+{
+    return 0;
+}
+
+QAccessibleInterface *BrowserAccessibilityQt::summary() const
+{
+    return 0;
+}
+
+QString BrowserAccessibilityQt::columnDescription(int column) const
+{
+    return QString();
+}
+
+QString BrowserAccessibilityQt::rowDescription(int row) const
+{
+    return QString();
+}
+
+int BrowserAccessibilityQt::columnCount() const
+{
+    int columns = 0;
+    if (GetIntAttribute(ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns))
+        return columns;
+
+    return 0;
+}
+
+int BrowserAccessibilityQt::rowCount() const
+{
+    int rows = 0;
+    if (GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows))
+      return rows;
+    return 0;
+}
+
+int BrowserAccessibilityQt::selectedCellCount() const
+{
+    return 0;
+}
+
+int BrowserAccessibilityQt::selectedColumnCount() const
+{
+    return 0;
+}
+
+int BrowserAccessibilityQt::selectedRowCount() const
+{
+    return 0;
+}
+
+QList<QAccessibleInterface *> BrowserAccessibilityQt::selectedCells() const
+{
+    return QList<QAccessibleInterface *>();
+}
+
+QList<int> BrowserAccessibilityQt::selectedColumns() const
+{
+    return QList<int>();
+}
+
+QList<int> BrowserAccessibilityQt::selectedRows() const
+{
+    return QList<int>();
+}
+
+bool BrowserAccessibilityQt::isColumnSelected(int /*column*/) const
+{
+    return false;
+}
+
+bool BrowserAccessibilityQt::isRowSelected(int /*row*/) const
+{
+    return false;
+}
+
+bool BrowserAccessibilityQt::selectRow(int /*row*/)
+{
+    return false;
+}
+
+bool BrowserAccessibilityQt::selectColumn(int /*column*/)
+{
+    return false;
+}
+
+bool BrowserAccessibilityQt::unselectRow(int /*row*/)
+{
+    return false;
+}
+
+bool BrowserAccessibilityQt::unselectColumn(int /*column*/)
+{
+    return false;
+}
+
+int BrowserAccessibilityQt::columnExtent() const
+{
+    return 1;
+}
+
+QList<QAccessibleInterface *> BrowserAccessibilityQt::columnHeaderCells() const
+{
+    return QList<QAccessibleInterface*>();
+}
+
+int BrowserAccessibilityQt::columnIndex() const
+{
+    int column = 0;
+    if (GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &column))
+      return column;
+    return 0;
+}
+
+int BrowserAccessibilityQt::rowExtent() const
+{
+    return 1;
+}
+
+QList<QAccessibleInterface *> BrowserAccessibilityQt::rowHeaderCells() const
+{
+    return QList<QAccessibleInterface*>();
+}
+
+int BrowserAccessibilityQt::rowIndex() const
+{
+    int row = 0;
+    if (GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &row))
+      return row;
+    return 0;
+}
+
+bool BrowserAccessibilityQt::isSelected() const
+{
+    return false;
+}
+
+QAccessibleInterface *BrowserAccessibilityQt::table() const
+{
+    BrowserAccessibility* find_table = GetParent();
+    while (find_table && find_table->GetRole() != ui::AX_ROLE_TABLE)
+        find_table = find_table->GetParent();
+    if (!find_table)
+        return 0;
+    return static_cast<BrowserAccessibilityQt*>(find_table);
+}
+
+void BrowserAccessibilityQt::modelChange(QAccessibleTableModelChangeEvent *)
+{
+
+}
+
 } // namespace content
diff --git a/src/core/browser_accessibility_qt.h b/src/core/browser_accessibility_qt.h
index 8dfffdcffbf8d013568ea4714af006234d5a974c..db190ffc4f271ce95f9a554970ab7b548f9269a3 100644
--- a/src/core/browser_accessibility_qt.h
+++ b/src/core/browser_accessibility_qt.h
@@ -48,6 +48,8 @@ class BrowserAccessibilityQt
     , public QAccessibleActionInterface
     , public QAccessibleTextInterface
     , public QAccessibleValueInterface
+    , public QAccessibleTableInterface
+    , public QAccessibleTableCellInterface
 {
 public:
     BrowserAccessibilityQt();
@@ -105,6 +107,40 @@ public:
     QVariant maximumValue() const Q_DECL_OVERRIDE;
     QVariant minimumValue() const Q_DECL_OVERRIDE;
     QVariant minimumStepSize() const Q_DECL_OVERRIDE;
+
+    // QAccessibleTableInterface
+    virtual QAccessibleInterface *cellAt(int row, int column) const Q_DECL_OVERRIDE;
+    virtual QAccessibleInterface *caption() const Q_DECL_OVERRIDE;
+    virtual QAccessibleInterface *summary() const Q_DECL_OVERRIDE;
+    virtual QString columnDescription(int column) const Q_DECL_OVERRIDE;
+    virtual QString rowDescription(int row) const Q_DECL_OVERRIDE;
+    virtual int columnCount() const Q_DECL_OVERRIDE;
+    virtual int rowCount() const Q_DECL_OVERRIDE;
+    // selection
+    virtual int selectedCellCount() const Q_DECL_OVERRIDE;
+    virtual int selectedColumnCount() const Q_DECL_OVERRIDE;
+    virtual int selectedRowCount() const Q_DECL_OVERRIDE;
+    virtual QList<QAccessibleInterface*> selectedCells() const Q_DECL_OVERRIDE;
+    virtual QList<int> selectedColumns() const Q_DECL_OVERRIDE;
+    virtual QList<int> selectedRows() const Q_DECL_OVERRIDE;
+    virtual bool isColumnSelected(int column) const Q_DECL_OVERRIDE;
+    virtual bool isRowSelected(int row) const Q_DECL_OVERRIDE;
+    virtual bool selectRow(int row) Q_DECL_OVERRIDE;
+    virtual bool selectColumn(int column) Q_DECL_OVERRIDE;
+    virtual bool unselectRow(int row) Q_DECL_OVERRIDE;
+    virtual bool unselectColumn(int column) Q_DECL_OVERRIDE;
+
+    // QAccessibleTableCellInterface
+    virtual int columnExtent() const Q_DECL_OVERRIDE;
+    virtual QList<QAccessibleInterface*> columnHeaderCells() const Q_DECL_OVERRIDE;
+    virtual int columnIndex() const Q_DECL_OVERRIDE;
+    virtual int rowExtent() const Q_DECL_OVERRIDE;
+    virtual QList<QAccessibleInterface*> rowHeaderCells() const Q_DECL_OVERRIDE;
+    virtual int rowIndex() const Q_DECL_OVERRIDE;
+    virtual bool isSelected() const Q_DECL_OVERRIDE;
+    virtual QAccessibleInterface* table() const Q_DECL_OVERRIDE;
+
+    virtual void modelChange(QAccessibleTableModelChangeEvent *event) Q_DECL_OVERRIDE;
 };
 
 }