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




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




[start=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.

 


[start=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.
