diff --git a/WebCore/platform/qt/ColorQt.cpp b/WebCore/platform/qt/ColorQt.cpp
index fd62e88..5d16740 100644
--- a/WebCore/platform/qt/ColorQt.cpp
+++ b/WebCore/platform/qt/ColorQt.cpp
@@ -32,7 +32,7 @@
 
 namespace WebCore {
 
-Color::Color(const QColor &c)
+Color::Color(const QColor& c)
     : m_color(makeRGBA(c.red(), c.green(), c.blue(), c.alpha()))
 {
     m_valid = c.isValid();
diff --git a/WebCore/platform/qt/ComboBoxQt.cpp b/WebCore/platform/qt/ComboBoxQt.cpp
index 26943fa..44ebffe 100644
--- a/WebCore/platform/qt/ComboBoxQt.cpp
+++ b/WebCore/platform/qt/ComboBoxQt.cpp
@@ -40,17 +40,14 @@
     : Widget()
     , m_comboBox(0)
 {
-    qDebug("PlatformComboBox::PlatformComboBox(), this=%p", this);
 }
 
 PlatformComboBox::~PlatformComboBox()
 {
-    qDebug("PlatformComboBox::~PlatformComboBox(), this=%p", this);
 }
 
 void PlatformComboBox::setParentWidget(QWidget* parent)
 {
-    qDebug("PlatformComboBox::setParentWidget(), parent=%p", parent);
     Widget::setParentWidget(parent);
 
     Q_ASSERT(m_comboBox == 0);
@@ -71,7 +68,7 @@
 
 void PlatformComboBox::appendGroupLabel(const DeprecatedString& text)
 {
-    // TODO: Group label?
+    // FIXME: Group label?
     m_comboBox->addItem(text);
 }
 
diff --git a/WebCore/platform/qt/CursorQt.cpp b/WebCore/platform/qt/CursorQt.cpp
index 1824901..c11a951 100644
--- a/WebCore/platform/qt/CursorQt.cpp
+++ b/WebCore/platform/qt/CursorQt.cpp
@@ -90,8 +90,8 @@
     }
 
 public:
-    static Cursors *self();
-    static Cursors *s_self;
+    static Cursors* self();
+    static Cursors* s_self;
 
     Cursor CrossCursor;
     Cursor MoveCursor;
@@ -111,9 +111,8 @@
 
 Cursors* Cursors::self()
 {
-    if (!s_self) {
-        s_self = new Cursors;
-    }
+    if (!s_self)
+        s_self = new Cursors();
 
     return s_self;
 }
diff --git a/WebCore/platform/qt/FontCacheQt.cpp b/WebCore/platform/qt/FontCacheQt.cpp
index 97227e6..fb3020c 100644
--- a/WebCore/platform/qt/FontCacheQt.cpp
+++ b/WebCore/platform/qt/FontCacheQt.cpp
@@ -48,7 +48,7 @@
 
 FontPlatformData* FontCache::getSimilarFontPlatformData(const Font& font)
 {
-    return new FontPlatformData(font.fontDescription(), font.family().family());
+    return 0;
 }
 
 FontPlatformData* FontCache::getLastResortFallbackFont(const Font& font)
@@ -61,7 +61,7 @@
 
 FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family)
 {
-    return 0;
+    return new FontPlatformData(fontDescription, family);
 }
 
 }
