diff -u -r abi-0.7.8.orig/src/text/fmt/xp/fp_Run.cpp abi-0.7.8/src/text/fmt/xp/fp_Run.cpp
--- abi-0.7.8.orig/src/text/fmt/xp/fp_Run.cpp	Fri Jan  7 10:51:40 2000
+++ abi-0.7.8/src/text/fmt/xp/fp_Run.cpp	Fri Mar 17 15:35:26 2000
@@ -376,6 +376,7 @@
 	
 	UT_RGBColor clrSelBackground(192, 192, 192);
 	UT_RGBColor clrNormalBackground(255,255,255);
+	UT_RGBColor clrTabColor(128,128,128);
 
 	UT_sint32 iFillHeight = m_pLine->getHeight();
 	UT_sint32 iFillTop = pDA->yoff - m_pLine->getAscent();
@@ -386,6 +387,8 @@
 
 	UT_uint32 iSel1 = UT_MIN(iSelAnchor, iPoint);
 	UT_uint32 iSel2 = UT_MAX(iSelAnchor, iPoint);
+
+	UT_UCSChar chTab = 0xBB; //FIXME: char ">>" in latin1
 	
 	UT_ASSERT(iSel1 <= iSel2);
 	
@@ -402,6 +405,11 @@
 	{
 		m_pG->fillRect(clrNormalBackground, pDA->xoff, iFillTop, m_iWidth, iFillHeight);
 	}
+	if( pView->getShowPara() ) 
+	{
+	        m_pG->setColor(clrTabColor);
+	        m_pG->drawChars(&chTab, 0, 1, pDA->xoff, iFillTop);
+	}
 }
 
 //////////////////////////////////////////////////////////////////
@@ -1070,10 +1078,37 @@
 {
 	UT_ASSERT(!m_bDirty);
 	UT_ASSERT(m_pG->queryProperties(GR_Graphics::DGP_SCREEN));
+
+	UT_sint32 xoff=0, yoff=0;
+	UT_sint32 iLineHeight = m_pLine->getHeight();
+
+	FV_View* pView = m_pBL->getDocLayout()->getView();
+	UT_sint32 iXStart = pView->getPageViewLeftMargin() + 1; 
+	UT_sint32 iXEnd   = pView->getWindowWidth() + iXStart;
+
+	m_pLine->getScreenOffsets(this, xoff, yoff);
+	//fprintf(stderr, "iXStart: %i, iXEnd: %i \n",iXStart, iXEnd);
+	//FIXME: clear always? or just if( pView->getShowPara() == true ) ?
+	m_pG->clearArea(iXStart, yoff, iXEnd, iLineHeight);
 }
 
 void fp_ForcedPageBreakRun::_draw(dg_DrawArgs* pDA)
 {
 	UT_ASSERT(pDA->pG == m_pG);
+	
+	FV_View* pView = m_pBL->getDocLayout()->getView();
+	UT_ASSERT(pView != NULL);
+	if( pView->getShowPara() ) 
+	{
+	        UT_RGBColor clrPageBreak(128,128,128);
+		UT_sint32 iLineHeight = m_pLine->getHeight();
+		UT_sint32 iXStart = pView->getPageViewLeftMargin() + 1; 
+		UT_sint32 iXEnd   = pView->getWindowWidth() + iXStart;
+		// FIXME: sometimes iXEnd is far too big (2*regular iXEnd) Why?
+		// fprintf(stderr, "iXStart: %i, iXEnd: %i \n",iXStart, iXEnd);
+		m_pG->setColor(clrPageBreak);
+		m_pG->drawLine(iXStart, pDA->yoff - (iLineHeight/2) , 
+			       iXEnd, pDA->yoff - (iLineHeight/2));
+	}
 }
 
diff -u -r abi-0.7.8.orig/src/text/fmt/xp/fp_TextRun.cpp abi-0.7.8/src/text/fmt/xp/fp_TextRun.cpp
--- abi-0.7.8.orig/src/text/fmt/xp/fp_TextRun.cpp	Fri Jan 28 14:51:34 2000
+++ abi-0.7.8/src/text/fmt/xp/fp_TextRun.cpp	Fri Mar 17 20:31:37 2000
@@ -809,7 +809,10 @@
 			_drawPart(pDA->xoff, yTopOfRun, iSel2 - iBase, m_iLen - (iSel2 - iRunBase), pgbCharWidths);
 		}
 	}
-
+	if( pView->getShowPara() )
+	{
+	        _drawSpaces(pDA->xoff, yTopOfRun, m_iOffsetFirst, m_iLen, pgbCharWidths); 
+	}
 	_drawDecors(pDA->xoff, yTopOfRun);
 
 	// TODO: draw this underneath (ie, before) the text and decorations
@@ -880,6 +883,72 @@
 		pRect->width += pCharWidths[i];
 	}
 }
