diff -rup sc/source/filter/excel/xecontent.cxx sc/source/filter/excel/xecontent.cxx
--- sc/source/filter/excel/xecontent.cxx	2007-05-22 20:46:39.000000000 +0100
+++ sc/source/filter/excel/xecontent.cxx	2007-08-30 15:18:29.000000000 +0100
@@ -510,12 +510,17 @@ void XclExpHyperlink::WriteBody( XclExpS
 {
     sal_uInt16 nXclCol = static_cast< sal_uInt16 >( maScPos.Col() );
     sal_uInt16 nXclRow = static_cast< sal_uInt16 >( maScPos.Row() );
-    mxVarData->Seek( STREAM_SEEK_TO_BEGIN );
+    rStrm   << nXclRow << nXclRow << nXclCol << nXclCol;
+    WriteEmbeddedData( rStrm );
+}
 
-    rStrm   << nXclRow << nXclRow << nXclCol << nXclCol
-            << XclTools::maGuidStdLink
+void XclExpHyperlink::WriteEmbeddedData( XclExpStream& rStrm )
+{
+    rStrm << XclTools::maGuidStdLink
             << sal_uInt32( 2 )
             << mnFlags;
+
+    mxVarData->Seek( STREAM_SEEK_TO_BEGIN );
     rStrm.CopyFromStream( *mxVarData );
 }
 
diff -rup sc/source/filter/excel/xlocx.cxx sc/source/filter/excel/xlocx.cxx
--- sc/source/filter/excel/xlocx.cxx	2007-08-30 16:42:48.000000000 +0100
+++ sc/source/filter/excel/xlocx.cxx	2007-08-30 16:41:24.000000000 +0100
@@ -117,6 +117,10 @@ using com::sun::star::uno::UNO_QUERY_THR
 #ifndef SC_XEESCHER_HXX
 #include "xeescher.hxx"
 #endif
+#include "xecontent.hxx"
+#include <svx/flditem.hxx>
+#include "userdat.hxx"
+#include "drwlayer.hxx"
 
 using ::rtl::OUString;
 using ::com::sun::star::uno::Reference;
@@ -554,3 +556,33 @@ ShapeInteractionHelper::CreateShapeObj(const X
 {
     return new XclExpShapeObj( rRoot, xShape );
 }
+void
+ShapeInteractionHelper::PopulateShapeInteractionInfo(const XclExpRoot& rRoot, const Reference< XShape >& xShape, EscherExHostAppData& rHostAppData )
+{
+   try
+   {
+      SvMemoryStream* pMemStrm = NULL;
+      OUString sHyperLink;
+      OUString sMacro;
+      if ( ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( ::GetSdrObjectFromXShape( xShape ) ) )
+      {
+         sHyperLink = pInfo->GetHlink();      
+         sMacro = pInfo->GetMacro();
+      }
+      if (  sHyperLink.getLength() > 0 )
+      {
+         pMemStrm = new SvMemoryStream();
+         XclExpStream tmpStream( *pMemStrm, rRoot );
+         ScAddress dummyAddress;
+         SvxURLField aUrlField;
+         aUrlField.SetURL( sHyperLink );
+         XclExpHyperlink hExpHlink( rRoot, aUrlField, dummyAddress );
+         hExpHlink.WriteEmbeddedData( tmpStream );
+      }
+      if ( ( sHyperLink.getLength() > 0 ) || ( sMacro.getLength() > 0 ) )
+          rHostAppData.SetInteractionInfo( new InteractionInfo( pMemStrm, true ) );
+   }
+   catch( Exception& )
+   {
+   }
+}
diff -rup sc/source/filter/inc/xecontent.hxx sc/source/filter/inc/xecontent.hxx
--- sc/source/filter/inc/xecontent.hxx	2006-07-10 14:53:28.000000000 +0100
+++ sc/source/filter/inc/xecontent.hxx	2007-08-30 15:16:07.000000000 +0100
@@ -133,6 +133,7 @@ public:
     /** Returns the cell representation text or 0, if not available. */
     inline const String* GetRepr() const { return mxRepr.get(); }
 
+    virtual void        WriteEmbeddedData( XclExpStream& rStrm );
 private:
     /** Builds file name from the passed file URL. Tries to convert to relative file name.
         @param rnLevel  (out-param) The parent directory level.
diff -rup sc/source/filter/inc/xlocx.hxx sc/source/filter/inc/xlocx.hxx
--- sc/source/filter/inc/xlocx.hxx	2007-08-30 16:42:48.000000000 +0100
+++ sc/source/filter/inc/xlocx.hxx	2007-08-30 16:42:28.000000000 +0100
@@ -170,12 +170,14 @@ private:
 };
 
 class XclExpShapeObj;
+class EscherExHostAppData;
 
 class ShapeInteractionHelper
 {
 public:
    static XclExpShapeObj* CreateShapeObj(const XclExpRoot& rRoot, const ::com::sun::star::uno::Reference<
                             ::com::sun::star::drawing::XShape >& xShape );
+   static void PopulateShapeInteractionInfo( const XclExpRoot& rRoot, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& xShape, EscherExHostAppData& rHostAppData );
 };
 // ============================================================================
 
diff -rup sc/source/filter/xcl97/xcl97esc.cxx sc/source/filter/xcl97/xcl97esc.cxx
--- sc/source/filter/xcl97/xcl97esc.cxx	2007-08-30 16:42:48.000000000 +0100
+++ sc/source/filter/xcl97/xcl97esc.cxx	2007-08-30 16:09:45.000000000 +0100
@@ -259,7 +259,8 @@ EscherExHostAppData* XclEscherEx::StartS
             // #107540# ignore permanent note shapes
             // #i12190# do not ignore callouts (do not filter by object type ID)
             //pCurrXclObj = new XclObjAny( rRoot );   // just a metafile
             pCurrXclObj = ShapeInteractionHelper::CreateShapeObj( rRoot, rShape );
+            ShapeInteractionHelper::PopulateShapeInteractionInfo( rRoot, rShape, *pCurrAppData );	
         }
 	}
 	if ( pCurrXclObj )
@@ -373,6 +376,7 @@ void XclEscherEx::DeleteCurrAppData()
 		delete pCurrAppData->GetClientAnchor();
 //		delete pCurrAppData->GetClientData();
 		delete pCurrAppData->GetClientTextbox();
+		delete pCurrAppData->GetInteractionInfo();
 		delete pCurrAppData;
 	}
 }
diff -rup svx/source/msfilter/eschesdo.cxx svx/source/msfilter/eschesdo.cxx
--- svx/source/msfilter/eschesdo.cxx	2007-06-27 19:33:27.000000000 +0100
+++ svx/source/msfilter/eschesdo.cxx	2007-08-30 16:16:48.000000000 +0100
@@ -314,6 +314,19 @@ UINT32 ImplEESdrWriter::ImplWriteShape( 
         // #i51348# shape name
         if( aShapeName.Len() > 0 )
             aPropOpt.AddOpt( ESCHER_Prop_wzName, aShapeName );
+        if ( InteractionInfo* pInteraction = mpHostAppData->GetInteractionInfo() )
+		{
+			const std::auto_ptr< SvMemoryStream >& pMemStrm = pInteraction->getHyperlinkRecord();
+			if ( pMemStrm.get() )
+			{
+				pMemStrm->ObjectOwnsMemory( FALSE );
+				sal_uInt8* pBuf = (sal_uInt8*) pMemStrm->GetData();
+				sal_uInt32 nSize = pMemStrm->Seek( STREAM_SEEK_TO_END );
+				aPropOpt.AddOpt( ESCHER_Prop_pihlShape, sal_False, nSize, pBuf, nSize );;       
+			}
+			if ( pInteraction->hasInteraction() )
+				aPropOpt.AddOpt( ESCHER_Prop_fPrint, 0x00080008 );       
+        }
 
 		if ( rObj.GetType().EqualsAscii( "drawing.Custom" ) )
 		{
--- svx/inc/svx/escherex.hxx.b4	2007-09-27 15:42:25.000000000 +0100
+++ svx/inc/svx/escherex.hxx	2007-09-27 15:55:52.000000000 +0100
@@ -77,7 +77,7 @@
 #ifndef INCLUDED_SVXDLLAPI_H
 #include "svx/svxdllapi.h"
 #endif
-
+#include <memory>
 		/*Record Name       FBT-Value   Instance                  Contents                                                          Wrd Exl PPt Ver*/
 // In der Mickysoft-Doku heissen die msofbt... statt ESCHER_...
 #define ESCHER_DggContainer      0xF000 /*                           per-document data 
@@ -1273,6 +1273,19 @@ public:
 									const Rectangle& rRect ) = 0;
 };
 
