<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>MCMS</title>
        <link>http://blogs.interakting.co.uk/danmatthews/category/14.aspx</link>
        <description>Legacy MCMS</description>
        <language>en-GB</language>
        <copyright>Dan Matthews</copyright>
        <managingEditor>dmatthews@businessdecision.co.uk</managingEditor>
        <generator>Subtext Version 1.9.5.177</generator>
        <item>
            <title>Emptying the Deleted Items in MCMS</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2007/11/16/115.aspx</link>
            <description>&lt;p&gt;So you might have an MCMS site that has been kicking around for a few years... lots of content has been deleted. Site is getting sluggish. You go into Site Manager to empty the deleted items and everything you click takes 1 minute to respond. Emptying the deleted items is useless - it just crashes. The reason for this, I think, is that it retrieves XML from MCMS and when trying to manipulate the huge XML files in the XML DOM it just falls over. The DOM does have a maximum logical size of XML it can manipulate before performance degrades quickly.&lt;/p&gt;
&lt;p&gt;What to do?&lt;/p&gt;
&lt;p&gt;Well it's a nasty one as there is no API call to empty the deleted items. Microsoft - who I've logged support calls with about this - have taken over a year to come back with nothing. Basically, you're on your own.&lt;/p&gt;
&lt;p&gt;Now the MCMS schema is a bit nasty and &lt;font color="#ff0000"&gt;if you do anything to the MCMS database directly you may invalidate your Microsoft support&lt;/font&gt;. Having said that, it's the only way I could find to empty the deleted items without Site Manager.&lt;/p&gt;
&lt;p&gt;Here is the script I wrote and used. Use it ENTIRELY at your own risk. I suggest you figure out what it's doing before you run it. Good luck!&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- properties (historical)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting properties (historical)'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from NodeProperty where NodeId in&lt;br /&gt;
(select Id from Node where ArchiveSourceGUID in&lt;br /&gt;
(select FollowGUID from Node where DeletedWhen is not null and Type=16))&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- resources (historical)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting resources (historical)'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from NodeResource where NodeId in&lt;br /&gt;
(select Id from Node where ArchiveSourceGUID in&lt;br /&gt;
(select FollowGUID from Node where DeletedWhen is not null and Type=16))&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- roles (historical)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting roles (historical)'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from NodeRole where NodeId in&lt;br /&gt;
(select Id from Node where ArchiveSourceGUID in&lt;br /&gt;
(select FollowGUID from Node where DeletedWhen is not null and Type=16))&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- placeholder content (historical)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting placeholder content (historical)'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from NodePlaceholderContent where NodeId in&lt;br /&gt;
(select Id from Node where ArchiveSourceGUID in&lt;br /&gt;
(select FollowGUID from Node where DeletedWhen is not null and Type=16))&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- placeholders (historical)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting placeholders (historical)'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from NodePlaceholder where NodeId in&lt;br /&gt;
(select Id from Node where ArchiveSourceGUID in&lt;br /&gt;
(select FollowGUID from Node where DeletedWhen is not null and Type=16))&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- postings (historical)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting postings (historical)'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from Node where ArchiveSourceGUID in&lt;br /&gt;
(select FollowGUID from Node where DeletedWhen is not null and Type=16)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- properties (current)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting properties (current)'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from NodeProperty where NodeId in&lt;br /&gt;
(select Id from Node where NodeGUID in&lt;br /&gt;
(select FollowGUID from Node where DeletedWhen is not null and Type=16))&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- resources (current)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting resources (current)'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from NodeResource where NodeId in&lt;br /&gt;
(select Id from Node where NodeGUID in&lt;br /&gt;
(select FollowGUID from Node where DeletedWhen is not null and Type=16))&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- roles (current)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting roles (current)'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from NodeRole where NodeId in&lt;br /&gt;
(select Id from Node where NodeGUID in&lt;br /&gt;
(select FollowGUID from Node where DeletedWhen is not null and Type=16))&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- placeholder content (current)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting placeholder content (current)'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from NodePlaceholderContent where NodeId in&lt;br /&gt;
(select Id from Node where NodeGUID in&lt;br /&gt;
(select FollowGUID from Node where DeletedWhen is not null and Type=16))&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- placeholders (current)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting placeholders (current)'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from NodePlaceholder where NodeId in&lt;br /&gt;
(select Id from Node where NodeGUID in&lt;br /&gt;
(select FollowGUID from Node where DeletedWhen is not null and Type=16))&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- postings (current)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting postings (current)'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from Node where NodeGUID in&lt;br /&gt;
(select FollowGUID from Node where DeletedWhen is not null and Type=16)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- pages&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting pages'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from Node where DeletedWhen is not null and Type=16&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- channel properties&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting channel properties'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from NodeProperty where NodeId in&lt;br /&gt;
(select Id from Node where DeletedWhen is not null and Type=4)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- channel roles&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting channel roles'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from NodeRole where NodeId in&lt;br /&gt;
(select Id from Node where DeletedWhen is not null and Type=4)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;-- channels&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;print 'deleting channels'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" color="#3366ff"&gt;delete from Node where DeletedWhen is not null and Type=4&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;/font&gt; &lt;font face="Arial"&gt;&lt;br /&gt;
&lt;/font&gt; &lt;/p&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/115.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2007/11/16/115.aspx</guid>
            <pubDate>Fri, 16 Nov 2007 16:15:49 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/115.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2007/11/16/115.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/115.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Targetting non-Office placeholders with the Word Authoring Connector</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2007/03/29/11.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This article only refers to &lt;em&gt;content&lt;/em&gt; placeholders, ie text, although much of the article would apply equally to attachment placeholders, albeit requring a little more effort.&lt;/p&gt;
