<?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="#Proper_Usage_of_Eclipse_Brand_Guidelines">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="Proper_Usage_of_Eclipse_Brand_Guidelines">Proper Usage of the Eclipse Brand Guidelines</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</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>