////
     Licensed to the Apache Software Foundation (ASF) under one
     or more contributor license agreements.  See the NOTICE file
     distributed with this work for additional information
     regarding copyright ownership.  The ASF licenses this file
     to you under the Apache License, Version 2.0 (the
     "License"); you may not use this file except in compliance
     with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing,
     software distributed under the License is distributed on an
     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     KIND, either express or implied.  See the License for the
     specific language governing permissions and limitations
     under the License.
////
= Commercial Support / Apache NetBeans
:jbake-type: page
:jbake-tags: community
:jbake-status: published
:keywords: Apache NetBeans Commercial Support
:description: Apache NetBeans Commercial Support
:toc: left
:toc-title:
:toclevels: 4

== Commercial Support

Some companies or individuals offer professional products and services around
Apache NetBeans.  Please note that these *are not (and cannot be) endorsed* by the Apache
Software Foundation.

[cols="5", options="header",grid="rows"]
|====
|Applicant Name|Skills|Details|Location|Contact details

| Oliver Rettig
| Java Swing,NetBeans APIs, NetBeans Platform
| Oliver Rettig is a scientist in the field of motion analysis and a Java developer with a decade of experience in scientific desktop  application development, usually based on Swing and the NetBeans Platform (http://upperlimb.orat.de and  http://www.motion-science.org/). Oliver is available for work through his own company ORAT (http://www.orat.de).
| Karlsruhe, Germany
| link:mailto:oliver.rettig@orat.de[oliver.rettig@orat.de], http://www.orat.de

|====

== Policy for additions

The Apache NetBeans PMC does not and cannot endorse or recommend any products
or services.

To be listed in this page please send an email to the Apache NetBeans PMC (see
link:/community/mailing-lists.html[Mailing Lists]) with a description of your offerings
and the text you would like to have added.

All submitted information must be factual and informational in nature and not
be a marketing statement. Statements that promote your products and services
over other offerings on the page will not be tolerated and will be removed.
Such marketing statements can be added to your own pages on your own site.

When in doubt, email the Apache NetBeans PMC list (see
link:/community/mailing-lists.html[Mailing Lists]) and ask us.  We will be happy to help.


