<?php
/**
 * Copyright (c) 2005, 2018 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *   Denis Roy (Eclipse Foundation) - Initial implementation
 *   Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */
?>

<div id="midcolumn">
    <h1><?php print $pageTitle; ?></h1>
    <p>March 7, 2016</p>
  <h3><a name="h.ggtn2qdts1nf"></a>Table of Contents</h3>
      <blockquote>
      <ul>
        <li><a href="#Purpose" class=jump>Purpose</a></li>
        <li><a href="#GeneralLogo" class=jump>General Usage of Logos</a></li>
        <li><a href="#ProperEclipse" class=jump>Proper Usage of &quot;Eclipse&quot; Trademark and Logo</a></li>
        <li><a href="#ProperProjects" class=jump>Proper Usage of Eclipse Project Names and Logos</a></li>
        <li><a href="#ProperWG" class=jump>Proper Usage of Eclipse Working Group Names and Logos</a></li>
        <li><a href="#ProperMember" class=jump>Proper Usage of &quot;Eclipse Foundation Member&quot; Logo</a></li>
        <li><a href="#ProperBuilt" class=jump>Proper Usage of &lsquo;Built on Eclipse&lsquo; Trademark and Logo</a></li>
        <li><a href="#ProperReady" class=jump>Proper Usage of &quot;Eclipse Ready&quot; Trademark and Logo</a></li>
        <li><a href="#ProperIncubation" class=jump>Proper Usage of &quot;Eclipse Incubation&quot; Trademark and Logo</a></li>
        <li><a href="#ProperNotice" class=jump>Proper Notice and Attribution</a></li>
      </ul>
      </blockquote>

  <h3><a name="Purpose"></a>Purpose:</h3>
  <p>These requirements are meant to promote and improve the image of
  all elements of the Eclipse community, as well as to show that all
  Eclipse Foundation projects are part of a community of developers,
  adopters and users. While every project manages their own development
  within the broader <a href="https://eclipse.org/projects/dev_process/development_process.php">Eclipse
  Development Process</a>, a consistent set of trademark and branding
  requirements benefits the entire Eclipse community.</p>

  <p>The Eclipse Foundation holds the trademarks for the project names
  and logos on behalf of, and for the benefit of, the Eclipse community
  as a whole. The individual projects are not separate legal entities,
  and thus not able to hold trademarks individually. The Eclipse
  Foundation is a legal entity and owns the trademarks on behalf of the
  entire community.</p>

  <p>If you have any questions regarding this policy, or wish to use an
  Eclipse Foundation trademark in a way not explicitly explained in
  these Guidelines, then ask us by sending an email to
  <a href="mailto:license@eclipse.org" target="_top">license@eclipse.org</a>.</p>

  <p>The Eclipse Foundation and Eclipse projects have created a number
  of trademarks and logos to identify the Eclipse community and
  individual Eclipse projects. In addition to the &lsquo;Eclipse&rsquo;
  trademark, the Eclipse Foundation has introduced seven trademarks and
  logos: </p>
    <ul>
      <li/>
    <p>Eclipse Foundation Member,</p>
      <li/>
    <p>EclipseCon,</p>
      <li/>
    <p>Eclipse Summit,</p>
      <li/>
    <p>Built on Eclipse,</p>
      <li/>
    <p>Eclipse Ready, and</p>
      <li/>
    <p>Eclipse Incubation.</p>
    </ul>
  <p>Individual Eclipse projects and Eclipse Working Groups have also
  introduced unique names and logos&nbsp;that are trademarks of the
  Eclipse Foundation. This document outlines the policy and guidelines
  of the Eclipse Foundation in regards to any use of these trademarks.</p>
  <p>Our goals in establishing these guidelines are pretty simple:</p>
  <ul>
  <li>The Eclipse trademarks are a
    symbol of the quality and community support that people have come to
    associate with Eclipse. To ensure that the Eclipse trademarks
    continue to serve these functions, we need to keep control over
    their use. Along these lines, we want to ensure that the use of our
    marks is not likely to lead to confusion with other marks. By this
    we mean that people should be able to tell when something is from
    the Eclipse Foundation or one of the Eclipse projects. Also, use of
    our marks must not be in a disparaging manner because we prefer that
    our marks not be used to be rude about the Eclipse technology, the
    Eclipse Foundation, its projects, or its Members.</li>
  <li>We want to encourage our logos to be used in approved ways.
    For example, we want to make it as simple as legally possible for
    our Members to use the &lsquo;Eclipse Foundation Member&rsquo; mark.</li>
  </ul>
  <h3><a name="GeneralLogo"></a>General Usage of Logos</h3>
  <ol>
    <li/>
  <p>Derivative works of the
    &lsquo;EclipseCon&rsquo;, &lsquo;Eclipse Summit&rsquo;, &lsquo;Eclipse
    Foundation Member&rsquo;, &lsquo;Built on Eclipse&rsquo;, &lsquo;Eclipse
    Ready&rsquo; and projects logos are not allowed.</p>
    <li/>
  <p>The &lsquo;Eclipse&rsquo; logos
    and production specification are available from www.eclipse.org.
    Replication of these logos must follow these specifications.</p>
    <li/>
  <p>Except for use by Eclipse
    projects on the eclipse.org website, use of the &lsquo;Eclipse
    Incubation&rsquo; Trademark and Logo is not permitted unless
    authorized in writing by the Eclipse Foundation.</p>
  </ol>

  <h3><a name="ProperEclipse"></a>Proper Usage of &quot;Eclipse&quot; Trademark and Logo</h3>
  <p>The &ldquo;Eclipse&rdquo; name and logo are the intellectual
  property of the Eclipse Foundation and must be identified as such.
  Eclipse logos are provided for use under the terms of these
  Guidelines. Use of the &ldquo;Eclipse&rdquo; name or Eclipse logos
  are restricted to identifying the Eclipse Foundation, the Eclipse
  projects, the Eclipse working groups, and their deliverables, as
  applicable.</p>
  <p>Eclipse logos (including the Eclipse logo, and the logos of
  Eclipse projects and working groups) cannot be altered without the
  written permission of the Eclipse Foundation. Eclipse Foundation
  projects or working groups are permitted to create derivative works
  of Eclipse logos with the permission of the <a href="http://www.eclipse.org/org/foundation/directors.php">Eclipse
  Foundation Board of Directors</a>. Any project that wishes to seek
  such permission may do so by sending an email to license@eclipse.org.</p>
  <ol>
    <li/>
  <p>You must not incorporate the
    &lsquo;Eclipse&rsquo; trademark into the name of your company or
    software product name. If you have a software product that works
    with an Eclipse technology, you must use phrases such as &lsquo;&lt;product
    name&gt; for Eclipse&rsquo; or &lsquo;&lt;product name&gt;, Eclipse
    Edition&rsquo;.</p>
    <li/>
  <p>You may request permission to
    include the &lsquo;Eclipse&rsquo; trademark in the name of a
    publication, certification program, domain name or book. At a
    minimum you must ensure that a) the appropriate TM or (R) symbol is
    associated with the &lsquo;Eclipse&rsquo; reference and appropriate
    attribution as discussed below, b) &lsquo;Eclipse&rsquo; is not
    concatenated with another word, e.g. EclipseBoard, and c) the usage
    does not imply or make the user believe that the publication, domain
    name or book is supported or authorized by the Eclipse Foundation.
    Any organization wishing to seek such permission may do so by
    sending an email to license@eclipse.org.</p>
    <li/>
  <p>An important use of the
    &lsquo;Eclipse&rsquo; trademark is the &lsquo;org.eclipse&rsquo;
    string used on all namespaces for Eclipse open source projects. This
    naming convention is used to identify code that has been developed
    as an Eclipse open source project. Therefore, no one, except Eclipse
    open source projects may develop or maintain software packages that
    use &lsquo;org.eclipse&rsquo; in their namespace.</p>
    <li/>
  <p>&lsquo;Eclipse&rsquo; must always be capitalized, except
    when used as part of the Eclipse logos.</p>
  </ol>
  <h3><a name="ProperProjects"></a>Proper Usage of Eclipse Project Names and Logos</h3>
  <p>The <a href="https://wiki.eclipse.org/Development_Resources/HOWTO/Project_Naming_Policy">Eclipse
  Project Naming Policy</a>&nbsp;allows for Eclipse projects to have a
  descriptive name, optional nickname and acronym. These names, e.g.
  Orion, and acronyms, e.g. BIRT, can be become effective identifiers
  of certain technologies, therefore it is important to establish
  proper usage guidelines. All project names, nicknames, logos, and
  acronyms are the intellectual property of the Eclipse Foundation and
  must be identified as such. For clarity, projects are not required to
  include &ldquo;Eclipse&rdquo; in their project logos. (Please see
  proper notice and attribution below.)</p>
  <ol>
    <li/>
  <p>All Eclipse projects must be
    identified as being Eclipse projects. Therefore, when referencing an
    Eclipse project, we ask that both the first and the most prominent
    reference to the project on each page is identified as Eclipse
    [project name], ex Eclipse Graphical Modeling Framework (GMF) or in
    the case of a project name that already includes Eclipse, Eclipse
    Communication Framework (ECF). Subsequent references may drop the
    Eclipse identifier.</p>
    <li/>
  <p>You must not incorporate the
    name of an Eclipse project, nickname or acronym into the name of
    your company or software product name. If you have a software
    product that works with an Eclipse project, it is suggested you use
    terms such as '&lt;product name&gt; for &lt;Eclipse project name&gt;'
    or '&lt;product name&gt;, &lt;Eclipse project name&gt; Edition'</p>
    <li/>
  <p>You may request permission to &nbsp;include an Eclipse
    project trademark in the name of a publication, certification
    program, domain name or book. At a minimum you must ensure that a)
    the appropriate &trade; or &reg; symbol is associated with the
    Eclipse project name reference and appropriate attribution as
    discussed below, b) Eclipse project name is not concatenated with
    another word, e.g. OrionPortal, and c) the usage does not imply or
    make the user believe that the publication, domain name or book is
    supported or authorized by the Eclipse Foundation or any Eclipse
    project. &nbsp;Any organization wishing to seek such permission may
    do so by sending an email to license@eclipse.org.</p>
  </ol>

  <h3><a name="ProperWG"></a>Proper Usage of Eclipse Working Group Names and Logos</h3>
  <p>The names and logos of the Eclipse Foundation Working Groups (WG)
  are the intellectual property of the Eclipse Foundation and must be
  identified as such. (Please see proper notice and attribution below).
  Use of WG trademarks are restricted to identifying the WGs and their
  deliverables, as applicable. No other uses of WG names and logos are
  permitted unless authorized in writing by the Eclipse Foundation.</p>
  <p>Each WG may, at its discretion, develop guidelines for use of the
  WG trademarks or their derivatives, as applicable, by third parties.
  These guidelines will be referenced in Appendix A of this document
  and shall be consistent with these Guidelines for Eclipse Logos and
  Trademarks. It is not permitted to create any derivative work of a WG
  trademark with written approval of the Eclipse Foundation, which will
  consult with the Steering Committee of the relevant Working Group.
  Any organization wishing to seek permission to create a derivative
  work of any WG trademark may do so by sending an email to
  license@eclipse.org.</p>

  <h3><a name="ProperMember"></a>Proper Usage of &quot;Eclipse Foundation Member&quot; Logo</h3>
  <p>The &lsquo;Eclipse Foundation Member&rsquo; logo is to identify
  those organizations and individuals that are official members of the
  Eclipse Foundation, including 1) Strategic Members, 2) Enterprise
  Members, 3) Solutions (formerly Add-in Provider) Members, 4)
  Associate Members, and 5) Committer Members. Only official Members of
  the Eclipse Foundation are authorized to use this logo.</p>
  <h3><a name="ProperBuilt"></a>Proper Usage of &lsquo;Built on Eclipse&lsquo; Trademark and Logo</h3>
  <p>The &lsquo;Built on Eclipse&rsquo; trademark is used to identify a
  product that includes the core Eclipse IDE Platform, specifically the
  runtime, SWT, JFace, and Generic Workbench components. This type of
  product is able to run standalone with no prerequisites of other
  Eclipse components.</p>
  <h3><a name="ProperReady"></a>Proper Usage of &quot;Eclipse Ready&quot; Trademark and Logo</h3>
  <p>The &lsquo;Eclipse Ready&lsquo; trademark and logo is used to
  identify a product that is packaged as an Eclipse IDE feature or
  plug-in and must be added to an Eclipse platform product. This type
  of product does not run standalone.</p>
  <h3><a name="ProperIncubation"></a>Proper Usage of &quot;Eclipse Incubation&quot; Trademark and Logo</h3>
  <p>The &lsquo;Eclipse Incubation&rsquo; Trademark and Logo are for use exclusively&nbsp;by
  the Eclipse Foundation and the Eclipse projects. Only the Eclipse
  Foundation and its projects are authorized to use this trademark and
  logo. All other use -- even by Eclipse Foundation Members -- is
  prohibited.</p>
  <h3><a name="ProperNotice"></a>Proper Notice and Attribution</h3>
  <p>The appropriate trademark symbol (i.e. TM or (R)) must appear at
  both the first and most prominent use of the Eclipse Foundation
  trademarks, and with all occurrence of the Eclipse logo.</p>
  <p>When you use an Eclipse Foundation trademark or logo you must
  include a statement attributing the trademark to the Eclipse
  Foundation, Inc. For example, &quot;&lsquo;Eclipse&rsquo;, &lsquo;Built
  on Eclipse&rsquo; and &lsquo;Eclipse Ready&rsquo;, &lsquo;BIRT&rsquo;,
  &lsquo;Orion&rsquo; are trademarks of Eclipse Foundation, Inc.&quot;</p>
  <h3></a>Footnotes</h3>
  <p>These guidelines were first introduced at a point in time when
  some companies and individuals already had product names that include
  the &lsquo;Eclipse&rsquo; trademark. Companies and individuals using
  the &lsquo;Eclipse&rsquo; trademark as of February 1, 2005 will not
  be required to change their already existing product names to comply
  with these guidelines now or in the future. However, all companies
  and individuals are required to give proper notice and attribution of
  the &lsquo;Eclipse&rsquo; trademark. All usage subsequent to February
  1, 2005 are required to follow these guidelines.</p>
  <p>Similarly, further revisions to these guidelines were first
  introduced at a point in time when some companies and individuals
  already had product names that include Eclipse project trademarks.
  Companies and individuals using an Eclipse project trademarks as of
  June 20, 2007 will not be required to change their already existing
  product names to comply with these guidelines now or in the future.
  However, all companies and individuals are required to give proper
  notice and attribution of the Eclipse project trademark. All usage
  subsequent to June 20, 2007 are required to follow these guidelines.</p>
</div>