<?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
 */
?>
<h1><?php print $pageTitle; ?></h1>
<p>April 18, 2018</p>
<h3 class="h2">Table of Contents</h3>
<blockquote>
  <ul>
    <li><a href="#Purpose">Purpose</a></li>
    <li><a href="#General_Usage_of_Trademarks">General Usage of Trademarks</a></li>
    <li><a href="#Proper_Usage_of_Eclipse_Trademarks">Proper Usage of 'Eclipse' Trademarks</a></li>
    <li><a href="#Brand_Guidelines_Handbook">Proper Usage of Eclipse Brand Guidelines</a></li>
    <li><a href="#Proper_Usage_of_the_Jakarta_or_Jakarta_EE_Trademarks">Proper Usage of the 'Jakarta' or 'Jakarta EE' Trademarks</a></li>
    <li><a href="#Proper_Usage_of_Eclipse_Trademarks_project">Proper Usage of Eclipse Trademarks</a></li>
    <li><a href="#Proper_Usage_of_Eclipse_Working_Group_Trademarks">Proper Usage of Eclipse Working Group Trademarks</a></li>
    <li><a href="#Proper_Usage_of_Eclipse_Foundation_Member_Trademarks">Proper Usage of 'Eclipse Foundation Member' Trademarks</a></li>
    <li><a href="#Proper_Usage_of_Built_on_Eclipse_Trademarks">Proper Usage of 'Built on Eclipse' Trademarks</a></li>
    <li><a href="#Proper_Usage_of_Eclipse_Ready_Trademarks">Proper Usage of 'Eclipse Ready' Trademarks</a></li>
    <li><a href="#Proper_Usage_of_Eclipse_Incubation_Trademarks">Proper Usage of 'Eclipse Incubation' Trademarks</a></li>
    <li><a href="#Proper_Notice_and_Attribution">Proper Notice and Attribution</a></li>
  </ul>
</blockquote>
<h2><a name="Purpose"></a>Purpose:</h2>
<p>This Policy defines the allowable use of Eclipse Foundation ("Eclipse")
  names, marks and logos (referred to herein generally as "Trademarks"). The
  Policy is intended to protect the goodwill associated with Eclipse trademarks
  and to promote and improve the consistency of use of Eclipse trademarks across
  all elements of the Eclipse community and otherwise. This is important to,
  among other reasons, demonstrate that Eclipse projects are part of a common
  community of developers, adopters and users, all associated with the highest
  levels of quality.</p>
<p>
  Eclipse owns all 'Eclipse' related trademarks and related rights. In addition,
  while every project manages its own development within the broader <a
    href="/projects/dev_process/development_process.php"
  >Eclipse Development Process</a>, Eclipse holds the trademarks and related
  rights for the project names and logos on behalf of, and for the benefit of,
  the Eclipse community as a whole. A collective list of Eclipse trademarks
  including both registered and unregistered marks can be found at <a
    href="/projects/tools/trademarks.php"
  >https://www.eclipse.org/projects/tools/trademarks.php</a>. This Policy
  outlines the position of Eclipse with respect to the use of these trademarks.
</p>
<p>
  If you have any questions regarding this Policy, wish to report an
  infringement of our trademarks, or wish to use an Eclipse trademark in a way
  not explicitly provided for in this Policy, then contact us by sending an
  email to <strong>license@eclipse.org</strong>.
</p>
<p>Our goals in establishing this Policy are:</p>
<ul>
  <li>The Eclipse trademarks are symbols 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
    trademarks 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 Eclipse or
    one of the Eclipse projects. Also, our trademarks must not be used in a
    disparaging manner in relation to the Eclipse technology, the Eclipse
    Foundation, its projects, its working groups, or its Members.</li>
  <li>We want to encourage our trademarks to be used in approved ways. For
    example, we want to make it as simple as possible for our Members to use the
    'Eclipse Foundation Member'. However, we also want to make sure that the
    Eclipse trademarks are not used in a way that falsely suggests Eclipse's
    affiliation with, or endorsement of, a third party.</li>
