diff --git a/py/objtuple.c b/py/objtuple.c
index 5f1744ea3027fa424d1385440b150a9e0b5d114d..da714e08a30a1abe5cf0909e33690327c4930120 100644
--- a/py/objtuple.c
+++ b/py/objtuple.c
@@ -1,3 +1,4 @@
+#include <string.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <assert.h>
@@ -87,7 +88,15 @@ static mp_obj_t tuple_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
     switch (op) {
         case RT_BINARY_OP_SUBSCR:
         {
-            // tuple load
+#if MICROPY_ENABLE_SLICE
+            if (MP_OBJ_IS_TYPE(rhs, &slice_type)) {
+                machine_uint_t start, stop;
+                assert(m_seq_get_fast_slice_indexes(o->len, rhs, &start, &stop));
+                mp_obj_tuple_t *res = mp_obj_new_tuple(stop - start, NULL);
+                m_seq_copy(res->items, o->items + start, res->len, mp_obj_t);
+                return res;
+            }
+#endif
             uint index = mp_get_index(o->base.type, o->len, rhs);
             return o->items[index];
         }
diff --git a/tests/basics/tuple1.py b/tests/basics/tuple1.py
new file mode 100644
index 0000000000000000000000000000000000000000..b64720b3ebcb0ee48350b7c938904b6aae444d86
--- /dev/null
+++ b/tests/basics/tuple1.py
@@ -0,0 +1,16 @@
+# basic tuple functionality
+x = (1, 2, 3 * 4)
+print(x)
+try:
+    x[0] = 4
+except TypeError:
+    print("TypeError")
+print(x)
+try:
+    x.append(5)
+except AttributeError:
+    print("AttributeError")
+
+print(x[1:])
+print(x[:-1])
+print(x[2:3])