diff --git a/py/objstr.c b/py/objstr.c
index 61fda12a3f3573db8c611d10bdb19b7fc6b6cab9..323f3295758b7cebfb2088ee47f9b902fc3db91d 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -619,6 +619,17 @@ STATIC mp_obj_t str_startswith(uint n_args, const mp_obj_t *args) {
     return MP_BOOL(memcmp(str + index_val, prefix, prefix_len) == 0);
 }
 
+STATIC mp_obj_t str_endswith(uint n_args, const mp_obj_t *args) {
+    GET_STR_DATA_LEN(args[0], str, str_len);
+    GET_STR_DATA_LEN(args[1], suffix, suffix_len);
+    assert(n_args == 2);
+
+    if (suffix_len > str_len) {
+        return mp_const_false;
+    }
+    return MP_BOOL(memcmp(str + (str_len - suffix_len), suffix, suffix_len) == 0);
+}
+
 enum { LSTRIP, RSTRIP, STRIP };
 
 STATIC mp_obj_t str_uni_strip(int type, uint n_args, const mp_obj_t *args) {
@@ -1541,6 +1552,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(str_join_obj, str_join);
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_split_obj, 1, 3, str_split);
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_rsplit_obj, 1, 3, str_rsplit);
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_startswith_obj, 2, 3, str_startswith);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_endswith_obj, 2, 3, str_endswith);
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_strip_obj, 1, 2, str_strip);
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_lstrip_obj, 1, 2, str_lstrip);
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_rstrip_obj, 1, 2, str_rstrip);
@@ -1565,6 +1577,7 @@ STATIC const mp_map_elem_t str_locals_dict_table[] = {
     { MP_OBJ_NEW_QSTR(MP_QSTR_split), (mp_obj_t)&str_split_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_rsplit), (mp_obj_t)&str_rsplit_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_startswith), (mp_obj_t)&str_startswith_obj },
+    { MP_OBJ_NEW_QSTR(MP_QSTR_endswith), (mp_obj_t)&str_endswith_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_strip), (mp_obj_t)&str_strip_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_lstrip), (mp_obj_t)&str_lstrip_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_rstrip), (mp_obj_t)&str_rstrip_obj },
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index cffb64d5ef233c2d4f644a33163d52123c7ec8f9..1081d04410679a20c8c079e234abd179f419b153 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -239,6 +239,7 @@ Q(rindex)
 Q(split)
 Q(rsplit)
 Q(startswith)
+Q(endswith)
 Q(replace)
 Q(partition)
 Q(rpartition)
diff --git a/tests/basics/string_endswith.py b/tests/basics/string_endswith.py
new file mode 100644
index 0000000000000000000000000000000000000000..078ee6dba565ce1357d3c7d8234278f1956b06ce
--- /dev/null
+++ b/tests/basics/string_endswith.py
@@ -0,0 +1,11 @@
+print("foobar".endswith("bar"))
+print("foobar".endswith("baR"))
+print("foobar".endswith("bar1"))
+print("foobar".endswith("foobar"))
+print("foobar".endswith(""))
+
+#print("1foobar".startswith("foo", 1))
+#print("1foo".startswith("foo", 1))
+#print("1foo".startswith("1foo", 1))
+#print("1fo".startswith("foo", 1))
+#print("1fo".startswith("foo", 10))