diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,16 @@
+## [0.2.0.0] - 2017-11-06
+
+- Support OpenCV-3.3.x
+
+### Changed
+
+- Added the GOTURN constructor to the OpenCV.Extra.Tracking.TrackerType datatype.
+- Specify the more accurate `pkgconfig-depends: opencv >= 3.0.0` so that Cabal
+  doesn't use the wrong version..
+- Specify the more accurate `setup-depends: Cabal >= 1.23` to prevent building
+  with unsupported Cabals.
+
+
 ## [0.1.0.0] - 2017-06-23
 
 ### Added
@@ -23,5 +36,6 @@
 - Initial version
 
 
+[0.2.0.0]: https://github.com/LumiGuide/haskell-opencv/compare/opencv-extra-0.1.0.0...opencv-extra-0.2.0.0
 [0.1.0.0]: https://github.com/LumiGuide/haskell-opencv/compare/opencv-extra-0.0.0.1...opencv-extra-0.1.0.0
 [0.0.0.1]: https://github.com/LumiGuide/haskell-opencv/compare/opencv-extra-0.0.0.0...opencv-extra-0.0.0.1
diff --git a/doc/generated/examples/bilateralFilterImg.png b/doc/generated/examples/bilateralFilterImg.png
new file mode 100644
Binary files /dev/null and b/doc/generated/examples/bilateralFilterImg.png differ
diff --git a/doc/generated/examples/boxBlurImg.png b/doc/generated/examples/boxBlurImg.png
Binary files a/doc/generated/examples/boxBlurImg.png and b/doc/generated/examples/boxBlurImg.png differ
diff --git a/doc/generated/examples/dctDenoisingImg.png b/doc/generated/examples/dctDenoisingImg.png
Binary files a/doc/generated/examples/dctDenoisingImg.png and b/doc/generated/examples/dctDenoisingImg.png differ
diff --git a/doc/generated/examples/decolorImg.png b/doc/generated/examples/decolorImg.png
Binary files a/doc/generated/examples/decolorImg.png and b/doc/generated/examples/decolorImg.png differ
diff --git a/doc/generated/examples/fastNlMeansDenoisingColoredImg.png b/doc/generated/examples/fastNlMeansDenoisingColoredImg.png
Binary files a/doc/generated/examples/fastNlMeansDenoisingColoredImg.png and b/doc/generated/examples/fastNlMeansDenoisingColoredImg.png differ
diff --git a/doc/generated/examples/fastNlMeansDenoisingColoredMultiImg.png b/doc/generated/examples/fastNlMeansDenoisingColoredMultiImg.png
Binary files a/doc/generated/examples/fastNlMeansDenoisingColoredMultiImg.png and b/doc/generated/examples/fastNlMeansDenoisingColoredMultiImg.png differ
diff --git a/doc/generated/examples/fbMatcherImg.png b/doc/generated/examples/fbMatcherImg.png
Binary files a/doc/generated/examples/fbMatcherImg.png and b/doc/generated/examples/fbMatcherImg.png differ
diff --git a/doc/generated/examples/fromJuicyImg.png b/doc/generated/examples/fromJuicyImg.png
deleted file mode 100644
Binary files a/doc/generated/examples/fromJuicyImg.png and /dev/null differ
diff --git a/doc/generated/examples/fromJuicyPixelsImg.png b/doc/generated/examples/fromJuicyPixelsImg.png
deleted file mode 100644
Binary files a/doc/generated/examples/fromJuicyPixelsImg.png and /dev/null differ
diff --git a/doc/generated/examples/matSubRectImg.png b/doc/generated/examples/matSubRectImg.png
Binary files a/doc/generated/examples/matSubRectImg.png and b/doc/generated/examples/matSubRectImg.png differ
diff --git a/doc/generated/examples/undistortImg.png b/doc/generated/examples/undistortImg.png
Binary files a/doc/generated/examples/undistortImg.png and b/doc/generated/examples/undistortImg.png differ
diff --git a/opencv-extra.cabal b/opencv-extra.cabal
--- a/opencv-extra.cabal
+++ b/opencv-extra.cabal
@@ -1,5 +1,5 @@
 name:          opencv-extra
