diff --git a/ovsdbapp/schema/open_vswitch/commands.py b/ovsdbapp/schema/open_vswitch/commands.py
index 0c9ab907..78ed03f7 100644
--- a/ovsdbapp/schema/open_vswitch/commands.py
+++ b/ovsdbapp/schema/open_vswitch/commands.py
@@ -163,31 +163,6 @@ class ListBridgesCommand(BaseCommand):
                        self.api._tables['Bridge'].rows.values()]
 
 
-class BrGetExternalIdCommand(BaseCommand):
-    def __init__(self, api, name, field):
-        super(BrGetExternalIdCommand, self).__init__(api)
-        self.name = name
-        self.field = field
-
-    def run_idl(self, txn):
-        br = idlutils.row_by_value(self.api.idl, 'Bridge', 'name', self.name)
-        self.result = br.external_ids[self.field]
-
-
-class BrSetExternalIdCommand(BaseCommand):
-    def __init__(self, api, name, field, value):
-        super(BrSetExternalIdCommand, self).__init__(api)
-        self.name = name
-        self.field = field
-        self.value = value
-
-    def run_idl(self, txn):
-        br = idlutils.row_by_value(self.api.idl, 'Bridge', 'name', self.name)
-        external_ids = getattr(br, 'external_ids', {})
-        external_ids[self.field] = self.value
-        br.external_ids = external_ids
-
-
 class SetControllerCommand(BaseCommand):
     def __init__(self, api, bridge, targets):
         super(SetControllerCommand, self).__init__(api)
@@ -367,3 +342,56 @@ class InterfaceToBridgeCommand(BaseCommand):
 
         bridges = self.api._tables['Bridge'].rows.values()
         self.result = next(br.name for br in bridges if pname in br.ports)
+
+
+class GetExternalIdCommand(BaseCommand):
+    def __init__(self, api, table, name, field):
+        super(GetExternalIdCommand, self).__init__(api)
+        self.table = table
+        self.name = name
+        self.field = field
+
+    def run_idl(self, txn):
+        row = idlutils.row_by_value(
+            self.api.idl, self.table, 'name', self.name)
+        self.result = row.external_ids[self.field]
+
+
+class SetExternalIdCommand(BaseCommand):
+    def __init__(self, api, table, name, field, value):
+        super(SetExternalIdCommand, self).__init__(api)
+        self.table = table
+        self.name = name
+        self.field = field
+        self.value = value
+
+    def run_idl(self, txn):
+        row = idlutils.row_by_value(
+            self.api.idl, self.table, 'name', self.name)
+        external_ids = getattr(row, 'external_ids', {})
+        external_ids[self.field] = self.value
+        row.external_ids = external_ids
+
+
+class BrGetExternalIdCommand(GetExternalIdCommand):
+    def __init__(self, api, name, field):
+        super(BrGetExternalIdCommand, self).__init__(
+            api, 'Bridge', name, field)
+
+
+class BrSetExternalIdCommand(SetExternalIdCommand):
+    def __init__(self, api, name, field, value):
+        super(BrSetExternalIdCommand, self).__init__(
+            api, 'Bridge', name, field, value)
+
+
+class IfaceGetExternalIdCommand(GetExternalIdCommand):
+    def __init__(self, api, name, field):
+        super(IfaceGetExternalIdCommand, self).__init__(
+            api, 'Interface', name, field)
+
+
+class IfaceSetExternalIdCommand(SetExternalIdCommand):
+    def __init__(self, api, name, field, value):
+        super(IfaceSetExternalIdCommand, self).__init__(
+            api, 'Interface', name, field, value)
diff --git a/ovsdbapp/schema/open_vswitch/impl_idl.py b/ovsdbapp/schema/open_vswitch/impl_idl.py
index df5113bc..afc90f2c 100644
--- a/ovsdbapp/schema/open_vswitch/impl_idl.py
+++ b/ovsdbapp/schema/open_vswitch/impl_idl.py
@@ -145,3 +145,9 @@ class OvsdbIdl(ovs_idl.Backend, api.API):
 
     def list_ifaces(self, bridge):
         return cmd.ListIfacesCommand(self, bridge)
+
+    def iface_get_external_id(self, name, field):
+        return cmd.IfaceGetExternalIdCommand(self, name, field)
+
+    def iface_set_external_id(self, name, field, value):
+        return cmd.IfaceSetExternalIdCommand(self, name, field, value)
diff --git a/ovsdbapp/tests/functional/schema/open_vswitch/test_impl_idl.py b/ovsdbapp/tests/functional/schema/open_vswitch/test_impl_idl.py
index a2706882..4c2f6f60 100644
--- a/ovsdbapp/tests/functional/schema/open_vswitch/test_impl_idl.py
+++ b/ovsdbapp/tests/functional/schema/open_vswitch/test_impl_idl.py
@@ -118,6 +118,26 @@ class TestOvsdbIdl(base.FunctionalTestCase):
         self.addCleanup(delattr, type(connection), '_is_running')
         self.assertFalse(connection.stop(1))
 
+    def test_br_external_id(self):
+        KEY = "foo"
+        VALUE = "bar"
+        self.api.add_br(self.brname).execute(check_error=True)
+        self.api.br_set_external_id(self.brname, KEY, VALUE).execute(
+            check_error=True)
+        external_id = self.api.br_get_external_id(self.brname, KEY).execute(
+            check_error=True)
+        self.assertEqual(VALUE, external_id)
+
+    def test_iface_external_id(self):
+        KEY = "foo"
+        VALUE = "bar"
+        self.api.add_br(self.brname).execute(check_error=True)
+        self.api.iface_set_external_id(self.brname, KEY, VALUE).execute(
+            check_error=True)
+        external_id = self.api.iface_get_external_id(self.brname, KEY).execute(
+            check_error=True)
+        self.assertEqual(VALUE, external_id)
+
 
 class ImplIdlTestCase(base.FunctionalTestCase):
     schemas = ['Open_vSwitch']