+
+void fp_TextRun::_drawSpaces(UT_sint32 xoff,
+                             UT_sint32 yoff,
+                             UT_uint32 iStart,
+                             UT_uint32 iLen,
+                             const UT_GrowBuf * pgbCharWidths)
+{
+        const UT_UCSChar* pSpan;
+        UT_uint32 lenSpan;
+        UT_uint32 offset = iStart;
+        UT_uint32 len = iLen;
+        UT_Bool bContinue = UT_TRUE;
+
+	UT_UCSChar chSpaceDot = 0xB7; // FIXME: latin1 "." 
+        UT_RGBColor clrSpaceDot(128,128,128);
+	
+	m_pG->setColor(clrSpaceDot);
+	// don't even try to draw a zero-length run
+	if (m_iLen == 0)
+        {
+               return;
+        }
+        UT_ASSERT(offset >= m_iOffsetFirst);
+        UT_ASSERT(offset + len <= m_iOffsetFirst + m_iLen);
+
+        UT_uint32 iLeftWidth = 0;
+        const UT_uint16 * pCharWidths = pgbCharWidths->getPointer(0);
+
+        UT_uint32 i;
+        for (i=m_iOffsetFirst; i<iStart; i++)
+        {
+                iLeftWidth += pCharWidths[i];
+        }
+
+        while (bContinue)
+        {
+                bContinue = m_pBL->getSpanPtr(offset, &pSpan, &lenSpan);
+                UT_ASSERT(lenSpan>0);
+               
+                if (len <= lenSpan)
+                {
+                       for(int i=0; i<len;i++) 
+                       {
+                              if(pSpan[i] == UCS_SPACE) 
+                                      m_pG->drawChars(&chSpaceDot, 0, 1, xoff + iLeftWidth, yoff);
+                              iLeftWidth += pCharWidths[offset + i]; 
+                       }
+                       bContinue = UT_FALSE;
+                }
+                else
+                {
+                       for(int i=0; i<lenSpan;i++) 
+                       {
+                              if(pSpan[i] == UCS_SPACE) 
+                                      m_pG->drawChars(&chSpaceDot, 0, 1, xoff + iLeftWidth, yoff);
+                              iLeftWidth += pCharWidths[offset + i];
+                       }  
+                       offset += lenSpan;
+                       len -= lenSpan;
+
+                       UT_ASSERT(offset >= m_iOffsetFirst);
+                       UT_ASSERT(offset + len <= m_iOffsetFirst + m_iLen);
+                }
+        }
+}
+
 
 void fp_TextRun::_drawPart(UT_sint32 xoff,
 						   UT_sint32 yoff,
diff -u -r abi-0.7.8.orig/src/text/fmt/xp/fp_TextRun.h abi-0.7.8/src/text/fmt/xp/fp_TextRun.h
--- abi-0.7.8.orig/src/text/fmt/xp/fp_TextRun.h	Sat Jan 29 02:07:13 2000
+++ abi-0.7.8/src/text/fmt/xp/fp_TextRun.h	Fri Mar 17 20:32:45 2000
@@ -103,6 +103,12 @@
 									  UT_uint32 iLen,
 									  const UT_GrowBuf * pgbCharWidths);
 