diff --git a/WebCore/platform/qt/FontPlatformData.h b/WebCore/platform/qt/FontPlatformData.h
index ad1cddf..a07d6b3 100644
--- a/WebCore/platform/qt/FontPlatformData.h
+++ b/WebCore/platform/qt/FontPlatformData.h
@@ -39,8 +39,8 @@
 
 class FontPlatformData {
 public:
-    FontPlatformData(const FontPlatformData& other);
-    FontPlatformData& operator=(const FontPlatformData& other);
+    FontPlatformData(const FontPlatformData&);
+    FontPlatformData& operator=(const FontPlatformData&);
 
     class Deleted { };
     FontPlatformData(Deleted);
@@ -56,7 +56,7 @@
 
     unsigned hash() const;
 
-    bool operator==(const FontPlatformData& other) const;
+    bool operator==(const FontPlatformData&) const;
 
 private:
     QFont m_font;
diff --git a/WebCore/platform/qt/FontPlatformDataQt.cpp b/WebCore/platform/qt/FontPlatformDataQt.cpp
index 5b6e6d8..773135a 100644
--- a/WebCore/platform/qt/FontPlatformDataQt.cpp
+++ b/WebCore/platform/qt/FontPlatformDataQt.cpp
@@ -34,7 +34,7 @@
 #include "DeprecatedString.h"
 #include "FontDescription.h"
 
-#include <QDebug>
+#include <QHash>
 #include <QFontInfo>
 
 namespace WebCore {
diff --git a/WebCore/platform/qt/FontQt.cpp b/WebCore/platform/qt/FontQt.cpp
index 16098c1..ed9f15a 100644
--- a/WebCore/platform/qt/FontQt.cpp
+++ b/WebCore/platform/qt/FontQt.cpp
@@ -41,7 +41,6 @@
 
 Font::operator QFont() const
 {
-    Q_ASSERT(primaryFont() != 0);
     return primaryFont()->platformData().font();
 }
 
@@ -62,7 +61,7 @@
 
 void Font::drawComplexText(GraphicsContext* ctx, const TextRun& run, const TextStyle&, const FloatPoint& point) const
 {
-    // ### style, run.from()/length() cut-off
+    // FIXME: style, run.from()/length() cut-off
     ctx->platformContext()->drawText(point.x(),
                                      point.y(),
                                      QString::fromRawData(reinterpret_cast<const QChar*>(run.characters() + run.from()), run.length()));
@@ -70,7 +69,7 @@
 
 float Font::floatWidthForComplexText(const TextRun& run, const TextStyle&) const
 {
-    // ### style
+    // FIXME: style
     QFontMetricsF metrics(primaryFont()->m_font.font());
     return metrics.width(QString::fromRawData(reinterpret_cast<const QChar*>(run.characters() + run.from()), run.length()));
 }
diff --git a/WebCore/platform/qt/FrameQt.cpp b/WebCore/platform/qt/FrameQt.cpp
index 448fb69..0e0bb6c 100644
--- a/WebCore/platform/qt/FrameQt.cpp
+++ b/WebCore/platform/qt/FrameQt.cpp
@@ -143,10 +143,11 @@
 {
     qDebug("openURL(%s)", url.url().latin1());
     didOpenURL(url);
-    
-    ResourceRequest request(resourceRequest());
-    request.m_responseMIMEType = "image/svg+xml";
-    setResourceRequest(request);
+
+    // FIXME: Use mimetype logic from KIO!
+    // ResourceRequest request(resourceRequest());
+    // request.m_responseMIMEType = "image/svg+xml";
+    // setResourceRequest(request);
 
     begin(url);
     ResourceLoader* job = new ResourceLoader(this, "GET", url);
@@ -164,7 +165,7 @@
 
     d->m_submittedFormURL = request.url();
 
-    /* TODO: Once we have a KPart - named "FramePartQt" - we can let that inherit from FrameQtClient and implement the functions...)
+    /* FIXME: Once we have a KPart - named "FramePartQt" - we can let that inherit from FrameQtClient and implement the functions...)
     if(m_client)
         m_client->submitForm(request.doPost() ? "POST" : "GET", request.url(), &request.postData);
     */
@@ -181,7 +182,6 @@
 {
     //need to potentially updateLocationBar(str.ascii()); or notify sys of new url mybe event or callback
     const KURL url = request.url();
-    printf("------------------> LOADING NEW URL %s \n", url.url().ascii());
     didOpenURL(url);
     begin(url);
     ResourceLoader* job = new ResourceLoader(this, "GET", url);
@@ -498,11 +498,11 @@
 
     // Check for cases where we are too early for events -- possible unmatched key up
     // from pressing return in the location bar.
-    Document *doc = document();
+    Document* doc = document();
     if(!doc)
         return false;
 
-    Node *node = doc->focusNode();
+    Node* node = doc->focusNode();
     if(!node) {
         if (doc->isHTMLDocument())
             node = doc->body();
diff --git a/WebCore/platform/qt/FrameQt.h b/WebCore/platform/qt/FrameQt.h
index 6608477..aae5872 100644
--- a/WebCore/platform/qt/FrameQt.h
+++ b/WebCore/platform/qt/FrameQt.h
@@ -49,7 +49,8 @@
     virtual void submitForm(const String& method, const KURL&, const FormData*) = 0;
 };
 
-class FrameQt : public Frame, public ResourceLoaderClient {
+class FrameQt : public Frame,
+                public ResourceLoaderClient {
 public:
     FrameQt(QWidget* parent);
     FrameQt();
@@ -136,7 +137,7 @@
 
     virtual void receivedResponse(ResourceLoader*, PlatformResponse);
     virtual void receivedData(ResourceLoader*, const char*, int);
-    virtual void receivedAllData(ResourceLoader*,PlatformData);
+    virtual void receivedAllData(ResourceLoader*, PlatformData);
 
     void setFrameGeometry(const IntRect&);
 
diff --git a/WebCore/platform/qt/GraphicsContextQt.cpp b/WebCore/platform/qt/GraphicsContextQt.cpp
index 8e6c617..617befd 100644
--- a/WebCore/platform/qt/GraphicsContextQt.cpp
+++ b/WebCore/platform/qt/GraphicsContextQt.cpp
@@ -137,7 +137,7 @@
     }
 
     QPixmap pixmap;
-    QPainter *painter;
+    QPainter* painter;
     qreal opacity;
 };
 
@@ -195,7 +195,7 @@
     painter = p;
     redirect = 0;
 
-    // TODO: Maybe only enable in SVG mode?
+    // FIXME: Maybe only enable in SVG mode?
     painter->setRenderHint(QPainter::Antialiasing);
 }
 
@@ -205,7 +205,7 @@
 
 GraphicsContext::GraphicsContext(PlatformGraphicsContext* context)
     : m_common(createGraphicsContextPrivate())
-      , m_data(new GraphicsContextPlatformPrivate(context))
+    , m_data(new GraphicsContextPlatformPrivate(context))
 {
     setPaintingDisabled(!context);
 }
@@ -243,7 +243,7 @@
     if (m_data->shadow.isNull())
         return;
 
-    TextShadow *shadow = &m_data->shadow;
+    TextShadow* shadow = &m_data->shadow;
 
     if (shadow->blur <= 0) {
         Pen p = pen();
@@ -252,7 +252,7 @@
         setPen(p);
     } else {
         const int thickness = shadow->blur;
-        // ### OPTIMIZE: limit the area to only the actually painted area + 2*thickness
+        // FIXME: OPTIMIZE: limit the area to only the actually painted area + 2*thickness
         const int w = m_data->p().device()->width();
         const int h = m_data->p().device()->height();
         const QRgb color = qRgb(255, 255, 255);
@@ -421,7 +421,7 @@
     if (paintingDisabled())
         return;
 
-    m_data->p().drawConvexPolygon((QPoint*)points, npoints);
+    m_data->p().drawConvexPolygon(reinterpret_cast<const QPoint*>(points), npoints);
 }
 
 void GraphicsContext::fillRect(const IntRect& rect, const Color& c)
@@ -458,7 +458,7 @@
     notImplemented();
 }
 
-void GraphicsContext::setFocusRingClip(const IntRect &rect)
+void GraphicsContext::setFocusRingClip(const IntRect& rect)
 {
     if (paintingDisabled())
         return;
@@ -626,7 +626,7 @@
     m_data->p().setCompositionMode(toQtCompositionMode(op));
 }
 
-void GraphicsContext::clip(const Path &path)
+void GraphicsContext::clip(const Path& path)
 {
     if (paintingDisabled())
         return;
diff --git a/WebCore/platform/qt/ImageQt.cpp b/WebCore/platform/qt/ImageQt.cpp
index 59d8e3c..18aa014 100644
--- a/WebCore/platform/qt/ImageQt.cpp
+++ b/WebCore/platform/qt/ImageQt.cpp
@@ -113,7 +113,7 @@
     // Set the compositing operation.
     ctxt->setCompositeOperation(op);
 
-    QPainter *painter(ctxt->platformContext());
+    QPainter* painter(ctxt->platformContext());
 
     // Test using example site at
     // http://www.meyerweb.com/eric/css/edge/complexspiral/demo.html    
@@ -158,7 +158,7 @@
 
     // Set the compositing operation.
     ctxt->setCompositeOperation(op);
-    QPainter *p = ctxt->platformContext();
+    QPainter* p = ctxt->platformContext();
     p->drawTiledPixmap(dstRect, pix);
 
     ctxt->restore();
diff --git a/WebCore/platform/qt/LineEditQt.cpp b/WebCore/platform/qt/LineEditQt.cpp
index bbad274..424f993 100644
--- a/WebCore/platform/qt/LineEditQt.cpp
+++ b/WebCore/platform/qt/LineEditQt.cpp
@@ -26,7 +26,6 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
-#include <QDebug>
 #include <QLineEdit>
 
 #include <config.h>
@@ -45,17 +44,14 @@
     : m_lineEdit(0)
     , m_type(type)
 {
-    qDebug("PlatformLineEdit::PlatformLineEdit(), this=%p", this);
 }
 
 PlatformLineEdit::~PlatformLineEdit()
 {
-    qDebug("PlatformLineEdit::~PlatformLineEdit()");
 }
 
 void PlatformLineEdit::setParentWidget(QWidget* parent)
 {
-    qDebug("PlatformLineEdit::setParentWidget(), parent=%p", parent);
     Widget::setParentWidget(parent);
 
     Q_ASSERT(m_lineEdit == 0);
diff --git a/WebCore/platform/qt/ListBoxQt.cpp b/WebCore/platform/qt/ListBoxQt.cpp
index 408828a..5502b8f 100644
--- a/WebCore/platform/qt/ListBoxQt.cpp
+++ b/WebCore/platform/qt/ListBoxQt.cpp
@@ -42,17 +42,14 @@
     , _width(0.0)
     , _widthGood(false)
 {
-    qDebug("ListBox::ListBox(), this=%p", this);
 }
 
 ListBox::~ListBox()
 {
-    qDebug("ListBox::~ListBox(), this=%p", this);
 }
 
 void ListBox::setParentWidget(QWidget* parent)
 {
-    qDebug("ListBox::setParentWidget(), parent=%p", parent);
     ScrollView::setParentWidget(parent);
 
     Q_ASSERT(m_listWidget == 0);
diff --git a/WebCore/platform/qt/PageQt.cpp b/WebCore/platform/qt/PageQt.cpp
index 928acc7..b534bbc 100644
--- a/WebCore/platform/qt/PageQt.cpp
+++ b/WebCore/platform/qt/PageQt.cpp
@@ -27,7 +27,6 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
-#include <QDebug>
 #include <QWidget>
 
 #include "config.h"
@@ -55,14 +54,11 @@
     if (!widget)
         return FloatRect();
 
-    qDebug() << " Page::windowRect() -> " << (QRectF) widget->geometry();
     return (IntRect) widget->geometry();
 }
 
 void Page::setWindowRect(const FloatRect& r)
 {
-    qDebug() << " Page::setWindowRect() -> " << (QRectF) r;
-
     QWidget* widget = rootWindowForFrame(mainFrame());
     if (widget)
         widget->setGeometry(QRect(qRound(r.x()), qRound(r.y()), qRound(r.width()), qRound(r.height())));
diff --git a/WebCore/platform/qt/PathQt.cpp b/WebCore/platform/qt/PathQt.cpp
index a3540e2..01314f0 100644
--- a/WebCore/platform/qt/PathQt.cpp
+++ b/WebCore/platform/qt/PathQt.cpp
@@ -133,8 +133,8 @@
 
     double span = 0;
 
-    double xs     = xc - radius;
-    double ys     = yc - radius;
+    double xs = xc - radius;
+    double ys = yc - radius;
     double width  = radius*2;
     double height = radius*2;
 
@@ -143,7 +143,7 @@
     else if (anticlockwise && (sa < ea))
         span -= 360;
 
-    //### this is also due to switched coordinate system
+    // this is also due to switched coordinate system
     // we would end up with a 0 span instead of 360
     if (!(qFuzzyCompare(span + (ea - sa), 0.0) &&
           qFuzzyCompare(abs(span), 360.0))) {
@@ -152,6 +152,7 @@
 
     m_path->moveTo(QPointF(xc + radius  * cos(sar),
                           yc - radius  * sin(sar)));
+
     m_path->arcTo(xs, ys, width, height, sa, span);
 }
 
diff --git a/WebCore/platform/qt/PlatformKeyboardEventQt.cpp b/WebCore/platform/qt/PlatformKeyboardEventQt.cpp
index c86ce18..b6313c8 100644
--- a/WebCore/platform/qt/PlatformKeyboardEventQt.cpp
+++ b/WebCore/platform/qt/PlatformKeyboardEventQt.cpp
@@ -316,7 +316,7 @@
             return VK_Z; //  (5A) Z key case 'z': case 'Z': return 0x5A;
         case Qt::Key_Meta:
             return VK_LWIN; // (5B) Left Windows key (Microsoft Natural keyboard)
-        //case Qt::Key_Meta_R: TODO: What to do here?
+        //case Qt::Key_Meta_R: FIXME: What to do here?
         //    return VK_RWIN; // (5C) Right Windows key (Natural keyboard)
             // VK_APPS (5D) Applications key (Natural keyboard)
             // VK_SLEEP (5F) Computer Sleep key
@@ -422,7 +422,7 @@
 PlatformKeyboardEvent::PlatformKeyboardEvent(QKeyEvent* event, bool isKeyUp)
 {
     m_text = event->text();
-    m_unmodifiedText = event->text(); // TODO: not correct
+    m_unmodifiedText = event->text(); // FIXME: not correct
     m_keyIdentifier = keyIdentifierForQtKeyCode(event->key());
     m_isKeyUp = isKeyUp;
     m_autoRepeat = event->isAutoRepeat();
diff --git a/WebCore/platform/qt/RenderThemeQt.cpp b/WebCore/platform/qt/RenderThemeQt.cpp
index c3faec2..c4c097f 100644
--- a/WebCore/platform/qt/RenderThemeQt.cpp
+++ b/WebCore/platform/qt/RenderThemeQt.cpp
@@ -23,13 +23,13 @@
  *
  */
 
+#include "config.h"
+
 #include <QStyle>
 #include <QWidget>
 #include <QPainter>
 #include <QStyleOptionButton>
 
-#include "config.h"
-
 #include "RenderTheme.h"
 #include "GraphicsContext.h"
 
@@ -79,7 +79,7 @@
 
     bool supportsFocus(EAppearance) const;
 
-    bool stylePainterAndWidgetForPaintInfo(const RenderObject::PaintInfo&, QStyle*&, QPainter*&, QWidget*&) const;
+    bool getStylePainterAndWidgetFromPaintInfo(const RenderObject::PaintInfo&, QStyle*&, QPainter*&, QWidget*&) const;
     EAppearance applyTheme(QStyleOption&, RenderObject*) const;
 };
 
@@ -149,7 +149,7 @@
     }
 }
 
-bool RenderThemeQt::stylePainterAndWidgetForPaintInfo(const RenderObject::PaintInfo& i, QStyle*& style, QPainter*& painter, QWidget*& widget) const
+bool RenderThemeQt::getStylePainterAndWidgetFromPaintInfo(const RenderObject::PaintInfo& i, QStyle*& style, QPainter*& painter, QWidget*& widget) const
 {
     painter = (i.p ? static_cast<QPainter*>(i.p->platformContext()) : 0);
     widget = (painter ? static_cast<QWidget*>(painter->device()) : 0);
@@ -202,7 +202,8 @@
         option.state &= ~QStyle::State_Enabled;
 
     if (isReadOnlyControl(o))
-        option.state |= QStyle::State_ReadOnly; // Readonly is supported on textfields.
+        // Readonly is supported on textfields.
+        option.state |= QStyle::State_ReadOnly;
 
     if (supportsFocus(o->style()->appearance()) && isFocused(o))
         option.state |= QStyle::State_HasFocus;
@@ -231,7 +232,7 @@
     QPainter* painter = 0;
     QWidget* widget = 0;
     
-    if (!stylePainterAndWidgetForPaintInfo(i, style, painter, widget))
+    if (!getStylePainterAndWidgetFromPaintInfo(i, style, painter, widget))
         return true;
     
     QStyleOptionButton option;
@@ -262,7 +263,7 @@
     QPainter* painter = 0;
     QWidget* widget = 0;
     
-    if (!stylePainterAndWidgetForPaintInfo(i, style, painter, widget))
+    if (!getStylePainterAndWidgetFromPaintInfo(i, style, painter, widget))
         return true;
   
     QStyleOption option;
@@ -272,7 +273,7 @@
     Q_ASSERT(appearance == TextFieldAppearance);
 
     // Now paint the text field.
-    // TODO: this is not enough for sure! (use 'option'...)
+    // FIXME: this is not enough for sure! (use 'option'...)
     painter->drawRect(r);
 
     return false;
diff --git a/WebCore/platform/qt/ResourceLoaderCurl.cpp b/WebCore/platform/qt/ResourceLoaderCurl.cpp
index 82eda3a..0aeafef 100644
--- a/WebCore/platform/qt/ResourceLoaderCurl.cpp
+++ b/WebCore/platform/qt/ResourceLoaderCurl.cpp
@@ -65,7 +65,7 @@
         d->responseHeaders = DeprecatedString::fromUtf8(d->response.toUtf8(), d->response.length());
         d->assembledResponseHeaders = true;
  
-        // TODO: Move the client activation to receivedResponse(), once
+        // FIXME: Move the client activation to receivedResponse(), once
         // we use KIO, and receivedResponse() is called only once.
         if (d->client) {
             d->client->receivedResponse(const_cast<ResourceLoader *>(this), (char *) d->response.data());
@@ -81,7 +81,7 @@
         d->retrievedCharset = true;
     }
 
-    // TODO: We can just parse the headers here, but once we use KIO
+    // FIXME: We can just parse the headers here, but once we use KIO
     // we can set the response parameter to sth. else than a "char*".
     // I save my time but not implementing it for now :-)
     notImplemented();
@@ -94,7 +94,7 @@
     d->assembledResponseHeaders = false;
     d->retrievedCharset = false;
 
-    // TODO: This is flawed:
+    // FIXME: This is flawed:
     // - usually receivedResponse() should be called _once_, when the
     //   response is available - seems very unflexible to do that with libcurl
     //   (so let's wait until it dies and do it properly with KIO then.)
diff --git a/WebCore/platform/qt/ResourceLoaderManager.cpp b/WebCore/platform/qt/ResourceLoaderManager.cpp
index aeec1f2..bb03095 100644
--- a/WebCore/platform/qt/ResourceLoaderManager.cpp
+++ b/WebCore/platform/qt/ResourceLoaderManager.cpp
@@ -215,7 +215,7 @@
         strncpy(postDataString, postData.ascii(), postData.length());
         postDataString[postData.length()] = '\0';
 
-        // TODO: Do it properly after we got rid of libcurl! (also leaks the headerlist. hmpf.)
+        // FIXME: Do it properly after we got rid of libcurl! (also leaks the headerlist. hmpf.)
         curl_easy_setopt(d->m_handle, CURLOPT_POSTFIELDS, postDataString);
     }
 
diff --git a/WebCore/platform/qt/ScrollViewCanvasQt.cpp b/WebCore/platform/qt/ScrollViewCanvasQt.cpp
index 91ef155..ab32ae8 100644
--- a/WebCore/platform/qt/ScrollViewCanvasQt.cpp
+++ b/WebCore/platform/qt/ScrollViewCanvasQt.cpp
@@ -29,10 +29,11 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include "config.h"
+
 #include "ScrollViewCanvasQt.h"
 #include "ScrollViewCanvasQt.moc"
 
-#include "config.h"
 #include "FrameQt.h"
 #include "FrameView.h"
 #include "TypingCommand.h"
@@ -42,7 +43,6 @@
 #include "PlatformMouseEvent.h"
 #include "PlatformKeyboardEvent.h"
 
-#include <QDebug>
 #include <QPainter>
 #include <QPaintEvent>
 #include <QMouseEvent>
@@ -149,10 +149,11 @@
                     TypingCommand::insertText(frame->document(), kevent.text(), false);
 
             }
+
             handled = true;
         }
         
-        // TODO: doScroll stuff()!
+        // FIXME: doScroll stuff()!
     }
 }
 
