diff -urN qt-2.3.10-orig/include/qcstring.h qt-2.3.10-new/include/qcstring.h
--- qt-2.3.10-orig/include/qcstring.h	2005-02-27 18:07:41.000000000 -0600
+++ qt-2.3.10-new/include/qcstring.h	2005-04-14 13:03:02.584481232 -0500
@@ -119,7 +119,7 @@
 //                   We want to keep source compatibility for 2.x
 // ### TODO for 4.0: completely remove these and the cstr* functions
 
-#if !defined(QT_GENUINE_STR)
+#if 0
 
 #undef	strlen
 #define strlen qstrlen
diff -urN qt-2.3.10-orig/include/qiconview.h qt-2.3.10-new/include/qiconview.h
--- qt-2.3.10-orig/include/qiconview.h	2005-02-27 18:07:42.000000000 -0600
+++ qt-2.3.10-new/include/qiconview.h	2005-04-14 13:03:02.576482448 -0500
@@ -444,6 +444,7 @@
     virtual void contentsDropEvent( QDropEvent *e );
 #endif
 
+    void bufferedPaintEvent( QPaintEvent* );
     virtual void resizeEvent( QResizeEvent* e );
     virtual void keyPressEvent( QKeyEvent *e );
     virtual void focusInEvent( QFocusEvent *e );
diff -urN qt-2.3.10-orig/include/qwsdecoration_qws.h qt-2.3.10-new/include/qwsdecoration_qws.h
--- qt-2.3.10-orig/include/qwsdecoration_qws.h	2005-02-27 18:07:42.000000000 -0600
+++ qt-2.3.10-new/include/qwsdecoration_qws.h	2005-04-14 13:03:02.583481384 -0500
@@ -50,7 +50,7 @@
     enum Region { None=0, All=1, Title=2, Top=3, Bottom=4, Left=5, Right=6,
 		TopLeft=7, TopRight=8, BottomLeft=9, BottomRight=10,
 		Close=11, Minimize=12, Maximize=13, Normalize=14,
-		Menu=15, LastRegion=Menu };
+		Menu=15, LastRegion=Menu, UserDefined = 100 };
 
     virtual QRegion region(const QWidget *, const QRect &rect, Region r=All) = 0;
     virtual void close( QWidget * );
diff -urN qt-2.3.10-orig/src/iconview/qiconview.cpp qt-2.3.10-new/src/iconview/qiconview.cpp
--- qt-2.3.10-orig/src/iconview/qiconview.cpp	2005-02-27 18:07:42.000000000 -0600
+++ qt-2.3.10-new/src/iconview/qiconview.cpp	2005-04-14 13:03:02.575482600 -0500
@@ -225,6 +225,7 @@
     QIconView::SelectionMode selectionMode;
     QIconViewItem *currentItem, *tmpCurrentItem, *highlightedItem, *startDragItem, *pressedItem, *selectAnchor;
     QRect *rubber;
+    QPixmap *backBuffer;
     QTimer *scrollTimer, *adjustTimer, *updateTimer, *inputTimer,
 	*fullRedrawTimer;
     int rastX, rastY, spacing;
@@ -2268,6 +2269,7 @@
     d->currentItem = 0;
     d->highlightedItem = 0;
     d->rubber = 0;
+    d->backBuffer = 0;
     d->scrollTimer = 0;
     d->startDragItem = 0;
     d->tmpCurrentItem = 0;
@@ -2416,6 +2418,8 @@
 	delete item;
 	item = tmp;
     }
+    delete d->backBuffer;
+    d->backBuffer = 0;
     delete d->fm;
     d->fm = 0;
 #ifndef QT_NO_TOOLTIP