+class InteractionInfo
+{
+	bool 			mbHasInteraction;
+	std::auto_ptr<SvMemoryStream>		mpHyperlinkRecord;
+	InteractionInfo();
+public:
+	InteractionInfo( SvMemoryStream* pStream, bool bInteraction ) : mbHasInteraction( bInteraction )
+	{
+		mpHyperlinkRecord.reset( pStream );
+	}
+	bool	hasInteraction() { return mbHasInteraction; }
+	const std::auto_ptr< SvMemoryStream >&	getHyperlinkRecord() { return mpHyperlinkRecord; }
+};
 
 class EscherExHostAppData
 {
@@ -1280,14 +1298,17 @@ private:
 		EscherExClientAnchor_Base*	pClientAnchor;
 		EscherExClientRecord_Base*	pClientData;
 		EscherExClientRecord_Base*	pClientTextbox;
+		InteractionInfo*		pInteractionInfo;
 		// ignore single shape if entire pages are written
 		BOOL						bDontWriteShape;
 
 public:
 		EscherExHostAppData() : pClientAnchor(0), pClientData(0),
-								pClientTextbox(0), bDontWriteShape(FALSE)
+								pClientTextbox(0), pInteractionInfo(0), bDontWriteShape(FALSE)
 		{}
 
+		void SetInteractionInfo( InteractionInfo* p )
+			{ pInteractionInfo = p; }
 		void SetClientAnchor( EscherExClientAnchor_Base* p )
 			{ pClientAnchor = p; }
 		void SetClientData( EscherExClientRecord_Base* p )
@@ -1296,6 +1317,8 @@ public:
 			{ pClientTextbox = p; }
 		void SetDontWriteShape( BOOL b )
 			{ bDontWriteShape = b; }
+		InteractionInfo* GetInteractionInfo() const
+			{ return pInteractionInfo; }
 		EscherExClientAnchor_Base* GetClientAnchor() const
 			{ return pClientAnchor; }
 		EscherExClientRecord_Base* GetClientData() const