diff --git a/WebCore/platform/qt/SharedTimerQt.h b/WebCore/platform/qt/SharedTimerQt.h
index affff29..cda9c4e 100644
--- a/WebCore/platform/qt/SharedTimerQt.h
+++ b/WebCore/platform/qt/SharedTimerQt.h
@@ -29,11 +29,8 @@
 #define SharedTimerQtQt_H
 
 #include "SharedTimerQt.h"
-
 #include "SystemTime.h"
-#include <wtf/Assertions.h>
-#include <stdio.h>
-#include <stdlib.h>
+
 #include <QTimer>
 
 namespace WebCore {
@@ -53,7 +50,7 @@
     }
 
 public:
-    static SharedTimerQt *inst()
+    static SharedTimerQt* inst()
     {
         if (!s_self)
             s_self = new SharedTimerQt();
diff --git a/WebCore/platform/qt/StringQt.cpp b/WebCore/platform/qt/StringQt.cpp
index 830b7c6..34b43d7 100644
--- a/WebCore/platform/qt/StringQt.cpp
+++ b/WebCore/platform/qt/StringQt.cpp
@@ -24,6 +24,7 @@
  */
 
 #include "config.h"
+
 #include "PlatformString.h"
 #include "DeprecatedString.h"
 
diff --git a/WebCore/platform/qt/TextEditQt.cpp b/WebCore/platform/qt/TextEditQt.cpp
index 49ae4ca..023905c 100644
--- a/WebCore/platform/qt/TextEditQt.cpp
+++ b/WebCore/platform/qt/TextEditQt.cpp
@@ -24,10 +24,10 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
-#include <QDebug>
+#include "config.h"
+
 #include <QTextEdit>
 
-#include <config.h>
 #include "GraphicsTypes.h"
 #include "ScrollView.h"
 #include "TextDirection.h"
@@ -42,17 +42,14 @@
 PlatformTextEdit::PlatformTextEdit(Widget* parent)
     : ScrollView()
 {
-    qDebug("PlatformTextEdit::PlatformTextEdit(), this=%p", this);
 }
 
 PlatformTextEdit::~PlatformTextEdit()
 {
-    qDebug("PlatformTextEdit::~PlatformTextEdit()");
 }
 
 void PlatformTextEdit::setParentWidget(QWidget* parent)
 {
-    qDebug("PlatformTextEdit::setParentWidget(), parent=%p", parent);
     Widget::setParentWidget(parent);
 
     QTextEdit *widget = new QTextEdit(parent, "");
diff --git a/WebCore/platform/qt/WidgetQt.cpp b/WebCore/platform/qt/WidgetQt.cpp
index 4e63649..25e16ea 100644
--- a/WebCore/platform/qt/WidgetQt.cpp
+++ b/WebCore/platform/qt/WidgetQt.cpp
@@ -29,15 +29,14 @@
  */
 
 #include "config.h"
-#include "Widget.h"
 
-#include "Cursor.h"
 #include "Font.h"
-#include "GraphicsContext.h"
+#include "Widget.h"
+#include "Cursor.h"
 #include "IntRect.h"
 #include "RenderObject.h"
+#include "GraphicsContext.h"
 
-#include <QDebug>
 #include <QWidget>
 
 #define notImplemented() do { fprintf(stderr, "FIXME: UNIMPLEMENTED: %s:%d\n", __FILE__, __LINE__); } while(0)
@@ -133,7 +132,7 @@
         data->m_widget->hide();
 }
 
-void Widget::setQWidget(QWidget*child)
+void Widget::setQWidget(QWidget* child)
 {
     delete data->m_widget;
     data->m_widget = child;
