diff --git a/doc/I02_HiPerformance.dox b/doc/I02_HiPerformance.dox
new file mode 100644
index 000000000..012e7d71b
--- /dev/null
+++ b/doc/I02_HiPerformance.dox
@@ -0,0 +1,101 @@
+
+namespace Eigen {
+
+/** \page HiPerformance Advanced - Using Eigen with high performance
+
+
+
+BLAS equivalent routine |
+Efficient version (compile to a single optimized evaluation) |
+Less efficient equivalent version (requires multiple evaluations) |
+comments |
+
+
+GEMM |
+m1 = s1 * m2 * m3 |
+m1 = s1 * (m2 * m3) |
+This is because m2 * m3 is evaluated by the scalar product. |
+
+
+GEMM |
+m1 += s1 * m2.adjoint() * m3 |
+m1 += (s1 * m2).adjoint() * m3 |
+This is because our expression analyser stops at the first transpose expression and cannot extract the nested scalar multiple. |
+
+
+GEMM |
+m1 += m2.adjoint() * m3 |
+m1 += m2.conjugate().transpose() * m3 |
+For the same reason. Use .adjoint() or .transpose().conjugate() |
+
+
+GEMM |
+m1 -= (-(s0*m2).conjugate()*s1) * (s2 * m3.adjoint() * s3) |
+ |
+Note that s0 is automatically conjugated during the simplification of the expression. |
+
+
+SYR |
+m.sefadjointView().rankUpdate(v,s) |
+ |
+Computes m += s * v * v.adjoint() |
+
+
+SYR2 |
+m.sefadjointView().rankUpdate(u,v,s) |
+ |
+Computes m += s * u * v.adjoint() + s * v * u.adjoint() |
+
+
+SYRK |
+m1.sefadjointView().rankUpdate(m2.adjoint(),s) |
+ |
+Computes m1 += s * m2.adjoint() * m2 |
+
+
+SYMM/HEMM |
+m3 -= s1 * m1.sefadjointView() * m2.adjoint() |
+ |
+ |
+
+
+SYMM/HEMM |
+m3 += s1 * m2.transpose() * m1.conjugate().sefadjointView() |
+ |
+ |
+
+
+TRMM |
+m3 -= s1 * m1.triangularView() * m2.adjoint() |
+ |
+ |
+
+
+TRSV / TRSM |
+m1.adjoint().triangularView().solveInPlace(m2) |
+ |
+ |
+
+
+ |
+ |
+ |
+ |
+
+
+ |
+ |
+ |
+ |
+
+
+ |
+ |
+ |
+ |
+
+
+
+*/
+
+}
diff --git a/doc/snippets/HouseholderQR_solve.cpp b/doc/snippets/HouseholderQR_solve.cpp
index aa9404951..429bd81e3 100644
--- a/doc/snippets/HouseholderQR_solve.cpp
+++ b/doc/snippets/HouseholderQR_solve.cpp
@@ -4,6 +4,6 @@ Matrix3f y = Matrix3f::Random();
cout << "Here is the matrix m:" << endl << m << endl;
cout << "Here is the matrix y:" << endl << y << endl;
Matrix3f x;
-m.householderQr().solve(y, &x));
+m.householderQr().solve(y, &x);
assert(y.isApprox(m*x));
cout << "Here is a solution x to the equation mx=y:" << endl << x << endl;
diff --git a/doc/snippets/MatrixBase_asDiagonal.cpp b/doc/snippets/MatrixBase_asDiagonal.cpp
index 4cbff8231..b01082db1 100644
--- a/doc/snippets/MatrixBase_asDiagonal.cpp
+++ b/doc/snippets/MatrixBase_asDiagonal.cpp
@@ -1 +1 @@
-cout << Vector3i(2,5,6).asDiagonal() << endl;
+cout << Matrix3i(Vector3i(2,5,6).asDiagonal()) << endl;
diff --git a/doc/snippets/MatrixBase_extract.cpp b/doc/snippets/MatrixBase_extract.cpp
index 02f44c83f..a5ccd7574 100644
--- a/doc/snippets/MatrixBase_extract.cpp
+++ b/doc/snippets/MatrixBase_extract.cpp
@@ -1,3 +1,5 @@
+#warning deprecated
+/* deprecated
Matrix3i m = Matrix3i::Random();
cout << "Here is the matrix m:" << endl << m << endl;
cout << "Here is the upper-triangular matrix extracted from m:" << endl
@@ -6,3 +8,4 @@ cout << "Here is the strictly-upper-triangular matrix extracted from m:" << endl
<< m.part