@@ -2882,6 +2886,48 @@
 }
 
 /*!
+    This function grabs all paintevents that otherwise would have been
+    processed by the QScrollView::viewportPaintEvent(). Here we use a
+    doublebuffer to reduce 'on-paint' flickering on QIconView
+    (and of course its childs).
+
+    \sa QScrollView::viewportPaintEvent(), QIconView::drawContents()
+*/
+
+void QIconView::bufferedPaintEvent( QPaintEvent* pe )
+{
+    QWidget* vp = viewport();
+    QRect r = pe->rect() & vp->rect();
+    int ex = r.x() + contentsX();
+    int ey = r.y() + contentsY();
+    int ew = r.width();
+    int eh = r.height();
+
+    if ( !d->backBuffer )
+	d->backBuffer = new QPixmap(vp->size());
+    if ( d->backBuffer->size() != vp->size() ) {
+	//Resize function (with hysteesis). Uses a good compromise between memory
+	//consumption and speed (number) of resizes.
+        float newWidth = (float)vp->width();
+	float newHeight = (float)vp->height();
+	if ( newWidth > d->backBuffer->width() || newHeight > d->backBuffer->height() )
+	{
+	    newWidth *= 1.1892;
+	    newHeight *= 1.1892;
+	    d->backBuffer->resize( (int)newWidth, (int)newHeight );
+	} else if ( 1.5*newWidth < d->backBuffer->width() || 1.5*newHeight < d->backBuffer->height() )
+	    d->backBuffer->resize( (int)newWidth, (int)newHeight );
+    }
+
+    QPainter p;
+    p.begin(d->backBuffer, vp);
+    drawContentsOffset(&p, contentsX(), contentsY(), ex, ey, ew, eh);
+    p.end();
+    bitBlt(vp, r.x(), r.y(), d->backBuffer, r.x(), r.y(), ew, eh);
+}
+
+/*!
+
   \reimp
 */
 
@@ -4939,7 +4985,7 @@
 		if ( !d->rubber )
 		    drawDragShapes( d->oldDragPos );
 	    }
