diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 7b94beabb79177d13b64ad9bb26064745597a724..0387ed91408cdce782afd1177fa1e6dcc24d5a7b 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -1482,14 +1482,13 @@ bool CPPEditor::isInComment(const QTextCursor &cursor) const
 }
 
 // Indent a code line based on previous
-template <class Iterator>
 static void indentCPPBlock(const CPPEditor::TabSettings &ts,
-                           const QTextBlock &block,
-                           const Iterator &programBegin,
-                           const Iterator &programEnd,
-                           QChar typedChar)
+    const QTextBlock &block,
+    const TextEditor::TextBlockIterator &programBegin,
+    const TextEditor::TextBlockIterator &programEnd,
+    QChar typedChar)
 {
-    typedef typename SharedTools::Indenter<Iterator> Indenter;
+    typedef SharedTools::Indenter Indenter;
     Indenter &indenter = Indenter::instance();
     indenter.setIndentSize(ts.m_indentSize);
     indenter.setTabSize(ts.m_tabSize);
diff --git a/src/shared/indenter/indenter_impl.h b/src/shared/indenter/indenter.cpp
similarity index 93%
rename from src/shared/indenter/indenter_impl.h
rename to src/shared/indenter/indenter.cpp
index de2cbe452f052db7fb53a3bb9b54dfd48c87ece9..92f7bdf2393748a0f8582177c8398431d9eac3ac 100644
--- a/src/shared/indenter/indenter_impl.h
+++ b/src/shared/indenter/indenter.cpp
@@ -27,9 +27,6 @@
 **
 **************************************************************************/
 
-#ifndef INDENTER_C
-#define INDENTER_C
-
 /*
   This file is a self-contained interactive indenter for C++ and Qt
   Script.
@@ -69,6 +66,8 @@
   string literals are removed beforehand.
 */
 
+#include "indenter.h"
+
 namespace SharedTools {
 
 /* qmake ignore Q_OBJECT */
@@ -105,8 +104,7 @@ namespace {
     enum { ppCommentOffset = 1 };
 }
 
-template <class Iterator>
-Indenter<Iterator>::Indenter() :
+Indenter::Indenter() :
     ppHardwareTabSize(8),
     ppIndentSize(4),
     ppIndentBraces(false),
@@ -119,40 +117,34 @@ Indenter<Iterator>::Indenter() :
 {
 }
 
-template <class Iterator>
-Indenter<Iterator>::~Indenter()
+Indenter::~Indenter()
 {
     delete yyLinizerState;
 }
 
-template <class Iterator>
-Indenter<Iterator> &Indenter<Iterator>::instance()
+Indenter &Indenter::instance()
 {
     static Indenter rc;
     return rc;
 }
 
-template <class Iterator>
-void Indenter<Iterator>::setIndentSize(int size)
+void Indenter::setIndentSize(int size)
 {
     ppIndentSize = size;
     ppContinuationIndentSize = 2 * size;
 }
 
-template <class Iterator>
-void Indenter<Iterator>::setTabSize(int size )
+void Indenter::setTabSize(int size )
 {
     ppHardwareTabSize = size;
 }
 
-template <class Iterator>
-void Indenter<Iterator>::setIndentBraces(bool indent)
+void Indenter::setIndentBraces(bool indent)
 {
     ppIndentBraces = indent;
 }
 
-template <class Iterator>
-void Indenter<Iterator>::setDoubleIndentBlocks(bool indent)
+void Indenter::setDoubleIndentBlocks(bool indent)
 {
     ppDoubleIndentBlocks = indent;
 }
@@ -161,8 +153,7 @@ void Indenter<Iterator>::setDoubleIndentBlocks(bool indent)
   Returns the first non-space character in the string t, or
   QChar::null if the string is made only of white space.
 */
-template <class Iterator>
-QChar Indenter<Iterator>::firstNonWhiteSpace( const QString& t )
+QChar Indenter::firstNonWhiteSpace( const QString& t )
 {
     if (const int len = t.length())
 	for ( int i = 0; i < len; i++)
@@ -175,8 +166,7 @@ QChar Indenter<Iterator>::firstNonWhiteSpace( const QString& t )
   Returns true if string t is made only of white space; otherwise
   returns false.
 */
-template <class Iterator>
-bool Indenter<Iterator>::isOnlyWhiteSpace( const QString& t )
+bool Indenter::isOnlyWhiteSpace( const QString& t )
 {
     return t.isEmpty() || firstNonWhiteSpace( t ).isNull();
 }
@@ -186,8 +176,7 @@ bool Indenter<Iterator>::isOnlyWhiteSpace( const QString& t )
   index. Column numbers and index are identical for strings that don't
   contain '\t's.
 */
-template <class Iterator>
-int Indenter<Iterator>::columnForIndex( const QString& t, int index ) const
+int Indenter::columnForIndex( const QString& t, int index ) const
 {
     int col = 0;
     if ( index > t.length() )
@@ -208,8 +197,7 @@ int Indenter<Iterator>::columnForIndex( const QString& t, int index ) const
 /*
   Returns the indentation size of string t.
 */
-template <class Iterator>
-int Indenter<Iterator>::indentOfLine( const QString& t ) const
+int Indenter::indentOfLine( const QString& t ) const
 {
     return columnForIndex( t, t.indexOf(firstNonWhiteSpace(t)) );
 }
@@ -230,8 +218,7 @@ static inline void eraseChar( QString& t, int k, QChar ch )
   Removes some nefast constructs from a code line and returns the
   resulting line.
 */
-template <class Iterator>
-QString Indenter<Iterator>::trimmedCodeLine( const QString& t )
+QString Indenter::trimmedCodeLine( const QString& t )
 {
     QString trimmed = t;
     int k;
@@ -348,8 +335,7 @@ static inline bool okay( QChar typedIn, QChar okayCh )
   accordingly. yyLine is cleaned from comments and other damageable
   constructs. Empty lines are skipped.
 */
-template <class Iterator>
-bool Indenter<Iterator>::readLine()
+bool Indenter::readLine()
 {
     int k;
 
@@ -457,8 +443,7 @@ bool Indenter<Iterator>::readLine()
   Resets the linizer to its initial state, with yyLine containing the
   line above the bottom line of the program.
 */
-template <class Iterator>
-void Indenter<Iterator>::startLinizer()
+void Indenter::startLinizer()
 {
     yyLinizerState->braceDepth = 0;
     yyLinizerState->inCComment = false;
@@ -479,8 +464,7 @@ void Indenter<Iterator>::startLinizer()
   potentially the whole line) is part of a C-style comment; otherwise
   returns false.
 */
-template <class Iterator>
-bool Indenter<Iterator>::bottomLineStartsInCComment()
+bool Indenter::bottomLineStartsInCComment()
 {
     /*
       We could use the linizer here, but that would slow us down
@@ -515,8 +499,7 @@ bool Indenter<Iterator>::bottomLineStartsInCComment()
   Essentially, we're trying to align against some text on the previous
   line.
 */
-template <class Iterator>
-int Indenter<Iterator>::indentWhenBottomLineStartsInCComment() const
+int Indenter::indentWhenBottomLineStartsInCComment() const
 {
     int k = yyLine->lastIndexOf(m_constants.m_slashAster );
     if ( k == -1 ) {
@@ -560,8 +543,7 @@ int Indenter<Iterator>::indentWhenBottomLineStartsInCComment() const
       if ( x )
 	  y;
 */
-template <class Iterator>
-bool Indenter<Iterator>::matchBracelessControlStatement()
+bool Indenter::matchBracelessControlStatement()
 {
     int delimDepth = 0;
 
@@ -649,8 +631,7 @@ bool Indenter<Iterator>::matchBracelessControlStatement()
 	  f +   // unfinished continuation line
 	  g;    // continuation line
 */
-template <class Iterator>
-bool  Indenter<Iterator>::isUnfinishedLine()
+bool  Indenter::isUnfinishedLine()
 {
     bool unf = false;
 
@@ -699,8 +680,7 @@ bool  Indenter<Iterator>::isUnfinishedLine()
   Returns true if yyLine is a continuation line; otherwise returns
   false.
 */
-template <class Iterator>
-bool Indenter<Iterator>::isContinuationLine()
+bool Indenter::isContinuationLine()
 {
     YY_SAVE();
     const bool cont = readLine() && isUnfinishedLine();
@@ -716,8 +696,7 @@ bool Indenter<Iterator>::isContinuationLine()
   or other bracked left opened on a previous line, or some interesting
   operator such as '='.
 */
-template <class Iterator>
-int Indenter<Iterator>::indentForContinuationLine()
+int Indenter::indentForContinuationLine()
 {
     int braceDepth = 0;
     int delimDepth = 0;
@@ -953,8 +932,7 @@ int Indenter<Iterator>::indentForContinuationLine()
   people with irregular indentation schemes. A hook line near at hand
   is much more reliable than a remote one.
 */
-template <class Iterator>
-int  Indenter<Iterator>::indentForStandaloneLine()
+int  Indenter::indentForStandaloneLine()
 {
     const QChar semicolon = QLatin1Char(';');
     const QChar openingBrace = QLatin1Char('{');
@@ -1049,8 +1027,7 @@ int  Indenter<Iterator>::indentForStandaloneLine()
   slighly more liberal if typedIn is always null. The user might be
   annoyed by the liberal behavior.
 */
-template <class Iterator>
-int Indenter<Iterator>::indentForBottomLine(const Iterator &current,
+int Indenter::indentForBottomLine(const Iterator &current,
                                             const Iterator &programBegin,
                                             const Iterator &programEnd,
                                             QChar typedIn )
@@ -1146,8 +1123,3 @@ int Indenter<Iterator>::indentForBottomLine(const Iterator &current,
 }
 
 } // namespace SharedTools
-
-#undef YY_SAVE
-#undef YY_RESTORE
-
-#endif // INDENTER_C
diff --git a/src/shared/indenter/indenter.h b/src/shared/indenter/indenter.h
index f5091038ea5b23b8e96ccf768c375a37664c12c3..b767d6978be6457a723f02c60804f28636ccd70e 100644
--- a/src/shared/indenter/indenter.h
+++ b/src/shared/indenter/indenter.h
@@ -30,6 +30,9 @@
 #ifndef INDENTER_H
 #define INDENTER_H
 
+#include "texteditor/basetexteditor.h"
+#include "texteditor/textblockiterator.h"
+
 #include <QtCore/QString>
 #include <QtCore/QStringList>
 
@@ -62,14 +65,13 @@ struct Constants {
  * given as a list of strings, with the bottom line being the line to
  * indent. The actual program might contain extra lines, but those are
  * uninteresting and not passed over to us. */
-template <class Iterator>
 struct LinizerState {
 
     QString line;
     int braceDepth;
     bool leftBraceFollows;
 
-    Iterator iter;
+    TextEditor::TextBlockIterator iter;
     bool inCComment;
     bool pendingRightBrace;
 };
@@ -79,8 +81,8 @@ struct LinizerState {
  * of a sequence of code lines represented as QString.
  * When setting the parameters, be careful to
  * specify the correct template parameters (best use a typedef). */
-template <class Iterator>
 class Indenter {
+    typedef TextEditor::TextBlockIterator Iterator;
     Indenter(const Indenter&);
     Indenter &operator=(const Indenter&);
     Indenter();
@@ -131,7 +133,7 @@ private:
     Iterator yyProgramBegin;
     Iterator yyProgramEnd;
 
-    typedef typename IndenterInternal::LinizerState<Iterator> LinizerState;
+    typedef IndenterInternal::LinizerState LinizerState;
 
     LinizerState *yyLinizerState ;
 
@@ -142,6 +144,4 @@ private:
 };
 }
 
-#include "indenter_impl.h"
-
 #endif // INDENTER_H
diff --git a/src/shared/indenter/indenter.pri b/src/shared/indenter/indenter.pri
index 3d1d4bbb1d3a767868d443e59909c9bfc8e82d23..d0f523c2abd435875fb2f74d1716697ed1170dd6 100644
--- a/src/shared/indenter/indenter.pri
+++ b/src/shared/indenter/indenter.pri
@@ -1,5 +1,4 @@
 INCLUDEPATH *= $$PWD
 
-SOURCES += $$PWD/constants.cpp
-HEADERS += $$PWD/indenter.h  \
-           $$PWD/indenter_impl.h
+SOURCES += $$PWD/constants.cpp $$PWD/indenter.cpp
+HEADERS += $$PWD/indenter.h