<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="name" content="Apache OpenOffice" />
    <meta name="description" content="The official home page of the Apache OpenOffice open source project, home of OpenOffice Writer, Calc, Impress, Draw and Base." />
    <meta name="keywords" content="OpenOffice, Open Office, Apache OpenOffice, Apache Open Office, OpenOffice.org, Official, Official Site, Writer, Calc, Impress, Draw, Base, ODF, Open Document Format, free office editors" />
    <meta name="google-site-verification" content="I-hPf9Mn1dfj03oW79MDQoCJLeGc0cHaQleb1aXBzzg" />
    <meta name="p:domain_verify" content="bd1ba1fb9d25b0eb3d64891f89e9195e"/>
    <link rel="shortcut icon" href="./favicon.ico" type="image/x-icon" />
    <link rel="icon" href="./favicon.ico" type="image/x-icon" />
    <title>Apache OpenOffice - Official Site - The Free and Open Productivity Suite</title>
    <script src="./download/globalvars.js"></script>
    <script src="./msg_prop_l10n.js"></script>
    <script src="./download/languages.js"></script>
    <script src="./download/download.js"></script>
    <style>
    /* <![CDATA[ */
    /*-------------------- Exceptions on standard css -----------------------*/
    @import "./css/home.css";
    @import "./css/styles.css";
    @import "./css/exceptions.css";
    /* ]]> */
    </style>
    <script>
      function follow( platform ) {
        // _gaq.push( ['_trackEvent', 'social', 'followUs', platform] );

        if ( platform == 'ApacheBlog' ) {
          window.open( "https://blogs.apache.org/OOo/", "_blank" );
        } else if ( platform == 'Facebook' ) {
          window.open( "https://www.facebook.com/ApacheOO", "_blank" );
        } else if ( platform == 'Twitter' ) {
          window.open( "https://twitter.com/ApacheOO", "_blank" );
        } else if ( platform == 'YouTube' ) {
          window.open( "https://www.youtube.com/openoffice", "_blank" );
        }
      }

      function showEventBox() {
	// The text is defined in "/msg_prop_l10n.js".

	// Show the event box or not?
	if( l10n.index_event_box_show ) {
		// Show the banner logo and text with link and cursor as pointer.
		document.write( "<div id='event_box' onclick='window.open( \"" + l10n.index_event_box_text_href
			+ "\", \"_blank\" ); return false;'>"
			+ "<ul>"
			  + "<li>"
			    // Event banner logo on the left hand side.
			    + "<p style='float: left;'>"
			      + "<a href='" + l10n.index_event_box_graphic_href
				+ "' title='" + l10n.index_event_box_graphic_title + "' target='_blank'>"
				  + "<img src='" + l10n.index_event_box_graphic_src + "'"
				  + "alt='" + l10n.index_event_box_graphic_alt + "'"
				  + "height='" + l10n.index_event_box_graphic_height + "'"
				  + "width='" + l10n.index_event_box_graphic_width + "' />"
			      + "</a>"
			    + "</p>"

			    // Event text on the right hand side.
			    + "<p>"
			      + "<a style='color: black; text-decoration: none;'"
				+ "' title='" + l10n.index_event_box_text_title + "' target='_blank'>"
				+ l10n.index_event_box_text_text
			      + "</a>"
			    + "</p>"
			  + "</li>"
			+ "</ul>"
		+ "</div>" );
	}
      }

      function showAlertBox() {
	// The text is defined in "/msg_prop_l10n.js".

	// Show the alert box or not?
	if( l10n.index_alert_box_show ) {
		// Depending if link is available, make the whole DIV clickable or not.
		if( l10n.index_alert_box_href ) {
			// Show the text with link and cursor as pointer.
			document.write( "<div id='alert_box' onclick='window.open( \"" + l10n.index_alert_box_href
			+ "\", \"_blank\" ); return false;'><ul><li>" );

			// Show headline.
			document.write( "<h2 style='cursor: pointer;'>"
			+ l10n.index_alert_box_headline_text + "</h2>" );

			// Show text.
			if( l10n.index_alert_box_text_text ) {
				document.write( "<p style='cursor: pointer;'>"
				+ l10n.index_alert_box_text_text + "</p>" );
			}
		} else {
			// Show the text without link and normal cursor.
			document.write( "<div id='alert_box'><ul><li>" );

			// Show headline.
			document.write( "<h2 style='cursor: default;'>"
			+ l10n.index_alert_box_headline_text + "</h2>" );

			// Show text.
			if( l10n.index_alert_box_text_text ) {
				document.write( "<p style='cursor: default;'>"
				+ l10n.index_alert_box_text_text + "</p>" );
			}
		}
		document.write( "</li></ul></div>" ); // Alert box.
	}
      }

      function setRedirect() {
	// The text is defined in "/msg_prop_l10n.js".
	DL.NL_LANG	= "";					// Set to empty as both variables ...
	DL.LANG_SEL	= "";					// ... must not be used in following function.
	var lang_iso	= DL.getLanguage();			// Get the language ISO code from browser guessed data.
	var lang_mode	= "";					// Customized redirect mode.
	var lang_text	= "";					// Customized message text that can be shown.
	var link	= "";					// Override redirect mode.

	// Add ECMA262-5 Array methods if not supported natively.
	// To workaround that MSIE 8 and older do not support this function.
	if( !( 'indexOf' in Array.prototype ) ) {
		Array.prototype.indexOf= function( find, i ) {	// 'i' is an optional parameter.
			if( i === undefined ) {
				i = 0;
			}
			if( i < 0 ) {
				i+= this.length;
			}
			if( i < 0 ) {
				i = 0;
			}
			for( var n = this.length; i < n; i++ ) {
				if( i in this && this[ i ] === find ) {
					return i;
				}
			}
			return -1;
		};
	}

	// Fix for Portuguese (European) as they are named only "pt" without region code!
	if( lang_iso === "pt-pt" || lang_iso === "pt-PT" ) {
		lang_iso = "pt";
	}

	// Fix for Norwegian to map both "nb" and "nn" -> "nb", then after looking up globalvars we change "nb" -> "no"
	if( lang_iso === "no" || lang_iso === "no-NO" || lang_iso === "nn" || lang_iso === "nb-NO" || lang_iso === "nn-NO" ) {
		lang_iso = "nb";
	}

	// Query if the browser language is one of the released languages.
	// The array has 3 elements per language (defined in "/download/globalvars.js"
	for( var i = 0, j = DL.SEL_LANG.length; i < j; i = i + 3 ) {
	  // If the ISO code is found in the language array.
	  if( DL.SEL_LANG[ i ] === lang_iso ) {
	    // Query for the redirect method (defined in "/msg_prop_l10n.js", column 0).
	    lang_mode	= l10n.index_redirect_text[ i / 3 * 2 ];
	    lang_text	= l10n.index_redirect_text[ i / 3 * 2 + 1 ];
	    break;
	  }
	}

	// Convert the browser URL into a string.
	link = String( document.location );

	// Does the browser URL contain already a redirect mode?
	// If yes, set the new redirect mode to override the customized mode.
	if( link.indexOf( "hard" ) !== -1 ) {
	    lang_mode = "hard";
	} else if( link.indexOf( "soft" ) !== -1 ) {
	    lang_mode = "soft";
	} else if( link.indexOf( "none" ) !== -1 ) {
	    lang_mode = "none";
	}

	// Fix for English as main language for the website, it does not need a language code.
	if( lang_iso === "en-us" || lang_iso === "en-gb" || lang_iso === "en-uk" || lang_iso === "en" ||
	    lang_iso === "en-US" || lang_iso === "en-GB" || lang_iso === "en-UK" ) {
		lang_iso = "";
	}

	// Fix for Norwegian, since Download language is "nb" but site language is "no".
	if( lang_iso === "nb" ) {
		lang_iso = "no";
	}

	switch( lang_mode ) {
		case "hard":
			// Do not show a message, just redirect.
			window.open( "https://www.openoffice.org/" + lang_iso , "_self" );
			break;
		case "soft":
			// Show a message and redirect only on user's click.
			// Assign the message text that is defined in:
			// "/msg_prop_l10n.js", array "l10n.index_redirect_text", column 1),
			document.write( "<div id='redirect_box'"
			+ " onclick='window.open( \"https://www.openoffice.org/" + lang_iso + "\", \"_self\" );"
			+ "return false;'>"
			+ "<ul><li>"
			+ "<p>" + lang_text + "</p>"
			+ "</li></ul>"
			+ "</div>" ); // Redirect box.
			break;
		case "none":
		default:
			// Do nothing and show nothing.
	}

	return;
      }
    </script>