-	    viewportPaintEvent( (QPaintEvent*)e );
+            bufferedPaintEvent ((QPaintEvent*)e );
 	    if ( d->dragging ) {
 		if ( !d->rubber )
 		    drawDragShapes( d->oldDragPos );
@@ -5377,11 +5423,19 @@
 	return;
 
     if ( item->d->container1 && d->firstContainer ) {
-	item->d->container1->items.removeRef( item );
+       //Special-case checking of the last item, since this may be
+       //called a few times for the same item.
+        if (item->d->container1->items.last() == item)
+            item->d->container1->items.removeLast();
+        else
+            item->d->container1->items.removeRef( item );
     }
     item->d->container1 = 0;
     if ( item->d->container2 && d->firstContainer ) {
-	item->d->container2->items.removeRef( item );
+        if (item->d->container2->items.last() == item)
+            item->d->container2->items.removeLast();
+        else
+            item->d->container2->items.removeRef( item );
     }
     item->d->container2 = 0;
 
diff -urN qt-2.3.10-orig/src/iconview/qiconview.h qt-2.3.10-new/src/iconview/qiconview.h
--- qt-2.3.10-orig/src/iconview/qiconview.h	2005-02-27 18:07:42.000000000 -0600
+++ qt-2.3.10-new/src/iconview/qiconview.h	2005-04-14 13:03:02.576482448 -0500
@@ -444,6 +444,7 @@
     virtual void contentsDropEvent( QDropEvent *e );
 #endif
 
+    void bufferedPaintEvent( QPaintEvent* );
     virtual void resizeEvent( QResizeEvent* e );
     virtual void keyPressEvent( QKeyEvent *e );
     virtual void focusInEvent( QFocusEvent *e );
diff -urN qt-2.3.10-orig/src/kernel/qgfxraster_qws.cpp qt-2.3.10-new/src/kernel/qgfxraster_qws.cpp
--- qt-2.3.10-orig/src/kernel/qgfxraster_qws.cpp	2005-02-27 18:07:42.000000000 -0600
+++ qt-2.3.10-new/src/kernel/qgfxraster_qws.cpp	2005-04-14 13:03:02.580481840 -0500
@@ -4037,13 +4037,14 @@
 	for( loopc2=0;loopc2<frontadd;loopc2++ )
 	    *(alphaptr++)=get_value_32(16,(unsigned char **)&temppos);
 
-	PackType temp2;
-	unsigned char * cp;
+	volatile PackType temp2;
+	volatile unsigned short int * cp;
 	for( loopc2=0;loopc2<count;loopc2++ ) {
-	    temp2=*((PackType *)temppos);
-	    cp=(unsigned char *)&temp2;
-	    *(alphaptr++)=get_value_32(16,&cp);
-	    *(alphaptr++)=get_value_32(16,&cp);
+           temp2=*reinterpret_cast<PackType *>(temppos);
+           cp=reinterpret_cast<volatile unsigned short int *>(&temp2);
+           *(alphaptr++)=qt_conv16ToRgb(*cp);
+           cp++;
+           *(alphaptr++)=qt_conv16ToRgb(*cp);
 	    temppos += 2;
 	}
 
diff -urN qt-2.3.10-orig/src/kernel/qwindowsystem_qws.cpp qt-2.3.10-new/src/kernel/qwindowsystem_qws.cpp
--- qt-2.3.10-orig/src/kernel/qwindowsystem_qws.cpp	2005-02-27 18:07:42.000000000 -0600
+++ qt-2.3.10-new/src/kernel/qwindowsystem_qws.cpp	2005-04-14 13:03:02.582481536 -0500
@@ -918,6 +918,18 @@
 {
 }
 
+static void catchSegvSignal( int )
+{
+#ifndef QT_NO_QWS_KEYBOARD
+    if ( qwsServer )
+	qwsServer->closeKeyboard();
+#endif
+    QWSServer::closedown();
+    fprintf(stderr, "Segmentation fault.\n");
+    exit(1);
+}
+
+
 /*!
   \class QWSServer qwindowsystem_qws.h
   \brief Server-specific functionality in Qt/Embedded
@@ -1043,6 +1055,7 @@
     }
 
     signal(SIGPIPE, ignoreSignal); //we get it when we read
+    signal(SIGSEGV, catchSegvSignal); //recover the keyboard on crash
 #endif
     focusw = 0;
     mouseGrabber = 0;
diff -urN qt-2.3.10-orig/src/kernel/qwsdecoration_qws.h qt-2.3.10-new/src/kernel/qwsdecoration_qws.h
--- qt-2.3.10-orig/src/kernel/qwsdecoration_qws.h	2005-02-27 18:07:42.000000000 -0600
+++ qt-2.3.10-new/src/kernel/qwsdecoration_qws.h	2005-04-14 13:03:02.583481384 -0500
@@ -50,7 +50,7 @@
     enum Region { None=0, All=1, Title=2, Top=3, Bottom=4, Left=5, Right=6,
 		TopLeft=7, TopRight=8, BottomLeft=9, BottomRight=10,
 		Close=11, Minimize=12, Maximize=13, Normalize=14,
-		Menu=15, LastRegion=Menu };
+		Menu=15, LastRegion=Menu, UserDefined = 100 };
 
     virtual QRegion region(const QWidget *, const QRect &rect, Region r=All) = 0;
     virtual void close( QWidget * );
diff -urN qt-2.3.10-orig/src/tools/qcstring.h qt-2.3.10-new/src/tools/qcstring.h
--- qt-2.3.10-orig/src/tools/qcstring.h	2005-02-27 18:07:41.000000000 -0600
+++ qt-2.3.10-new/src/tools/qcstring.h	2005-04-14 13:03:02.584481232 -0500
@@ -119,7 +119,7 @@
 //                   We want to keep source compatibility for 2.x
 // ### TODO for 4.0: completely remove these and the cstr* functions
 
-#if !defined(QT_GENUINE_STR)
+#if 0
 
 #undef	strlen
 #define strlen qstrlen
diff -urN qt-2.3.10-orig/src/tools/qstring.cpp qt-2.3.10-new/src/tools/qstring.cpp
--- qt-2.3.10-orig/src/tools/qstring.cpp	2005-02-27 18:07:42.000000000 -0600
+++ qt-2.3.10-new/src/tools/qstring.cpp	2005-04-14 13:03:02.593479864 -0500
@@ -14469,7 +14469,11 @@
     return qt_winQString2MB( *this );
 #endif
 #ifdef _WS_QWS_
-    return utf8(); // ##### if there is ANY 8 bit format supported?
+    QTextCodec* codec = QTextCodec::codecForLocale();
+    return codec
+	    ? codec->fromUnicode(*this)
+	    : utf8();
+    //return latin1(); // ##### if there is ANY 8 bit format supported?
 #endif
 #endif
 }
@@ -14515,7 +14519,12 @@
     return qt_winMB2QString( local8Bit );
 #endif
 #ifdef _WS_QWS_
-    return fromUtf8(local8Bit,len);
+    QTextCodec* codec = QTextCodec::codecForLocale();
+    if( len < 0) len = qstrlen(local8Bit);
+    return codec
+	    ? codec->toUnicode(local8Bit, len)
+	    : QString::fromUtf8(local8Bit,len);
+//    return fromLatin1(local8Bit,len);
 #endif
 #endif // QT_NO_TEXTCODEC
 }
diff -urN qt-2.3.10-orig/src/widgets/qcommonstyle.cpp qt-2.3.10-new/src/widgets/qcommonstyle.cpp
--- qt-2.3.10-orig/src/widgets/qcommonstyle.cpp	2005-02-27 18:07:41.000000000 -0600
+++ qt-2.3.10-new/src/widgets/qcommonstyle.cpp	2005-04-14 13:03:02.595479560 -0500
@@ -572,7 +572,7 @@
 				    bool enabled, bool active )
 {
 #ifndef QT_NO_MENUBAR
-#ifndef QT_NO_STYLE_SGI
+#if 1 // #ifndef QT_NO_STYLE_SGI
     if (draw_menu_bar_impl != 0) {
 	QDrawMenuBarItemImpl impl = draw_menu_bar_impl;
 	(this->*impl)(p, x, y, w, h, mi, g, enabled, active);
diff -urN qt-2.3.10-orig/src/widgets/qlistview.cpp qt-2.3.10-new/src/widgets/qlistview.cpp
--- qt-2.3.10-orig/src/widgets/qlistview.cpp	2005-02-27 18:07:41.000000000 -0600
+++ qt-2.3.10-new/src/widgets/qlistview.cpp	2005-04-14 13:03:02.599478952 -0500
@@ -5051,9 +5051,9 @@
 	l = l->childItem ? l->childItem : l->siblingItem;
 
     if ( l && l->height() )
-	s.setHeight( s.height() + 10 * l->height() );
-    else
-	s.setHeight( s.height() + 140 );
+	s.setHeight( s.height() + 4 /*10*/ * l->height() );
+    else                      // ^v much too big for handhelds
+	s.setHeight( s.height() + 30 /*140*/ );
 
     if ( s.width() > s.height() * 3 )
 	s.setHeight( s.width() / 3 );