-version:       0.1.0.0
+version:       0.2.0.0
 homepage:      https://github.com/LumiGuide/haskell-opencv
 bug-reports:   https://github.com/LumiGuide/haskell-opencv/issues
 license:       BSD3
@@ -43,7 +43,7 @@
     manual: True
 
 custom-setup
-    setup-depends: base, Cabal
+    setup-depends: base, Cabal >= 1.23
 
 library
     hs-source-dirs: src
@@ -110,7 +110,7 @@
         TypeOperators
 
     default-language:   Haskell2010
-    pkgconfig-depends:  opencv
+    pkgconfig-depends:  opencv >= 3.0.0
     extra-libraries:    stdc++
 
 test-suite doc-images-opencv-extra
diff --git a/src/OpenCV/Extra/ArUco.cpp b/src/OpenCV/Extra/ArUco.cpp
--- a/src/OpenCV/Extra/ArUco.cpp
+++ b/src/OpenCV/Extra/ArUco.cpp
@@ -197,24 +197,16 @@
 }
 
 extern "C" {
-int inline_c_OpenCV_Extra_ArUco_8_7ede7ba79559132935c117a79d32f29421fb5af7() {
-return ( DICT_7X7_1000 );
-}
-
-}
-
-extern "C" {
-Ptr_Dictionary * inline_c_OpenCV_Extra_ArUco_9_e043f809501b147d4172ef13477613254e4c1009(int cname_27_inline_c_0) {
+Ptr_Dictionary * inline_c_OpenCV_Extra_ArUco_8_873aa904229da5436ca09c0b615dd0371711b030(int32_t cname_27_inline_c_0) {
 
-    return
-      new Ptr<Dictionary>(getPredefinedDictionary(cname_27_inline_c_0));
+    return new Ptr<Dictionary>(getPredefinedDictionary(cname_27_inline_c_0));
   
 }
 
 }
 
 extern "C" {
-void inline_c_OpenCV_Extra_ArUco_10_1660ae62bf4004a4267ef43424eaa8c162afdea4(Mat * dstPtr_inline_c_0, Ptr_CharucoBoard * cboard_27_inline_c_1, int32_t w_inline_c_2, int32_t h_inline_c_3) {
+void inline_c_OpenCV_Extra_ArUco_9_1660ae62bf4004a4267ef43424eaa8c162afdea4(Mat * dstPtr_inline_c_0, Ptr_CharucoBoard * cboard_27_inline_c_1, int32_t w_inline_c_2, int32_t h_inline_c_3) {
 
           Mat & board = * dstPtr_inline_c_0;
           Ptr<CharucoBoard> & charucoBoard = *cboard_27_inline_c_1;
@@ -225,28 +217,28 @@
 }
 
 extern "C" {
-void inline_c_OpenCV_Extra_ArUco_11_26c5e19bfe16c79e7bf651cb378e30fd432cd99b(VectorVectorPoint2f * ptr_inline_c_0) {
+void inline_c_OpenCV_Extra_ArUco_10_26c5e19bfe16c79e7bf651cb378e30fd432cd99b(VectorVectorPoint2f * ptr_inline_c_0) {
  delete ptr_inline_c_0; 
 }
 
 }
 
 extern "C" {
-void inline_c_OpenCV_Extra_ArUco_12_86f8b8c429a70629e07c27698801886a0484dfef(VectorInt * ptr_inline_c_0) {
+void inline_c_OpenCV_Extra_ArUco_11_86f8b8c429a70629e07c27698801886a0484dfef(VectorInt * ptr_inline_c_0) {
  delete ptr_inline_c_0; 
 }
 
 }
 
 extern "C" {
-void inline_c_OpenCV_Extra_ArUco_13_a3285f65e0699baa139781baf5bb261b6fa6aa9d(Ptr_CharucoBoard * ptr_inline_c_0) {
+void inline_c_OpenCV_Extra_ArUco_12_a3285f65e0699baa139781baf5bb261b6fa6aa9d(Ptr_CharucoBoard * ptr_inline_c_0) {
  delete ptr_inline_c_0; 
 }
 
 }
 
 extern "C" {
-void inline_c_OpenCV_Extra_ArUco_14_35320368ab79414e41da235a390ce49c04ab0a5c(Ptr_Dictionary * ptr_inline_c_0) {
+void inline_c_OpenCV_Extra_ArUco_13_35320368ab79414e41da235a390ce49c04ab0a5c(Ptr_Dictionary * ptr_inline_c_0) {
  delete ptr_inline_c_0; 
 }
 
diff --git a/src/OpenCV/Extra/Tracking.cpp b/src/OpenCV/Extra/Tracking.cpp
--- a/src/OpenCV/Extra/Tracking.cpp
+++ b/src/OpenCV/Extra/Tracking.cpp
@@ -8,19 +8,50 @@
 using namespace cv;
 
 extern "C" {
-Ptr_Tracker * inline_c_OpenCV_Extra_Tracking_0_efe6eac7c3946190981535cdf313473c4fadfc96(const char * ctrackerType_27_inline_c_0) {
+Ptr_Tracker * inline_c_OpenCV_Extra_Tracking_0_d61a44f7af56478af6e1b7b7276b15457413504a() {
+return new cv::Ptr<cv::Tracker>(cv::TrackerBoosting::create());
+}
 
-      cv::Ptr<cv::Tracker> tacker =
-        cv::Tracker::create ( cv::String(ctrackerType_27_inline_c_0));
-      return new cv::Ptr<cv::Tracker>(tacker);
-    
 }
 
+extern "C" {
+Ptr_Tracker * inline_c_OpenCV_Extra_Tracking_1_ec9a58d1d4c955dfb999ecfaae06090f02522e49() {
+return new cv::Ptr<cv::Tracker>(cv::TrackerMIL::create());
 }
 
+}
+
 extern "C" {
-bool inline_c_OpenCV_Extra_Tracking_1_f5218c121fc0cacbb2549b312cc1a0f25f8d3052(Ptr_Tracker * trkPtr_inline_c_0, Mat * srcPtr_inline_c_1, Rect2d * rectPtr_inline_c_2) {
+Ptr_Tracker * inline_c_OpenCV_Extra_Tracking_2_ccc0a1b5d45e48fbad8058f237a1097d03f70b18() {
+return new cv::Ptr<cv::Tracker>(cv::TrackerKCF::create());
+}
 
+}
+
+extern "C" {
+Ptr_Tracker * inline_c_OpenCV_Extra_Tracking_3_6916cced60cb5e014eadd949778d98cf115ad4f2() {
+return new cv::Ptr<cv::Tracker>(cv::TrackerMedianFlow::create());
+}
+
+}
+
+extern "C" {
+Ptr_Tracker * inline_c_OpenCV_Extra_Tracking_4_47bd351f1f201d3a03c476c9dfcefd8693425578() {
+return new cv::Ptr<cv::Tracker>(cv::TrackerTLD::create());
+}
+
+}
+
+extern "C" {
+Ptr_Tracker * inline_c_OpenCV_Extra_Tracking_5_f0b42e78dc5245625e65a8bc9be96dd2ebfc99b3() {
+return new cv::Ptr<cv::Tracker>(cv::TrackerGOTURN::create());
+}
+
+}
+
+extern "C" {
+bool inline_c_OpenCV_Extra_Tracking_6_f5218c121fc0cacbb2549b312cc1a0f25f8d3052(Ptr_Tracker * trkPtr_inline_c_0, Mat * srcPtr_inline_c_1, Rect2d * rectPtr_inline_c_2) {
+
            return (*trkPtr_inline_c_0)->init
               ( *srcPtr_inline_c_1
               , *rectPtr_inline_c_2
@@ -31,7 +62,7 @@
 }
 
 extern "C" {
-bool inline_c_OpenCV_Extra_Tracking_2_cfa88d7e1596b908857073456e505f8a57bfd55f(Ptr_Tracker * trkPtr_inline_c_0, Mat * srcPtr_inline_c_1, Rect2d * rectPtr_inline_c_2) {
+bool inline_c_OpenCV_Extra_Tracking_7_cfa88d7e1596b908857073456e505f8a57bfd55f(Ptr_Tracker * trkPtr_inline_c_0, Mat * srcPtr_inline_c_1, Rect2d * rectPtr_inline_c_2) {
 
            return (*trkPtr_inline_c_0)->update
               ( *srcPtr_inline_c_1
@@ -43,30 +74,27 @@
 }
 
 extern "C" {
-Ptr_MultiTracker * inline_c_OpenCV_Extra_Tracking_3_f3a6cc587d88595f175227bf695c32d2015f0e8d(const char * ctrackerType_27_inline_c_0) {
+Ptr_MultiTracker * inline_c_OpenCV_Extra_Tracking_8_4549330adad92cb8c3cefe392252b1afd8277fec() {
 
-    cv::Ptr<cv::MultiTracker> mtracker =
-      new cv::MultiTracker ( cv::String(ctrackerType_27_inline_c_0));
-      return new cv::Ptr<cv::MultiTracker>(mtracker);
+      return new cv::Ptr<cv::MultiTracker>(new cv::MultiTracker ());
     
 }
 
 }
 
 extern "C" {
-Ptr_TrackerFeature * inline_c_OpenCV_Extra_Tracking_4_ccebdf6970bfcdb2823cf254bf81c506730c3f7f(const char * ctrackerFeatureType_27_inline_c_0) {
+Ptr_TrackerFeature * inline_c_OpenCV_Extra_Tracking_9_bb59c0632f05622a4df6cbb440d6ff7b3e503a96(const char * ctrackerFeatureType_27_inline_c_0) {
 
         cv::Ptr<cv::TrackerFeature> ftracker =
           cv::TrackerFeature::create ( cv::String(ctrackerFeatureType_27_inline_c_0));
           return new cv::Ptr<cv::TrackerFeature>(ftracker);
-
     
 }
 
 }
 
 extern "C" {
-void inline_c_OpenCV_Extra_Tracking_5_6622f23d9a44ed62d61cf22707e9d8ac3e4f2186(Ptr_MultiTrackerAlt * ptr_inline_c_0) {
+void inline_c_OpenCV_Extra_Tracking_10_6622f23d9a44ed62d61cf22707e9d8ac3e4f2186(Ptr_MultiTrackerAlt * ptr_inline_c_0) {
 
                   delete ptr_inline_c_0;
                 
@@ -75,7 +103,7 @@
 }
 
 extern "C" {
-void inline_c_OpenCV_Extra_Tracking_6_778deb976c698e950da3d4b45362d8b29a2c2547(Ptr_MultiTracker * ptr_inline_c_0) {
+void inline_c_OpenCV_Extra_Tracking_11_778deb976c698e950da3d4b45362d8b29a2c2547(Ptr_MultiTracker * ptr_inline_c_0) {
 
                   delete ptr_inline_c_0;
                 
@@ -84,7 +112,7 @@
 }
 
 extern "C" {
-void inline_c_OpenCV_Extra_Tracking_7_a535e1801086ce360682ac32352766b0a063504e(Ptr_TrackerFeature * ptr_inline_c_0) {
+void inline_c_OpenCV_Extra_Tracking_12_a535e1801086ce360682ac32352766b0a063504e(Ptr_TrackerFeature * ptr_inline_c_0) {
 
                   delete ptr_inline_c_0;
                 
@@ -93,7 +121,7 @@
 }
 
 extern "C" {
-void inline_c_OpenCV_Extra_Tracking_8_89f1496eff75dd40a161328bb1f958178e2152e9(Ptr_Tracker * ptr_inline_c_0) {
+void inline_c_OpenCV_Extra_Tracking_13_89f1496eff75dd40a161328bb1f958178e2152e9(Ptr_Tracker * ptr_inline_c_0) {
 
                   delete ptr_inline_c_0;
                 
diff --git a/src/OpenCV/Extra/Tracking.hs b/src/OpenCV/Extra/Tracking.hs
--- a/src/OpenCV/Extra/Tracking.hs
+++ b/src/OpenCV/Extra/Tracking.hs
@@ -48,6 +48,7 @@
 C.include "tracking.hpp"
 
 C.using "namespace cv"
+
 --------------------------------------------------------------------------------
 
 data TrackerType
@@ -56,6 +57,7 @@
   | KCF         -- ^
   | MEDIANFLOW  -- ^
   | TLD         -- ^
+  | GOTURN      -- ^ https://github.com/opencv/opencv_extra/tree/c4219d5eb3105ed8e634278fad312a1a8d2c182d/testdata/tracking
     deriving (Eq, Show, Enum, Bounded)
 
 data TrackerFeatureType
@@ -86,14 +88,13 @@
   => TrackerType
      -- ^ Name
   -> m (Tracker (PrimState m))
-newTracker trackerType =
-  unsafePrimToPrim $ fromPtr $
-    withCString (show trackerType) $ \c'trackerType ->
-    [CU.block|Ptr_Tracker * {
-      cv::Ptr<cv::Tracker> tacker =
-        cv::Tracker::create ( cv::String($(const char * c'trackerType)));
-      return new cv::Ptr<cv::Tracker>(tacker);
-    }|]
+newTracker tType = unsafePrimToPrim $ fromPtr $ case tType of
+  BOOSTING   -> [CU.block|Ptr_Tracker * {return new cv::Ptr<cv::Tracker>(cv::TrackerBoosting::create());}|]
+  MIL        -> [CU.block|Ptr_Tracker * {return new cv::Ptr<cv::Tracker>(cv::TrackerMIL::create());}|]
+  KCF        -> [CU.block|Ptr_Tracker * {return new cv::Ptr<cv::Tracker>(cv::TrackerKCF::create());}|]
+  MEDIANFLOW -> [CU.block|Ptr_Tracker * {return new cv::Ptr<cv::Tracker>(cv::TrackerMedianFlow::create());}|]
+  TLD        -> [CU.block|Ptr_Tracker * {return new cv::Ptr<cv::Tracker>(cv::TrackerTLD::create());}|]
+  GOTURN     -> [CU.block|Ptr_Tracker * {return new cv::Ptr<cv::Tracker>(cv::TrackerGOTURN::create());}|]
 
 initTracker
   :: (PrimMonad m, IsRect rect C.CDouble)
@@ -184,16 +185,11 @@
 
 newMultiTracker
     :: (PrimMonad m)
-    => TrackerType
-       -- ^ Name
-    -> m (MultiTracker (PrimState m))
-newMultiTracker trackerType =
+    => m (MultiTracker (PrimState m))
+newMultiTracker =
   unsafePrimToPrim $ fromPtr $
-    withCString (show trackerType) $ \c'trackerType ->
     [CU.block|Ptr_MultiTracker * {
-    cv::Ptr<cv::MultiTracker> mtracker =
-      new cv::MultiTracker ( cv::String($(const char * c'trackerType)));
-      return new cv::Ptr<cv::MultiTracker>(mtracker);
+      return new cv::Ptr<cv::MultiTracker>(new cv::MultiTracker ());
     }|]
 
 --------------------------------------------------------------------------------
@@ -210,5 +206,4 @@
         cv::Ptr<cv::TrackerFeature> ftracker =
           cv::TrackerFeature::create ( cv::String($(const char * c'trackerFeatureType)));
           return new cv::Ptr<cv::TrackerFeature>(ftracker);
-
     }|]