&lt;p&gt;When handling postings in MCMS using the Word Authoring Connector, there is no built-in way to target multiple or specific placeholders. The only way to ensure that the correct placeholder content is populated is to create the template definition with an OfficeHtmlPlaceholder definition or only place one HtmlPlaceholder definition on the page (the 'first' one is used if there are multiple HtmlPlaceholders - if there are multiple OfficeHtmlPlaceholders the content is placed in all of them).&lt;/p&gt;
&lt;p&gt;Whilst this will meet most needs adequately, there are several cases where this could be a limitation. For example:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Targetting custom placeholders (the WAC will only target HtmlPlaceholder and OfficeHtmlPlaceholder) &lt;/li&gt;
    &lt;li&gt;A requirement to target multiple placeholders... don't expect a clean solution for this one :) &lt;/li&gt;
    &lt;li&gt;Requirement to target a specific HtmlPlaceholder which isn't 'first' &lt;/li&gt;
    &lt;li&gt;Requirement to target something which isn't a placeholder (possibly a custom property, for example)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although some customisation of the WAC is possible, essentially it's a 'black box' and what you see is what you get. It's targetting logic is buried within and can't be tweaked. Fortunately, there's a fairly easy way to get around the limitations above.&lt;/p&gt;
&lt;p&gt;The core concept is to add an OfficeHtmlPlaceholder on the template which remains hidden. This placeholder will &lt;em&gt;always&lt;/em&gt; be targetted by the WAC (if there's more than one on the template, they'll all be targetted). The placeholder will be used as a 'holding area' for the content.&lt;/p&gt;
&lt;p&gt;When the WAC is used to update/create a posting, the posting will then be at a 'Saved' state awaiting Approval. This is where the little bit of magic comes in.&lt;/p&gt;
&lt;p&gt;As the posting should always be opened up to be approved (or rejected), then we can make use of the posting load event to take the content from our OfficeHtmlPlaceholder holding area and put it into the correct place/s.&lt;/p&gt;
&lt;p&gt;A practical example of this follows. A template has two HtmlPlaceholders defined, and the code shown targets the &lt;em&gt;second &lt;/em&gt;one. This could occur if, for instance, you want the body to be added using the WAC and then the title to be added at the approval stage. The steps can be followed to demonstrate the technique (reasonable prior experience of MCMS and the WAC is assumed).&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Create a Template Definition with two HtmlPlaceholder definitions called 'HtmlTitle' and 'HtmlBody'. Also create an OfficePlaceholderDefinition called 'OfficeHtmlHoldingContainer'. There's no need to put any restrictions on any of these placeholders as that will only complicate matters. &lt;/li&gt;
    &lt;li&gt;Create a .ASPX template file and hook it up to the template definition created in (1). &lt;/li&gt;
    &lt;li&gt;Add three HtmlPlaceholderControl controls to the template, and hook each up to one of the placeholder definitions. Ensure that the control hooked up to OfficeHtmlHoldingContainer has the Visible and EnableAuthoring properties both set to False. &lt;/li&gt;
    &lt;li&gt;Create an empty class called AuthoringConnectorSupport.cs. &lt;/li&gt;
    &lt;li&gt;Paste the following code into the new class created in (4):&lt;br /&gt;
    &lt;br /&gt;
    &lt;font face="Courier New" color="#0000ff" size="2"&gt;  public AuthoringConnectorSupport() // just an empty constructor&lt;br /&gt;
      {&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      /// &lt;summary&gt;&lt;/summary&gt;&lt;br /&gt;
      /// Swap the Office placeholder content into targetted placeholder, if valid&lt;br /&gt;
      /// &lt;br /&gt;
       public void SwapOfficeContentInIfValid()&lt;br /&gt;
      {&lt;br /&gt;
       Posting oPosting = CmsHttpContext.Current.Posting;   if(oPosting.Placeholders["OfficeHtmlHoldingContainer"] != null &amp;amp;&amp;amp; oPosting.Placeholders["HtmlBody"] != null) // ensure basic required placeholders are present&lt;br /&gt;
       {&lt;br /&gt;
        if(oPosting.Placeholders["OfficeHtmlHoldingContainer"].Datasource.RawContent != "")&lt;br /&gt;
        {&lt;br /&gt;
         oPosting.Placeholders["HtmlBody"].Datasource.RawContent = oPosting.Placeholders["OfficeHtmlHoldingContainer"].Datasource.RawContent;&lt;br /&gt;
         oPosting.Placeholders["OfficeHtmlHoldingContainer"].Datasource.RawContent = "";     // uncomment this next line if you want the above to happen anyway, even if authoring is cancelled&lt;br /&gt;
         //CmsHttpContext.Current.CommitAll();&lt;br /&gt;
        }&lt;br /&gt;
       }&lt;br /&gt;
      }&lt;br /&gt;
    &lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;Add the following code into the Page_Load event of the template created in (2)&lt;br /&gt;
    &lt;br /&gt;
    &lt;font face="Courier New"&gt;&lt;font color="#0000ff" size="2"&gt;   // create an AC support object&lt;br /&gt;
       &lt;strong&gt;[insert namespace]&lt;/strong&gt;.AuthoringConnectorSupport oACSupport = new &lt;strong&gt;[insert namespace]&lt;/strong&gt;.AuthoringConnectorSupport();&lt;br /&gt;
       &lt;br /&gt;
       // ensure Office content is swapped in, if required&lt;br /&gt;
       oACSupport.SwapOfficeContentInIfValid();&lt;/font&gt;&lt;br /&gt;
    &lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;Set up a publishing task for the WAC in the PublishingTasks.xml file. &lt;/li&gt;
    &lt;li&gt;Create a posting of this template type using the WAC. &lt;/li&gt;
    &lt;li&gt;Approve the posting.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What should have happened is that at (9), the content which you entered in Word has been moved into the HtmlBody placeholder, which was the &lt;em&gt;second &lt;/em&gt;HtmlPlaceholder.&lt;/p&gt;
&lt;p&gt;This technique can be used to target any placeholder which will take textual content, such as a custom placeholder, and can be tweaked in the AuthoringConnectorSupport class if different properties are used for content.&lt;/p&gt;
&lt;p&gt;An extension of this technique can be used to target multiple placeholders, although the solution is not particularly 'clean'. In the Word document 'tags' can be added that will be read by the AuthoringConnectorSupport class. These tags could be placeholder names, or just words that get picked up and checked in the class via a switch statement, for example. Macros could even be used in Word to insert these 'tags'. The AuthoringConnectorClass would merely scan through the incoming content for these tags, split the string up and then share it out across the placeholders as required.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/11.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2007/03/29/11.aspx</guid>
            <pubDate>Thu, 29 Mar 2007 07:19:02 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/11.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2007/03/29/11.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/11.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Tree View not displaying through Web Author</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2007/03/28/10.aspx</link>
            <description>&lt;p&gt;I know that others have mentioned this one before, including &lt;a href="http://weblogs.asp.net/stefan_gossner"&gt;Stefan&lt;/a&gt;, but if you find that your tree-view control isn't loading, it's likely that your website isn't running under the wwwroot default folder. This means that you probably don't have the webctrl_client folder under your web root folder. Copy it over from wwwroot and that should sort you out.&lt;/p&gt;
&lt;p&gt;You might also need aspnet_client if you're using anything that utilises client-side ASP.NET generated scripting, such as validators.&lt;/p&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/10.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2007/03/28/10.aspx</guid>
            <pubDate>Wed, 28 Mar 2007 10:21:55 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/10.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2007/03/28/10.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/10.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Revision History within MCMS</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2007/03/25/9.aspx</link>
            <description>
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;Microsoft Content Management Server provides a fairly powerful revision history tool within the Web Author. It shows a list of versions, and can compare them for differences. However, MCMS doesn’t really help too much when trying to present older revisions to subscribers outside of the Web Author.&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;Typically, this situation could occur when a user might want to see what a page looked like a week, month or even a year ago. Whilst this situation would be rare in an Internet scenario, in an Intranet (or Extranet) scenario it would be more common. If an end-user had to contact one of the MCMS authors every time they needed to check the historical details of a page then it would rapidly become a fairly tedious and time-consuming task using the Web Author.&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;Ideally, there would be an extra flag that we could pass on the page QueryString to obtain a page version from a specific point in time. We could then show a list of revisions as hyperlinks and the end-user could click through to the version they wanted. Unfortunately, MCMS doesn’t provide that. Out-the-box, the pages you can ask for using URLs will give you either the published or (if present) unpublished version, and that’s the lot.&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;Thankfully, using the MCMS API and a little bit of trickery, there is a fairly simple way to get an older revision.&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;To get an old version of a current posting, the technique is to create a new posting based on the same template, and then copy across placeholder data as required. (I’ve tested this with HTML placeholders and it works fine. It may well work with image or attachment placeholders as well, although some tweaking may be required in the code.) The new posting can then be referenced by its ‘inner’ URL and you’re in business.&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;Here’s a step-by-step how to do it:&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;&lt;span style="mso-list: Ignore"&gt;1)&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;&lt;/span&gt;Create a new .aspx in the root of the website called “RevisionHistory.aspx. (Note: if preferred, you can create it as a MCMS template and create a posting from it. That works perfectly well. You’ll just need to change the page reference in the code fragments below.)&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;&lt;span style="mso-list: Ignore"&gt;2)&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;&lt;/span&gt;Create a new channel from your channel root called “_Historical”. Ensure that the properties of this channel are set to not crawlable and not indexable otherwise you might get some interesting search/navigation conundrums. Write access to this channel should be granted to everyone.&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;&lt;span style="mso-list: Ignore"&gt;3)&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;&lt;/span&gt;In the Page_Load of RevisionHistory.aspx, put the following code (you’ll need to add a &lt;b style="mso-bidi-font-weight: normal"&gt;using&lt;/b&gt; directive for &lt;b style="mso-bidi-font-weight: normal"&gt;Microsoft.ContentManagement.Publishing&lt;/b&gt;, if it’s not on the page already):&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;if(Request.QueryString["COPYGUID"] != null) // check there's a GUID (won't be when creating posting if this is driven as a Posting from a Template)&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;CmsApplicationContext oAppContext = new CmsApplicationContext(); // get an application context&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;// the app context is required as the HTTP context will not (probably) be in Update mode&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;// get current NT-authenticated user&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;System.Security.Principal.WindowsIdentity ident = (System.Security.Principal.WindowsIdentity) HttpContext.Current.User.Identity;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;// use NT user to authenticate against site&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;oAppContext.AuthenticateUsingUserHandle(ident.Token, PublishingMode.Update);&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;// get handle to posting referred to by GUID&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Posting oPosting = ((Posting) oAppContext.Searches.GetByGuid(Request.QueryString["COPYGUID"])).RevisionForDate(new DateTime(Convert.ToInt64(Request.QueryString["REVISIONTICKS"])));&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;// get Channel object for _Historical channel&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Channel chDest = (Channel) oAppContext.Searches.GetByPath("/Channels/_Historical");&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;// following code ensures that all postings in the destination channel created more than two hours ago are cleaned out (may only be 1 hour during BST because of the way 'created date' is stored for a Posting)&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;foreach(Posting oCheckPosting in chDest.Postings)&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;if(oCheckPosting.CreatedDate &amp;lt; DateTime.Now.Subtract(new TimeSpan(2, 0, 0)) &amp;amp;&amp;amp; oCheckPosting.Name != "_HistoricalDefault") // leave default channel page, if there&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;      &lt;/span&gt;oCheckPosting.Delete();&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;// create posting in _Historical channel&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Posting oNewPosting = chDest.CreatePosting(oPosting.Template);&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;// set page properties for new posting&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;oNewPosting.Name = "TemporaryRevisionPosting";&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;oNewPosting.DisplayName = "Temporary Revision Posting";&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;// these properties stop the temporary page from being hyperlink-followed or indexed&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;oNewPosting.IsRobotFollowable = false;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;oNewPosting.IsRobotIndexable = false;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;// loop through placeholders on new posting&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;foreach(Placeholder oPlaceholder in oNewPosting.Placeholders)&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;string sName = oPlaceholder.Name;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;if(oPosting.Placeholders[sName] != null) // check to make sure placeholder exists on original page&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;      &lt;/span&gt;oPlaceholder.Datasource.RawContent = "
Note: This is a HISTORICAL version. Click &lt;a href="&amp;quot; + oPosting.Url + &amp;quot;"&gt;here&lt;/a&gt; to see the CURRENT version." + oPosting.Placeholders[sName].Datasource.RawContent;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;// commit all content&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;oAppContext.CommitAll();&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;// navigate away to new posting&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Response.Redirect(oNewPosting.UrlInner); // ensure posting is navigated by GUID as many pages with same name&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;&lt;span style="mso-list: Ignore"&gt;4)&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;&lt;/span&gt;Create a user control called “RevisionLinks.ascx” or something similar&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;&lt;span style="mso-list: Ignore"&gt;5)&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;&lt;/span&gt;Copy the following code into the Page_Load of the user control (you’ll also need to add a &lt;b style="mso-bidi-font-weight: normal"&gt;using&lt;/b&gt; directive for &lt;b style="mso-bidi-font-weight: normal"&gt;Microsoft.ContentManagement.Publishing&lt;/b&gt;, if it’s not on the control already):&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;Literal oHyperlinks = new Literal();&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;foreach (Posting oHistoricalPostingItem in CmsHttpContext.Current.Posting.Revisions(true, false)) // iterate through historical items&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;oHyperlinks.Text = oHyperlinks.Text + "&lt;a href="\&amp;quot;/RevisionHistory.aspx?COPYGUID=&amp;quot;" ?&amp;revisionticks=" + oHistoricalPostingItem.RevisionDate.Ticks.ToString() + " +="" ohistoricalpostingitem.guid=""&gt;" + oHistoricalPostingItem.DisplayName + " on " + oHistoricalPostingItem.RevisionDate.ToString() + "&lt;/a&gt;&lt;br /&gt;";&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;font color="#0000ff"&gt;this.Controls.Add(oHyperlinks);&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;&lt;span style="mso-list: Ignore"&gt;6)&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;&lt;/span&gt;Drag-and-drop the user control on any template where you want to be able to view and click-through to the older revisions.&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;&lt;span style="mso-list: Ignore"&gt;7)&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;&lt;/span&gt;Try it out by viewing a posting that uses that template!&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;What should happen is that the user control renders out a list of hyperlinks of older versions. When clicked, those hyperlinks take the user to the RevisionHistory.aspx page, which creates a new posting based on the correct template and then copies across all placeholder data from the older revision to the new posting. The RevisionHistory.aspx page then redirects to the new posting. The redirect is a server redirect and so the user won’t even see it happen.&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;Note that the most recent revision in the history link will actually be the current version. Note also that there is a crucial limitation with this technique – the posting is shown based on the &lt;i style="mso-bidi-font-style: normal"&gt;current&lt;/i&gt; version of the template. The out-the-box Web Author revision history suffers from exactly the same limitation. It shouldn’t be a problem though, as long as there’s a policy to create a new template whenever anything more than a cosmetic change is required, rather than editing and saving over the old one.&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;There’s some more trickery in the code, like on-the-fly cleaning out of old temporary postings, but the code is commented so it should make sense.&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/9.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2007/03/25/9.aspx</guid>
            <pubDate>Sun, 25 Mar 2007 13:24:00 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/9.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2007/03/25/9.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/9.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>