diff --git a/include/odp/api/spec/crypto.h b/include/odp/api/spec/crypto.h
index 470cba05066f..fc2a3b8f0b97 100644
--- a/include/odp/api/spec/crypto.h
+++ b/include/odp/api/spec/crypto.h
@@ -39,11 +39,6 @@ extern "C" {
  */
 
 /**
- * @typedef odp_crypto_compl_t
-* Crypto API completion event (platform dependent).
-*/
-
-/**
  * Crypto API operation mode
  */
 typedef enum {
@@ -337,28 +332,6 @@ typedef struct odp_crypto_op_param_t {
 	/** User context */
 	void *ctx;
 
-	/** Input packet
-	 *
-	 *  Specifies the input packet for the crypto operation. When the
-	 *  'out_pkt' variable is set to ODP_PACKET_INVALID (indicating a new
-	 *  packet should be allocated for the resulting packet).
-	 */
-	odp_packet_t pkt;
-
-	/** Output packet
-	 *
-	 *  Both "in place" (the original packet 'pkt' is modified) and
-	 *  "copy" (the packet is replicated to a new packet which contains
-	 *  the modified data) modes are supported. The "in place" mode of
-	 *  operation is indicated by setting 'out_pkt' equal to 'pkt'.
-	 *  For the copy mode of operation, setting 'out_pkt' to a valid packet
-	 *  value indicates the caller wishes to specify the destination packet.
-	 *  Setting 'out_pkt' to ODP_PACKET_INVALID indicates the caller wishes
-	 *  the destination packet be allocated from the output pool specified
-	 *  during session creation.
-	 */
-	odp_packet_t out_pkt;
-
 	/** Override session IV pointer */
 	uint8_t *override_iv_ptr;
 
@@ -438,14 +411,14 @@ typedef enum {
 /**
  * Cryto API per packet operation completion status
  */
-typedef struct odp_crypto_compl_status {
+typedef struct odp_crypto_op_status {
 	/** Algorithm specific return code */
 	odp_crypto_alg_err_t alg_err;
 
 	/** Hardware specific return code */
 	odp_crypto_hw_err_t  hw_err;
 
-} odp_crypto_compl_status_t;
+} odp_crypto_op_status_t;
 
 /**
  * Crypto API operation result
@@ -457,14 +430,11 @@ typedef struct odp_crypto_op_result {
 	/** User context from request */
 	void *ctx;
 
-	/** Output packet */
-	odp_packet_t pkt;
-
 	/** Cipher status */
-	odp_crypto_compl_status_t cipher_status;
+	odp_crypto_op_status_t cipher_status;
 
 	/** Authentication status */
-	odp_crypto_compl_status_t auth_status;
+	odp_crypto_op_status_t auth_status;
 
 } odp_crypto_op_result_t;
 
@@ -609,61 +579,80 @@ int odp_crypto_session_create(odp_crypto_session_param_t *param,
 int odp_crypto_session_destroy(odp_crypto_session_t session);
 
 /**
- * Return crypto completion handle that is associated with event
+ * Return crypto processed packet that is associated with event
+ *
+ * Get packet handle to an crypto processed packet event. Event subtype must be
+ * ODP_EVENT_CRYPTO_PACKET. Crypto operation results can be examined with
+ * odp_crypto_result().
  *
  * Note: any invalid parameters will cause undefined behavior and may cause
  * the application to abort or crash.
  *
- * @param ev An event of type ODP_EVENT_CRYPTO_COMPL
+ * @param ev       Event handle
  *
- * @return crypto completion handle
+ * @return Packet handle
  */
-odp_crypto_compl_t odp_crypto_compl_from_event(odp_event_t ev);
+odp_packet_t odp_crypto_packet_from_event(odp_event_t ev);
 
 /**
- * Convert crypto completion handle to event handle
+ * Convert crypto packet handle to event
+ *
+ * The packet handle must be an output of an crypto operation.
  *
- * @param completion_event  Completion event to convert to generic event
+ * @param pkt      Packet handle from crypto operation
  *
  * @return Event handle
  */
-odp_event_t odp_crypto_compl_to_event(odp_crypto_compl_t completion_event);
+odp_event_t odp_crypto_packet_to_event(odp_packet_t pkt);
 
 /**
- * Release crypto completion event
+ * Crypto per packet operation
+ *
+ * Performs the SYNC cryptographic operations specified during session creation
+ * on the packet.
+ *
+ * @param pkt_in            Packet to be processed
+ * @param[in,out] pkt_out   Pointer to packet handle for resulting packets
+ * @param param             Operation parameters
  *
- * @param completion_event  Completion event we are done accessing
+ * @retval 0 on success
+ * @retval <0 on failure
  */
-void odp_crypto_compl_free(odp_crypto_compl_t completion_event);
+int odp_crypto_op(odp_packet_t pkt_in,
+		  odp_packet_t *pkt_out,
+		  odp_crypto_op_param_t *param);
 
 /**
  * Crypto per packet operation
  *
- * Performs the cryptographic operations specified during session creation
- * on the packet.  If the operation is performed synchronously, "posted"
- * will return FALSE and the result of the operation is immediately available.
- * If "posted" returns TRUE the result will be delivered via the completion
- * queue specified when the session was created.
+ * Performs the ASYNC cryptographic operations specified during session creation
+ * on the packet.
  *
+ * @param pkt_in            Packet to be processed
  * @param param             Operation parameters
- * @param posted            Pointer to return posted, TRUE for async operation
- * @param result            Results of operation (when posted returns FALSE)
  *
  * @retval 0 on success
  * @retval <0 on failure
  */
-int odp_crypto_operation(odp_crypto_op_param_t *param,
-			 odp_bool_t *posted,
-			 odp_crypto_op_result_t *result);
+int odp_crypto_op_enq(odp_packet_t pkt_in,
+		      odp_crypto_op_param_t *param);
 
 /**
- * Crypto per packet operation query result from completion event
+ * Get crypto operation results from an crypto processed packet
+ *
+ * Successful crypto operations of all types (SYNC and ASYNC) produce packets
+ * which contain crypto result metadata. This function copies the operation
+ * results from an crypto processed packet. Event subtype of this kind of
+ * packet is ODP_EVENT_PACKET_crypto. Results are undefined if a non-crypto
+ * processed packet is passed as input.
  *
- * @param completion_event  Event containing operation results
- * @param result            Pointer to result structure
+ * @param         packet  An crypto processed packet (ODP_EVENT_PACKET_CRYPTO)
+ * @param[out]    result  Pointer to operation result for output
+ *
+ * @retval  0     On success
+ * @retval <0     On failure
  */
-void odp_crypto_compl_result(odp_crypto_compl_t completion_event,
-			     odp_crypto_op_result_t *result);
+int odp_crypto_result(odp_crypto_op_result_t *result, odp_packet_t packet);
 
 /**
  * Get printable value for an odp_crypto_session_t
@@ -679,19 +668,6 @@ void odp_crypto_compl_result(odp_crypto_compl_t completion_event,
 uint64_t odp_crypto_session_to_u64(odp_crypto_session_t hdl);
 
 /**
- * Get printable value for an odp_crypto_compl_t
- *
- * @param hdl  odp_crypto_compl_t handle to be printed
- * @return     uint64_t value that can be used to print/display this
- *             handle
- *
- * @note This routine is intended to be used for diagnostic purposes
- * to enable applications to generate a printable value that represents
- * an odp_crypto_compl_t handle.
- */
-uint64_t odp_crypto_compl_to_u64(odp_crypto_compl_t hdl);
-
-/**
  * Initialize crypto session parameters
  *
  * Initialize an odp_crypto_session_param_t to its default values for
diff --git a/include/odp/api/spec/event.h b/include/odp/api/spec/event.h
index 2ad3ce84262f..bd30f06d7140 100644
--- a/include/odp/api/spec/event.h
+++ b/include/odp/api/spec/event.h
@@ -54,8 +54,6 @@ extern "C" {
  *       packet processing related metadata
  * - ODP_EVENT_TIMEOUT
  *     - Timeout event (odp_timeout_t) from a timer
- * - ODP_EVENT_CRYPTO_COMPL
- *     - Crypto completion event (odp_crypto_compl_t)
  * - ODP_EVENT_IPSEC_STATUS
  *     - IPSEC status update event (odp_ipsec_status_t)
  */
diff --git a/include/odp/arch/default/api/abi/crypto.h b/include/odp/arch/default/api/abi/crypto.h
index f0793a198a53..cc6249219ebf 100644
--- a/include/odp/arch/default/api/abi/crypto.h
+++ b/include/odp/arch/default/api/abi/crypto.h
@@ -23,7 +23,6 @@ typedef struct { char dummy; /**< @internal Dummy */ } _odp_abi_crypto_compl_t;
 #define ODP_CRYPTO_SESSION_INVALID (0xffffffffffffffffULL)
 
 typedef uint64_t  odp_crypto_session_t;
-typedef _odp_abi_crypto_compl_t *odp_crypto_compl_t;
 
 /**
  * @}
diff --git a/include/odp/arch/default/api/abi/event.h b/include/odp/arch/default/api/abi/event.h
index ab3c0f755836..57df8822a132 100644
--- a/include/odp/arch/default/api/abi/event.h
+++ b/include/odp/arch/default/api/abi/event.h
@@ -28,14 +28,14 @@ typedef enum odp_event_type_t {
 	ODP_EVENT_BUFFER       = 1,
 	ODP_EVENT_PACKET       = 2,
 	ODP_EVENT_TIMEOUT      = 3,
-	ODP_EVENT_CRYPTO_COMPL = 4,
-	ODP_EVENT_IPSEC_STATUS = 5
+	ODP_EVENT_IPSEC_STATUS = 4
 } odp_event_type_t;
 
 typedef enum odp_event_subtype_t {
 	ODP_EVENT_NO_SUBTYPE   = 0,
 	ODP_EVENT_PACKET_BASIC = 1,
-	ODP_EVENT_PACKET_IPSEC = 2
+	ODP_EVENT_PACKET_IPSEC = 2,
+	ODP_EVENT_PACKET_CRYPTO = 3
 } odp_event_subtype_t;
 
 /**
diff --git a/platform/linux-generic/include/odp/api/plat/crypto_types.h b/platform/linux-generic/include/odp/api/plat/crypto_types.h
index 2cc747eb2fde..eb24952c69fe 100644
--- a/platform/linux-generic/include/odp/api/plat/crypto_types.h
+++ b/platform/linux-generic/include/odp/api/plat/crypto_types.h
@@ -30,7 +30,6 @@ extern "C" {
 #define ODP_CRYPTO_SESSION_INVALID (0xffffffffffffffffULL)
 
 typedef uint64_t odp_crypto_session_t;
-typedef ODP_HANDLE_T(odp_crypto_compl_t);
 
 /**
  * @}
diff --git a/platform/linux-generic/include/odp/api/plat/event_types.h b/platform/linux-generic/include/odp/api/plat/event_types.h
index 5b3a07e3f793..2ef2346860dc 100644
--- a/platform/linux-generic/include/odp/api/plat/event_types.h
+++ b/platform/linux-generic/include/odp/api/plat/event_types.h
@@ -38,14 +38,14 @@ typedef enum odp_event_type_t {
 	ODP_EVENT_BUFFER       = 1,
 	ODP_EVENT_PACKET       = 2,
 	ODP_EVENT_TIMEOUT      = 3,
-	ODP_EVENT_CRYPTO_COMPL = 4,
-	ODP_EVENT_IPSEC_STATUS = 5
+	ODP_EVENT_IPSEC_STATUS = 4
 } odp_event_type_t;
 
 typedef enum odp_event_subtype_t {
 	ODP_EVENT_NO_SUBTYPE   = 0,
 	ODP_EVENT_PACKET_BASIC = 1,
-	ODP_EVENT_PACKET_IPSEC = 2
+	ODP_EVENT_PACKET_IPSEC = 2,
+	ODP_EVENT_PACKET_CRYPTO = 3
 } odp_event_subtype_t;
 
 /**