</ul>
<h2 id="General_Usage_of_Trademarks">General Usage of Trademarks</h2>
<ol>
  <li>Derivative works of the Trademarks for 'Eclipse', 'Eclipse Foundation',
    'EclipseCon', 'Eclipse Summit', 'Eclipse Foundation Member', 'Built on
    Eclipse', 'Eclipse Ready', 'Jakarta', 'Jakarta EE' and all projects and
    working groups are not allowed.</li>
  <li>The Eclipse logos and production specifications are available from <a
    href="/artwork/"
  >https://www.eclipse.org/artwork/</a>. Use of these logos must follow these
    specifications.
  </li>
  <li>Except for use by Eclipse projects on the eclipse.org website, use of the
    'Eclipse Incubation' Trademark and Logo is not permitted unless authorized
    in writing by Eclipse.</li>
</ol>
<h2 id="Proper_Usage_of_Eclipse_Trademarks">Proper Usage of 'Eclipse' Trademarks</h2>
<p>The 'Eclipse' Trademarks are the intellectual property of the Eclipse and must
  be identified as such. Eclipse logos are provided for use under the terms of
  this Policy. <strong>Use of the 'Eclipse' name or Eclipse logos are restricted
    to identifying the Eclipse Foundation, the Eclipse projects, the Eclipse
    working groups, and their deliverables, as applicable. 'Eclipse' must always
    be capitalized, except when used as part of an Eclipse logo</strong>.
</p>
<p>Eclipse logos (including the Eclipse logo, and the logos of Eclipse projects
  and working groups) cannot be modified in any way without the advanced written
  permission (email is permissible) of Eclipse. Any Eclipse project or working
  group that wishes to seek such permission may do so by sending an email to
  license@eclipse.org.</p>
<p>Unless otherwise agreed to in advance in writing (which may be in email form)
  by Eclipse, the following restrictions apply:</p>
<ol>
  <li>You may not incorporate the 'Eclipse' trademark into the name of your
    company or software product name. If you have a software product that works
    with an Eclipse technology, you may use phrases such as '&lt;product
    name&gt; for Eclipse' or '&lt;product name&gt;, Eclipse Edition'.</li>
  <li>You may not include the 'Eclipse' Trademark in the name of a publication,
    certification program, domain name or book. To the extent Eclipse approves a
    request to do so, it will be required that, at a minimum a) the appropriate
    ™ or ® symbol must be associated with the 'Eclipse' reference with
    appropriate attribution as discussed below, b) 'Eclipse' cannot be
    concatenated with another word, e.g. EclipseBoard, and c) the usage cannot
    imply or infer that the publication, domain name or book is supported or
    authorized by Eclipse.</li>
  <li>Nobody other than Eclipse open source projects may develop or maintain
    software packages that use 'org.eclipse' in their namespace. An important
    use of the 'Eclipse' Trademark is the 'org.eclipse' string used on all
    namespaces for Eclipse open source projects. This naming convention is used
    to identify code that has been developed as part of an Eclipse open source
    project.</li>
</ol>

<h2 id="Brand_Guidelines_Handbook">Brand Guidelines Handbook</h2>
<p>To ensure the consistency of our corporate brand identity, please see our <a href="/legal/documents/eclipse_foundation_branding_guidelines.pdf">Brand
Guidelines Handbook</a>. This style guide outlines usage standards to ensure that the Eclipse
Foundation logo is instantly and consistently recognizable however and wherever it
is used by Foundation members and the community.</p>

<h2 id="Proper_Usage_of_the_Jakarta_or_Jakarta_EE_Trademarks">Proper Usage of the 'Jakarta' or 'Jakarta EE' Trademarks</h2>
<p>The use of the 'Jakarta' and 'Jakarta EE' Trademarks is restricted to identifying
  the Jakarta EE Working Group and its deliverables, as applicable. No other uses of
  the 'Jakarta' and 'Jakarta EE' names and logos are permitted unless authorized in
  advance in writing by Eclipse, or in adherence with the <a href="https://jakarta.ee/legal/trademark_guidelines/">Jakarta EE Working Group
  Trademark Guidelines</a>. Use of the 'jakarta', 'ee.jakarta', or 'org.jakarta'
  namespaces is not permitted unless authorized in advance in writing by Eclipse.</p>
