// 
//     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.
//

= FaqHowDoIFileACA
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki FaqHowDoIFileACA
:description: Apache NetBeans wiki FaqHowDoIFileACA
:toc: left
:toc-title:
:syntax: true

=== How do I file a completed CA?

Oracle must have a fax or hard copy of the CA on file before Oracle can accept contributions and update the list of contributors with an accepted CA. You will find a blank form of the CA at: link:http://oss.oracle.com/oca.pdf[http://oss.oracle.com/oca.pdf]. The CA is in .pdf format (on purpose - we need a format not intended for modification).



1. Print it, mourn the loss of a tree, fill it out and sign it. Please take care to print your details very clearly, including your *postal and email* address. Also don't forget to *check one statement* in the 7th paragraph regarding scope of your CA.



2. Scan it and email it to link:mailto:oracle-ca_us@oracle.com[oracle-ca_us@oracle.com]



3. Please check link:http://www.oracle.com/technetwork/goto/oca[list of approved CA signatories] for your name in the days following your submission. If your name does not show up, or shows up incorrectly, please contact link:mailto:jiri.kovalsky@oracle.com[Jiri Kovalsky] - NetBeans Community Manager.

 

4. If you have other questions, please consult the link:http://www.oracle.com/technetwork/oca-faq-405384.pdf[General FAQs guide].

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/FaqHowDoIFileACA[http://wiki.netbeans.org/FaqHowDoIFileACA] , 
that was last modified by NetBeans user Jkovalsky 
on 2011-10-13T06:39:47Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