</head>

<body>

<!-- The text in the H1 tag is intentionally shown as not displayable, just to please accessibility tools like a
screen reader.
-->
<h1 style="display: none;">Apache OpenOffice</h1>

<div id="actionstatements">

  <script>
  <!--
  // Show event box.
  // Show a banner logo and message of the event.
  // In "/msg_prop_l10n.js": Change to 'true' to show the box that is defined in the variables.
  showEventBox();

  // Show alert box.
  // Show an important message or announcement.
  // In "/msg_prop_l10n.js": Change to 'true' to show the box that is defined in the variables.
  showAlertBox();

  // Show redirect box.
  // Show a text how to redirect to the NL webpage.
  // In "/msg_prop_l10n.js": Change the mode and text how a redirect to the respective NL webpage should be done.
  setRedirect();
  //-->
  </script>

  <ul>
    <li>
      <hr />
    </li>
    <li>
      <div class="action-info">
        <div class="action-text action-link">
          <a href="/why/index.html">
            <h2>I want to learn more about OpenOffice</h2>
            <p>What is Apache OpenOffice? And why should I use it?</p>
          </a>
        </div>
      </div>
    </li>
    <li>
      <hr />
    </li>
  </ul>

  <!-- Show the download link with currently available version number, loaded via JavaScript -->
  <script>
  <!--
  document.write( "<ul><li>"
    + "<div class='action-download'>"
      + "<div class='action-text action-link'>"
        + "<a href='/download/index.html'>"
          + "<h2>I want to download Apache OpenOffice</h2>"
          + "<p style='font-size: 1.0em; font-weight: bold;'>(Most recent release: " + DL.VERSION + ")</p>"
          + "<p>Download Apache OpenOffice for free <b>(really, no license fee!)</b> | "
            + "<a href='https://blogs.apache.org/OOo/entry/with_apache_openoffice_you_get'"
              + "title='Blog post: With Apache OpenOffice you get what you do not pay for' target='_blank'>"
              + "Click here to get more information"
            + "</a>."
          + "</p>"
        + "</a>"
      + "</div>"
    + "</div>"
  + "</li></ul>" );
  //-->
  </script>

  <!-- Show the download link, without version number -->
  <noscript>
    <div class="action-download">
      <div class="action-text action-link">
        <a href="/download/index.html">
          <h2>I want to download Apache OpenOffice</h2>
          <p>Download Apache OpenOffice for free, or find out about other ways of getting it.</p>
        </a>
      </div>
    </div>
  </noscript>

  <ul>
    <li>
      <hr />
    </li>
    <li>
      <div class="action-help">
        <div class="action-text action-link">
          <a href="/support/index.html">
            <h2>I need help with my OpenOffice</h2>
            <p>Help is at hand whenever you need it.</p>
          </a>
        </div>
      </div>
    </li>
    <li>
      <hr />
    </li>
    <li>
      <div class="action-extend">
        <div class="action-text action-link">
          <a href="/extensions/index.html">
            <h2>I want to do more with my OpenOffice</h2>
            <p>Extend Apache OpenOffice with additional functionality, templates and clipart.</p>
          </a>
        </div>
      </div>
    </li>
    <li>
      <hr />
    </li>
    <li>
      <div class="action-participate">
        <div class="action-text action-link">
          <a href="https://openoffice.apache.org/get-involved.html">
            <h2>I want to participate in OpenOffice</h2>
            <p>Apache OpenOffice is made with help from people all over the world. Feel free to contribute!</p>
          </a>
        </div>
      </div>
    </li>
    <li>
      <hr />
    </li>
    <li>
      <div class="action-social">
        <div class="action-text action-link">
          <a href="/social/index.html" onclick="javascript:follow( 'SocialLink' );">
            <h2>I want to stay in touch with OpenOffice</h2>
            <p>Follow the progress of OpenOffice via announce list, our blog or social media.</p>
          </a>
          <div class="action-social-extra">
            <p>
              <span style="padding: 0 5px; cursor: pointer;" onclick="javascript:follow( 'ApacheBlog' );"
                title="Follow our official Blog">
                <img src="/images/logo-rss-16.png" alt="Blog" />
                <a>Official Blog</a>
              </span>
              <span style="padding: 0 5px; cursor: pointer;" onclick="javascript:follow( 'Facebook' );"
                title="Follow us on Facebook">
                <img src="/images/logo-facebook-16.png" alt="Facebook" />
                <a>Facebook</a>
              </span>
              <span style="padding: 0 5px; cursor: pointer;" onclick="javascript:follow( 'Twitter' );"
                title="Follow us on Twitter">
                <img src="/images/logo-twitter-16.png" alt="Twitter" />
                <a>Twitter</a>
              </span>
              <span style="padding: 0 5px; cursor: pointer;" onclick="javascript:follow( 'YouTube' );"
                title="Subscribe to our YouTube channel">
                <img src="/images/logo-youtube-16.png" alt="YouTube" />
                <a>YouTube</a>
              </span>
            </p>
          </div>
        </div>
      </div>
    </li>
    <li>
      <hr />
    </li>
  </ul>

  <div id="SupportedAndSupporters">
    <a href="https://validator.w3.org/check?uri=referer"
    title="W3C Markup Validation Service - Check the markup (HTML, XHTML, ...) of Web documents">
    <img src="https://www.w3.org/Icons/valid-xhtml10-blue.png"
    alt="Valid XHTML 1.0!" height="31" width="88" /></a>
  </div>