<h2 id="Proper_Usage_of_Eclipse_Trademarks_project">Proper Usage of Eclipse Trademarks</h2>
<p>The <a href="/projects/handbook/#trademarks">Eclipse
    Project Naming Policy</a> 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, and
  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 'Eclipse' or use the Eclipse logo in their project
  logos. (Please see proper notice and attribution below.)
</p>
<ol>
  <li>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] (e.g., 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.</li>
  <li>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, you may use phrases
    such as '&lt;product name&gt; for &lt;Eclipse project name&gt;' or
    '&lt;product name&gt;, &lt;Eclipse project name&gt; Edition'.</li>
  <li>You may request permission to include an Eclipse project trademark in the
    name of a publication, certification program, domain name or book. At a
    minimum, it will be required that a) the appropriate &trade; or &reg; symbol
    is associated with the Eclipse project name reference and appropriate
    attribution as discussed below, b) the Eclipse project name is not
    concatenated with another word, e.g. OrionPortal, and c) the usage does not
    imply or infer that the publication, domain name or book is supported or
    authorized by Eclipse or any Eclipse project.</li>
</ol>
<h2 id="Proper_Usage_of_Eclipse_Working_Group_Trademarks">Proper Usage of Eclipse Working Group Trademarks</h2>
<p>The Trademarks of Eclipse Working Groups (WG) are the intellectual property
  of Eclipse and must be identified as such in all uses. (Please see proper
  notice and attribution below.) The use of WG names and logos is restricted to
  identifying the WGs and their deliverables, as applicable. No other uses of WG
  names and logos are permitted unless authorized in advance in writing by
  Eclipse. Any organization wishing to seek such authorization may do so by
  sending an email to license@eclipse.org.</p>
<p>
  Each WG may, at its discretion, develop guidelines for use of the WG marks,
  logos and their derivatives, as applicable, by third parties, provided such
  guidelines are consistent with this Policy. These guidelines will be appended
  as Appendix A to this document. It is not permitted to create any derivative
  work of a WG mark or logo without prior written approval of Eclipse, which, in
  the event of a request, 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
  <a href="mailto:license@eclipse.org">license@eclipse.org</a>.
</p>
<p>Use of the 'org.locationtech' or 'org.polarsys' namespaces is not permitted
  unless authorized in advance in writing by Eclipse.</p>
<h2 id="Proper_Usage_of_Eclipse_Foundation_Member_Trademarks">Proper Usage of 'Eclipse Foundation Member' Trademarks</h2>
<p>The 'Eclipse Foundation Member' logo is to identify those organizations and
  individuals that are members of Eclipse. Only current members of Eclipse are
  authorized to use this logo.</p>
<h2 id="Proper_Usage_of_Built_on_Eclipse_Trademarks">Proper Usage of 'Built on Eclipse' Trademarks</h2>
<p>The 'Built on Eclipse' 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. This mark may only be used
  on products that satisfy this standard.</p>
<h2 id="Proper_Usage_of_Eclipse_Ready_Trademarks">Proper Usage of 'Eclipse Ready' Trademarks</h2>
<p>The 'Eclipse Ready' 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. This mark may
  only be used on products that satisfy this standard.</p>
<h2 id="Proper_Usage_of_Eclipse_Incubation_Trademarks">Proper Usage of 'Eclipse Incubation' Trademarks</h2>
<p>The 'Eclipse Incubation' Trademark and Logo are for use exclusively by
  Eclipse and the Eclipse projects. Only Eclipse and its projects are authorized
  to use this trademark and logo. All other use—even by Eclipse members—is
  prohibited.</p>
<h2 id="Proper_Notice_and_Attribution">Proper Notice and Attribution</h2>
<p>The appropriate trademark symbol (i.e. &trade; or &reg;) must appear at both the first
  and most prominent use of Eclipse trademarks, and with all occurrences of the
  Eclipse logo. When you use an Eclipse Trademark you must include a statement
  attributing the trademark to the Eclipse Foundation, Inc. For example,
  "'Eclipse', 'Built on Eclipse' and 'Eclipse Ready', 'BIRT', 'Orion' are
  trademarks of Eclipse Foundation, Inc."</p>