Index: libopenmpt/bindings/freebasic/libopenmpt.bi
===================================================================
--- libopenmpt/bindings/freebasic/libopenmpt.bi	(revision 21858)
+++ libopenmpt/bindings/freebasic/libopenmpt.bi	(working copy)
@@ -1273,6 +1273,20 @@
 '/
 Declare Function openmpt_module_get_order_pattern(ByVal module As openmpt_module Ptr, ByVal order As Long) As Long
 
+/'* \brief Get skip ("+++") pattern index
+
+  \param module The module handle to work on.
+  \return The pattern index that represents skip items in the order list. During playback, this order list item is ignored and playback resumes at the next order list item.
+'/
+Declare Function openmpt_module_get_skip_pattern_num(ByVal module As openmpt_module Ptr) As Long
+
+/'* \brief Get stop("---") pattern index
+
+  \param module The module handle to work on.
+  \return The pattern index that represents stop items in the order list. When this order list item is reached, playback continues at the restart position of the current subsong.
+'/
+Declare Function openmpt_module_get_stop_pattern_num(ByVal module As openmpt_module Ptr) As Long
+
 /'* \brief Get the number of rows in a pattern
 
   \param module The module handle to work on.
Index: libopenmpt/libopenmpt.h
===================================================================
--- libopenmpt/libopenmpt.h	(revision 21858)
+++ libopenmpt/libopenmpt.h	(working copy)
@@ -1330,6 +1330,18 @@
  * \return The pattern index found at the given order position of the current sequence.
  */
 LIBOPENMPT_API int32_t openmpt_module_get_order_pattern( openmpt_module * mod, int32_t order );
+/*! \brief Get skip ("+++") pattern index
+ *
+ * \param mod The module handle to work on.
+ * \return The pattern index that represents skip items in the order list. During playback, this order list item is ignored and playback resumes at the next order list item.
+ */
+LIBOPENMPT_API int32_t openmpt_module_get_skip_pattern_num( openmpt_module * mod );
+/*! \brief Get stop("---") pattern index
+ *
+ * \param mod The module handle to work on.
+ * \return The pattern index that represents stop items in the order list. When this order list item is reached, playback continues at the restart position of the current subsong.
+ */
+LIBOPENMPT_API int32_t openmpt_module_get_stop_pattern_num( openmpt_module * mod );
 /*! \brief Get the number of rows in a pattern
  *
  * \param mod The module handle to work on.
Index: libopenmpt/libopenmpt.hpp
===================================================================
--- libopenmpt/libopenmpt.hpp	(revision 21858)
+++ libopenmpt/libopenmpt.hpp	(working copy)
@@ -989,6 +989,18 @@
 	*/
 	LIBOPENMPT_CXX_API_MEMBER std::int32_t get_order_pattern( std::int32_t order ) const;
 
+	//! Get skip ("+++") pattern index
+	/*!
+	  \return The pattern index that represents skip items in the order list. During playback, this order list item is ignored and playback resumes at the next order list item.
+	*/
+	LIBOPENMPT_CXX_API_MEMBER std::int32_t get_skip_pattern_num() const;
+
+	//! Get stop ("---") pattern index
+	/*!
+	  \return The pattern index that represents stop items in the order list. When this order list item is reached, playback continues at the restart position of the current subsong.
+	*/
+	LIBOPENMPT_CXX_API_MEMBER std::int32_t get_stop_pattern_num() const;
+
 	//! Get the number of rows in a pattern
 	/*!
 	  \param pattern The pattern whose row count should be retrieved.
Index: libopenmpt/libopenmpt_c.cpp
===================================================================
--- libopenmpt/libopenmpt_c.cpp	(revision 21858)
+++ libopenmpt/libopenmpt_c.cpp	(working copy)
@@ -1225,6 +1225,26 @@
 	return 0;
 }
 
+int32_t openmpt_module_get_skip_pattern_num( openmpt_module * mod ) {
+	try {
+		openmpt::interface::check_soundfile( mod );
+		return mod->impl->get_skip_pattern_num();
+	} catch ( ... ) {
+		openmpt::report_exception( __func__, mod );
+	}
+	return 0;
+}
+
+int32_t openmpt_module_get_stop_pattern_num( openmpt_module * mod ) {
+	try {
+		openmpt::interface::check_soundfile( mod );
+		return mod->impl->get_stop_pattern_num();
+	} catch ( ... ) {
+		openmpt::report_exception( __func__, mod );
+	}
+	return 0;
+}
+
 int32_t openmpt_module_get_pattern_num_rows( openmpt_module * mod, int32_t pattern ) {
 	try {
 		openmpt::interface::check_soundfile( mod );
Index: libopenmpt/libopenmpt_cxx.cpp
===================================================================
--- libopenmpt/libopenmpt_cxx.cpp	(revision 21858)
+++ libopenmpt/libopenmpt_cxx.cpp	(working copy)
@@ -389,6 +389,12 @@
 std::int32_t module::get_order_pattern( std::int32_t order ) const {
 	return impl->get_order_pattern( order );
 }
+std::int32_t module::get_skip_pattern_num() const {
+	return module_impl::get_skip_pattern_num();
+}
+std::int32_t module::get_stop_pattern_num() const {
+	return module_impl::get_stop_pattern_num();
+}
 std::int32_t module::get_pattern_num_rows( std::int32_t pattern ) const {
 	return impl->get_pattern_num_rows( pattern );
 }
Index: libopenmpt/libopenmpt_impl.cpp
===================================================================
--- libopenmpt/libopenmpt_impl.cpp	(revision 21858)
+++ libopenmpt/libopenmpt_impl.cpp	(working copy)
@@ -1457,6 +1457,12 @@
 	}
 	return m_sndFile->Order()[o];
 }
+std::int32_t module_impl::get_skip_pattern_num() {
+	return OpenMPT::PATTERNINDEX_SKIP;
+}
+std::int32_t module_impl::get_stop_pattern_num() {
+	return OpenMPT::PATTERNINDEX_INVALID;
+}
 std::int32_t module_impl::get_pattern_num_rows( std::int32_t p ) const {
 	if ( !mpt::is_in_range( p, std::numeric_limits<OpenMPT::PATTERNINDEX>::min(), std::numeric_limits<OpenMPT::PATTERNINDEX>::max() ) || !m_sndFile->Patterns.IsValidPat( static_cast<OpenMPT::PATTERNINDEX>( p ) ) ) {
 		return 0;
Index: libopenmpt/libopenmpt_impl.hpp
===================================================================
--- libopenmpt/libopenmpt_impl.hpp	(revision 21858)
+++ libopenmpt/libopenmpt_impl.hpp	(working copy)
@@ -244,6 +244,8 @@
 	std::vector<std::string> get_instrument_names() const;
 	std::vector<std::string> get_sample_names() const;
 	std::int32_t get_order_pattern( std::int32_t o ) const;
+	static std::int32_t get_skip_pattern_num();
+	static std::int32_t get_stop_pattern_num();
 	std::int32_t get_pattern_num_rows( std::int32_t p ) const;
 	std::uint8_t get_pattern_row_channel_command( std::int32_t p, std::int32_t r, std::int32_t c, int cmd ) const;
 	std::string format_pattern_row_channel_command( std::int32_t p, std::int32_t r, std::int32_t c, int cmd ) const;