</div>

<div id="news">

  <div class="first campaign" style="height: 210px; float: right; overflow: auto;">
    <h2>Recent Blog Posts</h2>

    <p style="text-align:right">
      <a href="https://blogs.apache.org/OOo/" target="_blank">All Posts</a>
    </p>

    <p>
      <em>22 July 2022:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-19">
      Announcing Apache OpenOffice 4.1.13</a>
      <br />

      <em>4 May 2022:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-18">
      Announcing Apache OpenOffice 4.1.12</a>
      <br />

      <em>6 October 2021:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-17">
      Announcing Apache OpenOffice 4.1.11</a>
      <br />

      <em>4 May 2021:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-16">
      Announcing Apache OpenOffice 4.1.10</a>
      <br />

      <em>7 February 2021:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-15">
      Announcing Apache OpenOffice 4.1.9</a>
      <br />

      <em>6 January 2021:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/new-release-for-apple-s">
      New release for Apple's macOS 11 (Big Sur) - Also with fixes for Linux and Windows</a>
      <br />

      <em>10 November 2020:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-14">
      Announcing Apache OpenOffice 4.1.8</a>
      <br />

      <em>29 October 2020:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/300-million-downloads-of-apache">
      300 Million Downloads of Apache OpenOffice</a>
      <br />

      <em>15 October 2020:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/the-apache-software-foundation-celebrates">
      The Apache Software Foundation Celebrates 20 Years of OpenOffice®</a>
      <br />

      <em>17 May 2020:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/apache-openoffice-needs-your-help">
      Apache OpenOffice needs your help</a>
      <br />

      <em>15 October 2020:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/the-apache-software-foundation-celebrates">
      The Apache Software Foundation Celebrates 20 Years of OpenOffice®</a>
      <br />

      <em>22 October 2019:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/1-6-million-downloads-of">
      1.6 million downloads of Apache OpenOffice 4.1.7</a>
      <br />

      <em>21 September 2019:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-13">
      Announcing Apache OpenOffice 4.1.7</a>
      <br />

      <em>18 November 2018:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-12">
      Announcing Apache OpenOffice 4.1.6</a>
      <br />

      <em>31 January 2018:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/over-3-2-million-downloads">
      Over 3.2 million downloads of Apache OpenOffice 4.1.5</a>
      <br />

      <em>30 December 2017:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-11">
      Announcing Apache OpenOffice 4.1.5</a>
      <br />

      <em>19 October 2017:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-1">
      Announcing Apache OpenOffice 4.1.4</a>
      <br />

      <em>28 November 2016:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/over_200_million_downloads_of">
      Over 200 million downloads of Apache OpenOffice</a>
      <br />

      <em>12 October 2016:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/announcing_apache_openoffice_4_12">
      Announcing Apache OpenOffice 4.1.3</a>
      <br />

      <em>28 October 2015:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/announcing_apache_openoffice_4_11">
      Announcing Apache OpenOffice 4.1.2</a>
      <br />

      <em>27 September 2015:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/coming_soon_apache_openoffice_4">
      Coming soon... Apache OpenOffice 4.1.2</a>
      <br />

      <em>13 May 2015:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/authoring_e_books_in_apache">
      Authoring e-Books in Apache OpenOffice</a>
      <br />

      <em>13 April 2015:</em>
      <br />
      <a href="https://blogs.apache.org/OOo/entry/collaboration_is_in_our_dna">
      Collaboration is in our DNA</a>
      <br />
    </p>
  </div>

  <div id="all_news" style="height: 375px; float: left; overflow: auto;">
    <div class="campaign">
      <h2>Recent News</h2>

      <p style="text-align:right">
        <a href="/news/index.html" target="_blank">Archived News</a>
      </p>
      <p></p>

      <h2>Apache OpenOffice 4.1.13 released</h2>

      <p>
        <em>22 July 2022:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-19"
        title="Official blog post about Apache OpenOffice 4.1.13">official release of version 4.1.13</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1.13+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.13">Release Notes</a> you can read about all new bugfixes,
        improvements and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.13">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>Apache OpenOffice 4.1.12 released</h2>

      <p>
        <em>4 May 2022:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-18"
        title="Official blog post about Apache OpenOffice 4.1.12">official release of version 4.1.12</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1.12+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.12">Release Notes</a> you can read about all new bugfixes,
        improvements and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.12">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>Apache OpenOffice 4.1.11 released</h2>

      <p>
        <em>6 October 2021:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-17"
        title="Official blog post about Apache OpenOffice 4.1.11">official release of version 4.1.11</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1.11+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.11">Release Notes</a> you can read about all new bugfixes,
        improvements and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.11">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>Apache OpenOffice 4.1.10 released</h2>

      <p>
        <em>4 May 2021:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-16"
        title="Official blog post about Apache OpenOffice 4.1.10">official release of version 4.1.10</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1.10+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.10">Release Notes</a> you can read about all new bugfixes,
        improvements and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.10">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>Apache OpenOffice 4.1.9 released</h2>

      <p>
        <em>7 February 2021:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-15"
        title="Official blog post about Apache OpenOffice 4.1.9">official release of version 4.1.9</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1.9+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.9">Release Notes</a> you can read about all new bugfixes,
        improvements and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.9">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>Apache OpenOffice 4.1.8 released</h2>

      <p>
        <em>10 November 2020:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-14"
        title="Official blog post about Apache OpenOffice 4.1.8">official release of version 4.1.8</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1.8+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.8">Release Notes</a> you can read about all new bugfixes,
        improvements and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.8">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>Apache OpenOffice 4.1.7 released</h2>

      <p>
        <em>21 September 2019:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-13"
        title="Official blog post about Apache OpenOffice 4.1.7">official release of version 4.1.7</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1.7+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.7">Release Notes</a> you can read about all new bugfixes,
        improvements and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.7">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>Apache OpenOffice 4.1.6 released</h2>

      <p>
        <em>18 November 2018:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-12"
        title="Official blog post about Apache OpenOffice 4.1.6">official release of version 4.1.6</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1.6+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.6">Release Notes</a> you can read about all new bugfixes,
        improvements and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.6">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>Apache OpenOffice 4.1.5 released</h2>

      <p>
        <em>30 December 2017:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-11"
        title="Official blog post about Apache OpenOffice 4.1.5">official release of version 4.1.5</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1.5+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.5">Release Notes</a> you can read about all new bugfixes,
        improvements and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.5">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>Apache OpenOffice 4.1.4 released</h2>

      <p>
        <em>19 October 2017:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-1"
        title="Official blog post about Apache OpenOffice 4.1.4">official release of version 4.1.4</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1.4+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.4">Release Notes</a> you can read about all new bugfixes,
        improvements and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.4">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>Apache OpenOffice 4.1.3 released</h2>

      <p>
        <em>12 October 2016:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/announcing_apache_openoffice_4_12"
        title="Official blog post about Apache OpenOffice 4.1.3">official release of version 4.1.3</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1.3+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.3">Release Notes</a> you can read about all new bugfixes,
        improvements and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.3">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>Apache OpenOffice 4.1.2 released</h2>

      <p>
        <em>28 October 2015:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/announcing_apache_openoffice_4_11"
        title="Official blog post about Apache OpenOffice 4.1.2">official release of version 4.1.2</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1.2+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.2">Release Notes</a> you can read about all bugfixes,
        improvements and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.2">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>Udine moves to OpenOffice, will save 360,000 Euro</h2>

      <p>
        <em>16 September 2014:</em>
        The City of Udine, in Italy, announced a process that will lead to the installation of OpenOffice on
        900 municipal desktops, saving the city 360,000 Euro. ZDNet's Raffaele Mastrolonardo has the
        <a href="http://www.zdnet.com/another-italian-city-announces-its-ditching-microsoft-windows-for-open-source-7000033682/">details</a>.
      </p>
    </div>

    <div class="campaign">
      <h2>Apache OpenOffice 4.1.1 released</h2>

      <p>
        <em>21 August 2014:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/announcing_apache_openoffice_4_1"
        title="Official blog post about Apache OpenOffice 4.1.1">official release of version 4.1.1</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1.1+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.1">Release Notes</a> you can read about all new features,
        functions and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.1">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>Apache OpenOffice 4.1.0 released</h2>

      <p>
        <em>29 April 2014:</em>
        The Apache OpenOffice project announces the
        <a href="https://blogs.apache.org/OOo/entry/the_apache_openoffice_project_announce"
        title="Official blog post about Apache OpenOffice 4.1.0">official release of version 4.1.0</a>.
        In the <a href="https://cwiki.apache.org/confluence/display/OOOUSERS/AOO+4.1+Release+Notes"
        title="Release Notes for Apache OpenOffice 4.1.0">Release Notes</a> you can read about all new features,
        functions and languages. <a href="https://www.openoffice.org/download/"
        title="Download Apache OpenOffice 4.1.0">Don't miss to download</a> the new release and find out yourself.
      </p>
    </div>

    <div class="campaign">
      <h2>100 Million downloads</h2>

      <p>
        <em>17 April 2014:</em>
        The Apache OpenOffice project is proud to tell you that our software was
        <a href="https://blogs.apache.org/foundation/entry/the_apache_software_foundation_announces56"
        title="Apache OpenOffice was downloaded 100 million times">downloaded over 100 million times</a>. Join us in
        celebrating this big achievement!
      </p>
    </div>

    <div class="campaign">
      <h2>Italian region adopts OpenOffice, saves 2 Million Euro</h2>

      <p>
        <em>10 October 2013:</em>
        The Italian administrative region of Emilia-Romagna announced plans to move to OpenOffice,
        <a href="https://joinup.ec.europa.eu/community/osor/news/openoffice-italian-emilia-romagna-save-2-million">
        saving 2 million euro</a>.
      </p>
    </div>

    <div class="campaign">
      <h2>Volunteers, not Amateurs</h2>

      <p>
        <em>8 January 2013:</em>
        Apache OpenOffice is developed 100% by volunteers. Apache does not pay for developers, for translators, for QA,
        for marketing, for UI, for support, etc. Of course, we're happy to accept
        <a href="https://www.apache.org/foundation/contributing.html">donations to the Apache Software Foundation</a>, to
        keep our servers runnings and for similar overhead expenses. But our products are developed entirely by
        volunteers.
      </p>
      <p>
        Some users are initially worried by this statement:<br /><strong>How can software for free, developed by
        volunteers, be any good?<br /></strong><a href="/why/why_volunteers.html">Read on for an answer...</a>
      </p>
    </div>
  </div>
</div>

<!-- Every new element and text that is defined below the previous DIV will be actually displayed wrapped below this DIV
(because of "clear: both" instead of floated around the previous DIVs. This is really needed. -->
<div style="clear: both;">
</div>

</body>
</html>