diff -urN qt-2.3.10-orig/src/widgets/qpopupmenu.cpp qt-2.3.10-new/src/widgets/qpopupmenu.cpp
--- qt-2.3.10-orig/src/widgets/qpopupmenu.cpp	2005-02-27 18:07:41.000000000 -0600
+++ qt-2.3.10-new/src/widgets/qpopupmenu.cpp	2005-04-14 13:02:10.440408336 -0500
@@ -820,7 +820,7 @@
 	    mi->custom()->setFont( font() );
 	if ( mi->iconSet() != 0)
 	    maxPMWidth = QMAX( maxPMWidth,
-			       mi->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width() + 4 );
+			       mi->iconSet()->pixmap().width() + 4 );
     }
 
     int dh = QApplication::desktop()->height();
diff -urN qt-2.3.10-orig/src/widgets/qtabbar.cpp qt-2.3.10-new/src/widgets/qtabbar.cpp
--- qt-2.3.10-orig/src/widgets/qtabbar.cpp	2005-02-27 18:07:41.000000000 -0600
+++ qt-2.3.10-new/src/widgets/qtabbar.cpp	2005-04-14 13:03:02.601478648 -0500
@@ -260,7 +260,6 @@
 	lstatic->insert( index, newTab );
 
     layoutTabs();
-    updateArrowButtons();
     makeVisible( tab( currentTab() ) );
 
 #ifndef QT_NO_ACCEL
@@ -282,7 +281,6 @@
     l->remove( t );
     lstatic->remove( t );
     layoutTabs();
-    updateArrowButtons();
     makeVisible( tab( currentTab() ) );
     update();
 }
@@ -414,8 +412,8 @@
     int iw = 0;
     int ih = 0;
     if ( t->iconset != 0 ) {
-	iw = t->iconset->pixmap( QIconSet::Small, QIconSet::Normal ).width();
-	ih = t->iconset->pixmap( QIconSet::Small, QIconSet::Normal ).height();
+	iw = t->iconset->pixmap().width();
+	ih = t->iconset->pixmap().height();
 	if (!t->label.isEmpty())
 	   iw +=2; 
     }
@@ -442,7 +440,11 @@
 	    ? QIconSet::Normal : QIconSet::Disabled;
 	if ( mode == QIconSet::Normal && has_focus )
 	    mode = QIconSet::Active;
-	QPixmap pixmap = t->iconset->pixmap( QIconSet::Small, mode );
+	QPixmap pixmap;
+	if ( mode == QIconSet::Disabled )
+		pixmap = t->iconset->pixmap( QIconSet::Automatic, QIconSet::Disabled );
+	else
+		pixmap = t->iconset->pixmap();
 	int pixw = pixmap.width();
 	int pixh = pixmap.height();
 	r.setLeft( r.left() + pixw + 2 );
