diff --git a/src/wrapper/wrap_cl.hpp b/src/wrapper/wrap_cl.hpp
index 17ae1a910f7d1bdce8827c481e21b48e8ff8d2d5..6f69d0f19f9849db2c6160c7b17b8492e27aa1da 100644
--- a/src/wrapper/wrap_cl.hpp
+++ b/src/wrapper/wrap_cl.hpp
@@ -1310,12 +1310,6 @@ namespace pyopencl
   }
 #endif
 
-  inline
-  memory_object *memory_object_from_int(intptr_t cl_mem_as_int)
-  {
-    return new memory_object((cl_mem) cl_mem_as_int, true);
-  }
-
   // }}}
 
   // {{{ buffer
@@ -3231,6 +3225,40 @@ namespace pyopencl
 
   // {{{ deferred implementation bits
 
+  inline py::object create_mem_object_wrapper(cl_mem mem)
+  {
+    cl_mem_object_type mem_obj_type;
+    PYOPENCL_CALL_GUARDED(clGetMemObjectInfo, \
+        (mem, CL_MEM_TYPE, sizeof(mem_obj_type), &mem_obj_type, 0));
+
+    switch (mem_obj_type)
+    {
+      case CL_MEM_OBJECT_BUFFER:
+        return py::object(handle_from_new_ptr(
+              new buffer(mem, /*retain*/ true)));
+      case CL_MEM_OBJECT_IMAGE2D:
+      case CL_MEM_OBJECT_IMAGE3D:
+#ifdef CL_VERSION_1_2
+      case CL_MEM_OBJECT_IMAGE2D_ARRAY:
+      case CL_MEM_OBJECT_IMAGE1D:
+      case CL_MEM_OBJECT_IMAGE1D_ARRAY:
+      case CL_MEM_OBJECT_IMAGE1D_BUFFER:
+#endif
+        return py::object(handle_from_new_ptr(
+              new image(mem, /*retain*/ true)));
+      default:
+        return py::object(handle_from_new_ptr(
+              new memory_object(mem, /*retain*/ true)));
+    }
+  }
+
+  inline
+  py::object memory_object_from_int(intptr_t cl_mem_as_int)
+  {
+    return create_mem_object_wrapper((cl_mem) cl_mem_as_int);
+  }
+
+
   inline
   py::object memory_object_holder::get_info(cl_mem_info param_name) const
   {
@@ -3270,23 +3298,7 @@ namespace pyopencl
             return py::object();
           }
 
-          cl_mem_object_type mem_obj_type;
-          PYOPENCL_CALL_GUARDED(clGetMemObjectInfo, \
-              (data(), CL_MEM_TYPE, sizeof(mem_obj_type), &mem_obj_type, 0));
-
-          switch (mem_obj_type)
-          {
-            case CL_MEM_OBJECT_BUFFER:
-              return py::object(handle_from_new_ptr(
-                    new buffer(param_value, /*retain*/ true)));
-            case CL_MEM_OBJECT_IMAGE2D:
-            case CL_MEM_OBJECT_IMAGE3D:
-              return py::object(handle_from_new_ptr(
-                    new image(param_value, /*retain*/ true)));
-            default:
-              return py::object(handle_from_new_ptr(
-                    new memory_object(param_value, /*retain*/ true)));
-          }
+          return create_mem_object_wrapper(param_value);
         }
       case CL_MEM_OFFSET:
         PYOPENCL_GET_INTEGRAL_INFO(MemObject, data(), param_name,
diff --git a/src/wrapper/wrap_cl_part_1.cpp b/src/wrapper/wrap_cl_part_1.cpp
index 48095b04e3bbcfda63d417eceedd57cb18276b22..eaa62ae65646d022ad664062f476590c42c76053 100644
--- a/src/wrapper/wrap_cl_part_1.cpp
+++ b/src/wrapper/wrap_cl_part_1.cpp
@@ -152,7 +152,6 @@ void pyopencl_expose_part_1()
       .add_property("obj_ptr", &cls::obj_ptr)
       .add_property("hostbuf", &cls::hostbuf)
       .def("from_cl_mem_as_int", memory_object_from_int,
-          py::return_value_policy<py::manage_new_object>(),
           py::args("cl_mem_as_int"))
       .staticmethod("from_cl_mem_as_int")
       ;