+	void					_drawSpaces(UT_sint32 xoff,
+									  UT_sint32 yoff,
+									  UT_uint32 iStart,
+									  UT_uint32 iLen,
+									  const UT_GrowBuf * pgbCharWidths);
+
 	void					_fillRect(UT_RGBColor& clr,
 									  UT_sint32 xoff,
 									  UT_sint32 yoff,
diff -u -r abi-0.7.8.orig/src/text/fmt/xp/fv_View.cpp abi-0.7.8/src/text/fmt/xp/fv_View.cpp
--- abi-0.7.8.orig/src/text/fmt/xp/fv_View.cpp	Tue Feb  1 11:34:39 2000
+++ abi-0.7.8/src/text/fmt/xp/fv_View.cpp	Fri Mar 17 16:06:43 2000
@@ -30,6 +30,7 @@
 #include "ut_timer.h"
 
 #include "xav_View.h"
+#include "xap_Frame.h"
 #include "fv_View.h"
 #include "fl_DocLayout.h"
 #include "fl_BlockLayout.h"
@@ -51,6 +52,7 @@
 #include "xap_Clipboard.h"
 #include "ap_TopRuler.h"
 #include "ap_LeftRuler.h"
+#include "ap_FrameData.h"
 #include "ap_Prefs.h"
 
 #include "sp_spell.h"
@@ -106,6 +108,14 @@
 	m_chg.propsChar = NULL;
 	m_chg.propsBlock = NULL;
 	m_chg.propsSection = NULL;
+
+	// make sure, that showPara is in sync with the Frame
+	XAP_Frame * pFrame = (XAP_Frame *) this->getParentData();
+	UT_ASSERT(pFrame);
+	
+	AP_FrameData *pFrameData = (AP_FrameData *)pFrame->getFrameData();
+	UT_ASSERT(pFrameData);
+	this->setShowPara( pFrameData->m_bShowPara );
 
 	pLayout->setView(this);
 		
diff -u -r abi-0.7.8.orig/src/text/fmt/xp/fv_View.h abi-0.7.8/src/text/fmt/xp/fv_View.h
--- abi-0.7.8.orig/src/text/fmt/xp/fv_View.h	Tue Feb  1 11:34:39 2000
+++ abi-0.7.8/src/text/fmt/xp/fv_View.h	Fri Mar 17 15:09:55 2000
@@ -156,6 +156,9 @@
 	void insertParagraphBreak(void);
 	void insertSectionBreak(void);
 
+	UT_Bool getShowPara(void) { return m_bShowPara; };
+	void setShowPara(UT_Bool bShowPara) { m_bShowPara = bShowPara; };
+
 // ----------------------
 	UT_Bool			isLeftMargin(UT_sint32 xPos, UT_sint32 yPos);
 	void			cmdSelect(UT_sint32 xPos, UT_sint32 yPos, FV_DocPos dpBeg, FV_DocPos dpEnd);
@@ -316,6 +319,9 @@
 	UT_Bool				m_bCursorBlink;
 	
 	fv_ChangeState		m_chg;
+
+	// show Paragraphs
+	UT_Bool                 m_bShowPara;
 
 	// find and replace stuff
 	UT_Bool				m_wrappedEnd;
diff -u -r abi-0.7.8.orig/src/wp/ap/xp/ap_EditMethods.cpp abi-0.7.8/src/wp/ap/xp/ap_EditMethods.cpp
--- abi-0.7.8.orig/src/wp/ap/xp/ap_EditMethods.cpp	Tue Feb  1 11:34:40 2000
+++ abi-0.7.8/src/wp/ap/xp/ap_EditMethods.cpp	Fri Mar 17 16:03:11 2000
@@ -3871,9 +3871,19 @@
 {
 	XAP_Frame * pFrame = (XAP_Frame *) pAV_View->getParentData();
 	UT_ASSERT(pFrame);
+	
+	AP_FrameData *pFrameData = (AP_FrameData *)pFrame->getFrameData();
+	UT_ASSERT(pFrameData);
+
+	// toggle the "Show Paragraph" bit
+	pFrameData->m_bShowPara = ! pFrameData->m_bShowPara;
+
+	// actually do the dirty work
+	ABIWORD_VIEW;
+	pView->setShowPara( pFrameData->m_bShowPara );
+	pView->draw();
+	// FIXME: save this value in the prefence-file? or in the document?
 
-	// TODO: synch this implementation with ap_GetState_View
-	s_TellNotImplemented(pFrame, "Show/Hide Paragraphs", __LINE__);
 	return UT_TRUE;
 }
 
diff -u -r abi-0.7.8.orig/src/wp/ap/xp/ap_FrameData.cpp abi-0.7.8/src/wp/ap/xp/ap_FrameData.cpp
--- abi-0.7.8.orig/src/wp/ap/xp/ap_FrameData.cpp	Thu Dec  2 00:51:03 1999
+++ abi-0.7.8/src/wp/ap/xp/ap_FrameData.cpp	Fri Mar 17 16:07:53 2000
@@ -32,6 +32,7 @@
 	m_pDocLayout = NULL;
 	m_pG = NULL;
 	m_bShowRuler = UT_TRUE;		// TODO : change to Prefs
+	m_bShowPara  = UT_FALSE;
 	m_pTopRuler = NULL;
 	m_pLeftRuler = NULL;
 	m_pStatusBar = NULL;
diff -u -r abi-0.7.8.orig/src/wp/ap/xp/ap_FrameData.h abi-0.7.8/src/wp/ap/xp/ap_FrameData.h
--- abi-0.7.8.orig/src/wp/ap/xp/ap_FrameData.h	Thu Dec  2 00:51:03 1999
+++ abi-0.7.8/src/wp/ap/xp/ap_FrameData.h	Fri Mar 17 15:20:26 2000
@@ -46,6 +46,7 @@
 	GR_Graphics *		m_pG;
 
 	UT_Bool				m_bShowRuler;
+	UT_Bool                 m_bShowPara;
 	AP_TopRuler *		m_pTopRuler;
 	AP_LeftRuler *		m_pLeftRuler;
 
diff -u -r abi-0.7.8.orig/src/wp/ap/xp/ap_Menu_Functions.cpp abi-0.7.8/src/wp/ap/xp/ap_Menu_Functions.cpp
--- abi-0.7.8.orig/src/wp/ap/xp/ap_Menu_Functions.cpp	Mon Jan 10 20:32:37 2000
+++ abi-0.7.8/src/wp/ap/xp/ap_Menu_Functions.cpp	Fri Mar 17 15:18:36 2000
@@ -535,6 +535,12 @@
 		break;
 
 	case AP_MENU_ID_VIEW_SHOWPARA:
+	        if( pFrameData->m_bShowPara )
+		        s = EV_MIS_Toggled;
+		else
+		        s = EV_MIS_ZERO;
+		break;
+		  
 	case AP_MENU_ID_VIEW_HEADFOOT:
 		// TODO: implement view methods to check, toggle state
 		s = EV_MIS_Gray;