@@ -871,8 +873,8 @@
 	int iw = 0;
 	int ih = 0;
 	if ( t->iconset != 0 ) {
-	    iw = t->iconset->pixmap( QIconSet::Small, QIconSet::Normal ).width();
-	    ih = t->iconset->pixmap( QIconSet::Small, QIconSet::Normal ).height();
+	    iw = t->iconset->pixmap().width();
+	    ih = t->iconset->pixmap().height();
 	    if (!t->label.isNull())
 		iw +=2;
 	}
@@ -887,6 +889,7 @@
     }
     for ( t = lstatic->first(); t; t = lstatic->next() )
 	t->r.setHeight( r.height() );
+    updateArrowButtons();
 }
 
 /*!
@@ -915,8 +918,8 @@
 	    int iw = 0;
 	    int ih = 0;
 	    if ( t->iconset != 0 ) {
-		iw = t->iconset->pixmap( QIconSet::Small, QIconSet::Normal ).width();
-		ih = t->iconset->pixmap( QIconSet::Small, QIconSet::Normal ).height();
+		iw = t->iconset->pixmap().width();
+		ih = t->iconset->pixmap().height();
 		if (!t->label.isEmpty())
 		    iw +=2; 
 	    }
@@ -947,8 +950,8 @@
 	    int iw = 0;
 	    int ih = 0;
 	    if ( t->iconset != 0 ) {
-		iw = t->iconset->pixmap( QIconSet::Small, QIconSet::Normal ).width();
-		ih = t->iconset->pixmap( QIconSet::Small, QIconSet::Normal ).height();
+		iw = t->iconset->pixmap().width();
+		ih = t->iconset->pixmap().height();
 		if (!t->label.isEmpty())
 		    iw +=2; 
 	    }
@@ -977,7 +980,6 @@
     d->leftB->setGeometry( width() - 2*arrowWidth, 0, arrowWidth, height() );
 #endif
     layoutTabs();
-    updateArrowButtons();
     makeVisible( tab( currentTab() ));
 }
 
diff -urN qt-2.3.10-orig/src/widgets/qtoolbutton.cpp qt-2.3.10-new/src/widgets/qtoolbutton.cpp
--- qt-2.3.10-orig/src/widgets/qtoolbutton.cpp	2005-02-27 18:07:41.000000000 -0600
+++ qt-2.3.10-new/src/widgets/qtoolbutton.cpp	2005-04-14 13:03:02.600478800 -0500
@@ -332,12 +332,12 @@
 	QPixmap pm = iconSet(TRUE).pixmap(QIconSet::Large, QIconSet::Normal);
 	w = pm.width();
 	h = pm.height();
-	if ( w < 32 )
-	    w = 32;
-	if ( h < 32 )
-	    h = 32;
+	if ( w < 24 )
+	    w = 24;
+	if ( h < 24 )
+	    h = 24;
     } else {
-	w = h = 16;
+	w = h = 14;
 	QPixmap pm = iconSet(TRUE).pixmap(QIconSet::Small, QIconSet::Normal);
 	w = pm.width();
 	h = pm.height();
diff -urN qt-2.3.10-orig/src/widgets/qwindowsstyle.cpp qt-2.3.10-new/src/widgets/qwindowsstyle.cpp
--- qt-2.3.10-orig/src/widgets/qwindowsstyle.cpp	2005-02-27 18:07:41.000000000 -0600
+++ qt-2.3.10-new/src/widgets/qwindowsstyle.cpp	2005-04-14 13:02:10.442408032 -0500
@@ -1182,7 +1182,7 @@
 	h = fm.height() + 2*motifItemVMargin + 2*motifItemFrame;
 
     if ( !mi->isSeparator() && mi->iconSet() != 0 ) {
-	h = QMAX( h, mi->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height() + 2*motifItemFrame );
+	h = QMAX( h, mi->iconSet()->pixmap().height() + 2*motifItemFrame );
     }
     if ( mi->custom() )
 	h = QMAX( h, mi->custom()->sizeHint().height() + 2*motifItemVMargin + 2*motifItemFrame );
@@ -1246,7 +1246,11 @@
 	QIconSet::Mode mode = dis ? QIconSet::Disabled : QIconSet::Normal;
 	if (act && !dis )
 	    mode = QIconSet::Active;
-	QPixmap pixmap = mi->iconSet()->pixmap( QIconSet::Small, mode );
+	QPixmap pixmap;
+	if ( mode == QIconSet::Disabled )
+		pixmap = mi->iconSet()->pixmap( QIconSet::Automatic, QIconSet::Disabled );
+	else
+		pixmap = mi->iconSet()->pixmap();
 	int pixw = pixmap.width();
 	int pixh = pixmap.height();
 	if ( act && !dis ) {