diff --git a/cmake/modules/AddIPOptFlags.cmake b/cmake/modules/AddIPOptFlags.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..409279c3a04910677d2cf933a802a0d437d5fab2
--- /dev/null
+++ b/cmake/modules/AddIPOptFlags.cmake
@@ -0,0 +1,11 @@
+function(add_dune_ipopt_flags _targets)
+  if(IPOPT_FOUND)
+    cmake_parse_arguments(ADD_DUNE_IPOPT_FLAGS "OBJECT" "" "" ${ARGN})
+    foreach(_target ${_targets})
+      target_compile_options(${_target} PRIVATE ${DUNE_IPOPT_CFLAGS})
+      if(NOT ADD_DUNE_IPOPT_FLAGS_OBJECT)
+        target_link_libraries(${_target} ${IPOPT_LIBRARY})
+      endif()
+    endforeach(_target ${_targets})
+  endif(IPOPT_FOUND)
+endfunction(add_dune_ipopt_flags)
diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt
index 0aba9c378cfcf69f4295d29164ae91e7f1ba63a9..2b0a470f320795d99a045e20abba03ae4d82ab38 100644
--- a/cmake/modules/CMakeLists.txt
+++ b/cmake/modules/CMakeLists.txt
@@ -1,3 +1,5 @@
-set(modules "DuneSolversMacros.cmake")
-
-install(FILES ${modules} DESTINATION ${DUNE_INSTALL_MODULEDIR})
+install(FILES
+  DuneSolversMacros.cmake
+  FindIPOpt.cmake
+  AddIPOptFlags.cmake
+  DESTINATION ${DUNE_INSTALL_MODULEDIR})
diff --git a/cmake/modules/DuneSolversMacros.cmake b/cmake/modules/DuneSolversMacros.cmake
index 613dfb664b75999b008f0003a4d7c409cbf409ad..ebb7c580823c7cff4cd1b946fdf8e40da722c289 100644
--- a/cmake/modules/DuneSolversMacros.cmake
+++ b/cmake/modules/DuneSolversMacros.cmake
@@ -1 +1,3 @@
 # File for module specific CMake tests.
+find_package(IPOpt)
+include(AddIPOptFlags)
diff --git a/cmake/modules/FindIPOpt.cmake b/cmake/modules/FindIPOpt.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..777cc1c59bb82e84a9fe74400fb94544b647bc16
--- /dev/null
+++ b/cmake/modules/FindIPOpt.cmake
@@ -0,0 +1,14 @@
+find_package(PkgConfig REQUIRED)
+include(FindPackageHandleStandardArgs)
+
+pkg_check_modules(IPOPT ipopt)
+find_package_handle_standard_args(Ipopt DEFAULT_MSG IPOPT_FOUND)
+find_library(IPOPT_LIBRARY ipopt HINTS "${IPOPT_LIBDIR}")
+set(HAVE_IPOPT ENABLE_IPOPT)
+
+if(IPOPT_FOUND)
+  set(DUNE_IPOPT_CFLAGS ${IPOPT_CFLAGS} -DENABLE_IPOPT=1)
+  foreach(dir ${PSURFACE_INCLUDE_DIRS})
+    set_property(GLOBAL APPEND PROPERTY ALL_PKG_FLAGS "-I${dir}")
+  endforeach()
+endif(IPOPT_FOUND)