Retrieved from https://www.skype.com/en/legal/ios/tos/ (2016-09-09)

Table of contents:

    1. Your agreement with Skype
    2. Acceptance of the Terms
    3. Changes to the Terms
    4. Licence
    5. Use of the software and products and Skype websites
    6. Your obligations
    7. Proprietary rights
    8. Charges
    9. Payment
   10. Refund Policy
   11. Ending Your relationship with Skype
   12. Exclusion of warranties, limitation of liability and indemnity
   13. Third party websites products and services
   14. Additional Terms
   15. Your confidential information and your privacy
   16. For Government users only
   17. How to contact Skype
   18. Miscellaneous
   19. Product specific terms
   20. Pay by mobile

PLEASE READ CAREFULLY BEFORE DOWNLOADING THE SOFTWARE OR USING THE PRODUCT(S)
OR SKYPE WEBSITES

Key Points

   It is important that you read the entirety of and understand this
   document. There are, however, a few key points that we need to
   emphasise:

   NO ACCESS TO EMERGENCY SERVICES: The Software is not a replacement for
   your ordinary mobile or fixed line telephone. In particular, apart from
   in the very limited circumstances set out in paragraph 5.6 of these
   Terms (applicable to Skype’s Internet Communications Software only),
   the Software does not allow you to make emergency calls to emergency
   services. You must make alternative communications arrangements to
   ensure that you can make emergency calls if needed.

   CHECK RESTRICTIONS ON USE: In some countries there are restrictions on
   the use of the Software. It is your responsibility to ensure that you
   are legally allowed to use the Software where you are located.

   NO OWNERSHIP OF NUMBERS: If Skype allocates to you a Skype Number
   (previously known as “Online Number”) or Skype To Go Number, you do not
   own the number or have a right to retain that number forever. Skype may
   need to change or withdraw the number allocated to you from time to
   time. You will not transfer or attempt to transfer your Skype Number or
   Skype To Go Number to anyone else. You must ensure you comply with any
   allocation requirements displayed when purchasing a Skype Number as
   failure to do so could result in the number being withdrawn. Please see
   also paragraph 19.1.

   SKYPE CREDIT BECOMES INACTIVE AFTER 180 DAYS: If you purchase Skype
   Credit please be aware that it becomes inactive after 180 days of
   inactivity. Please see also paragraph 9.2.

   ARBITRATION CLAUSE AND CLASS ACTION WAIVER: If you live in the USA and
   select Pay by Mobile (see paragraph 20), a binding arbitration clause
   and class action waiver affects your rights to resolve a dispute with
   Skype, its corporate affiliates, or other third parties including
   mobile phone carriers. Please read paragraph 20.3 carefully.

1. YOUR AGREEMENT WITH SKYPE

   1.1 Skype’s internet communication software applications (“Internet
   Communications Software”), other “Skype” branded software applications
   (together the “Skype Software”), the “Qik” branded software
   applications (“Qik Software”) and associated documentation (whether in
   printed or electronic form) including any improvements, modifications,
   enhancements, fixes, updates, upgrades and future versions thereto
   (“Updates”) and whether made available for free or for a fee,
   (collectively the “Software”) are licensed (not sold) to you by Skype
   Software Sàrl.

   1.2 The features and products that are made available through the
   Software for free (excluding products or features available for free on
   a trial basis only) (“Free Products”) are provided to you by Skype
   Software Sàrl.

   1.3 Any additional products or features of the Skype Software or Qik
   Software, or other “Skype” or “Qik” branded products, that you pay for
   (including products or features available for free on a trial basis
   only) (“Paid For Products”) are provided to you by Skype Communications
   Sàrl.

   1.4 “Skype Websites” means www.skype.com, www.qik.com (both of which
   are operated by Skype Communications Sàrl) and any other websites
   authorised by Skype which link to these Terms.

   1.5 “Skype’’ means Skype Software Sàrl, 23 – 29 Rives de Clausen,
   L-2165 Luxembourg or Skype Communications Sàrl, 23 – 29 Rives de
   Clausen, L-2165 Luxembourg as the context requires;
   “Products” means collectively the Free Products and Paid For Products;
   “you” or “your” means you, the registered holder of the User Account
   (as described in paragraph 6.1) and licensee under these Terms.

   1.6 Your agreement with Skype is made up of the terms and conditions
   set out in this document, together with any fair usage policies
   described in this document and Additional Terms referred to in
   paragraph 14 (collectively the “Terms”). To the extent of any
   inconsistency between the fair usage policies or any Additional Terms
   and this document, this document shall take precedence.

2. ACCEPTANCE OF THE TERMS

   2.1 In order to download and/or use the Software, Products and/or Skype
   Websites you must first accept these Terms. These Terms are accepted by
   you (a) when you click to accept or agree to the Terms; or (b) when you
   download and/or use the Software, Products and/or Skype Websites. We
   advise you to print a copy of these Terms for your records. These Terms
   remain effective from the date of acceptance until terminated by you or
   Skype in accordance with paragraph 11.

   2.2 You cannot accept these Terms if: (a) you are not lawfully entitled
   to use the Software, Products and/or Skype Websites in the country in
   which you are located or reside or (b) if you are not of legal age to
   form a binding agreement with Skype.

   2.3 In some countries the Products may be provided to you by Skype’s
   local partner. If so, that local partner may ask you to accept its own
   terms of service (“local terms”). If there is any inconsistency between
   those local terms and these Terms, then the local terms shall govern to
   the extent of that inconsistency.


3. CHANGES TO THE TERMS

   3.1 Skype may make changes to these Terms from time to time. Skype will
   publish the changes at www.skype.com/go/tou. Changes to the fair usage
   policies and/or Additional Terms will be posted on the applicable Skype
   Website. The changes will be effective when published. Please review
   the Terms on a regular basis. You understand and agree that your
   express acceptance of the Terms or your use of the Software, Products
   and/or Skype Websites after the date of publication shall constitute
   your agreement to the updated Terms. If you do not agree with the
   amended Terms, you may terminate your relationship with Skype in
   accordance with paragraph 11 below.

4. LICENCE

   4.1 Licence. Subject to your compliance with these Terms, you are
   granted a limited, non-exclusive, non-sublicensable, non-assignable,
   free of charge license to download and install the Software on a
   personal computer, mobile phone or other device; and personally use the
   Software through your individual Skype or Qik user account (as
   applicable) (“User Account”). For the avoidance of doubt, (a) IT
   administrators working on behalf of a company may download and install
   the Skype Software onto personal computers or other devices used by
   personnel of such company; and (b) you are permitted to use the
   Software at a university or other educational institution, or at work.
   Skype reserves all rights not expressly granted to you under these
   Terms.

   4.2 Restrictions. You may not and you agree not to:

   (a) sub-license, sell, assign, rent, lease, export, import, distribute
   or transfer or otherwise grant rights to any third party in the
   Software;

   (b) undertake, cause, permit or authorise the modification, creation of
   derivative works or improvements, translation, reverse engineering,
   decompiling, disassembling, decryption, emulation, hacking, discovery
   or attempted discovery of the source code or protocols of the Software
   or any part or features thereof (except to the extent permitted by
   law);

   (c) remove, obscure or alter any copyright notices or other proprietary
   notices included in the Software;

   (d) use the Software or cause the Software (or any part of it) to be
   used within or to provide commercial products or services to third
   parties. The foregoing shall not preclude you using the Software for
   your own business communications, subject to paragraph 4.1 above;

   (e) other than for the purposes of download and installation, use the
   Software except through your User Account.

   4.3 Third-Party Technology. If you are using Software pre-loaded on,
   embedded in, combined, distributed or used with or downloaded onto
   third party products, hardware, software applications, programs or
   devices (“Third-Party Technology”), you agree and acknowledge that: (a)
   you may be required to enter into a separate licence agreement with the
   relevant third party owner or licensor for the use of such Third-Party
   Technology; (b) some Products and/or functionality may not be
   accessible through the Third-Party Technology and (c) Skype cannot
   guarantee that the Software shall always be available on or in
   connection with such Third-Party Technology.

   4.4 Third Party Notices. The Software may include third party code that
   Skype, not the third party, licenses to you under this agreement.
   Notices, if any, for the third party code are included for your
   information only. Third party scripts, linked to, called or referenced
   from the Software, are licensed to you by the third parties that own
   such code, not by Skype.

5. USE OF THE SOFTWARE AND PRODUCTS AND SKYPE WEBSITES

   5.1 Equipment: In order to use the Software and the Products you will
   need an Internet broadband connection. You are responsible for
   providing all equipment required to access the Internet or enable
   communications such as headsets, microphones and webcams.

   5.2 Use of Your Equipment: The Internet Communications Software may use
   the processing capabilities, memory and bandwidth of the computer (or
   other applicable device) you are using, for the limited purpose of
   facilitating the communication and establishing the connection between
   Internet Communications Software users. If your use of the Internet
   Communications Software is dependent upon the use of a processor and
   bandwidth owned or controlled by a third party, you acknowledge and
   agree that your licence to use the Internet Communications Software is
   subject to you obtaining consent from the relevant third party for such
   use. You represent and warrant that by accepting these Terms, you have
   obtained such consent.

   5.3 Updates to the Software: Skype may automatically check your version
   of the Skype Software. You may be required to enter into an updated
   version of these Terms to be able to download or otherwise take
   advantage of any Updates. Skype has no obligation to make available any
   Updates. However, Skype may (a) require you to download and install
   Updates; or (b) download and install Updates from Skype automatically
   from time to time unless you have chosen (through your Skype client
   settings) not to receive automatic Updates. Microsoft Corporation or
   its affiliates and subsidiaries may also automatically download updates
   to the Skype Software for Windows, if you have chosen to receive
   Microsoft Updates. These updates are required to maintain software
   compatibility, provide security updates or bug fixes, or offer new
   features, functionality or versions. You agree to receive such updates
   from Skype in order to continue using the Skype Software and you agree
   to accept such Updates subject to these Terms.

   5.4 Suspension, technical improvement and maintenance: From time to
   time, Skype may need to perform maintenance on or upgrade the Software,
   Products or Skype Websites or the underlying infrastructure that
   enables you to use the Software, Products or Skype Websites. This may
   require Skype to temporarily suspend or limit your use of some or all
   of the Software, Products or Skype Websites until such time as this
   maintenance and/or upgrade can be completed. To the extent possible and
   unless an intervention is urgently required, Skype will publish the
   time and date of such suspension or limitation on the Skype Website in
   advance. You will not be entitled to claim damages for such suspension
   or limitation of the use of any Software, Product or Skype Website.

   5.5 No Access to Emergency Services: Neither the Products nor the
   Software are intended to support or carry emergency calls to any type
   of hospitals, law enforcement agencies, medical care unit or any other
   kind of services that connect a user to emergency services personnel or
   public safety answering points (“Emergency Services”). There are
   important differences between traditional telephone services and the
   Products. You acknowledge and agree that: (i) Skype is not required to
   offer access to Emergency Services under any applicable local and/or
   national rules, regulations or law; (ii) it is your responsibility to
   purchase, separately from the Products, traditional wireless (mobile)
   or fixed line telephone services that offer access to Emergency
   Services, and (iii) the Software and the Products are not a replacement
   for your primary telephone service. Find out more about calling 112,
   the dedicated emergency number for the EU at
   www.skype.com/go/emergency.

   5.6 Limited Emergency Calling (Internet Communications Software Only
   and Not Applicable to the Qik Software)

   5.6.1 In a very limited number of countries, and for defined Internet
   Communications Software versions and platforms only, Skype will try to
   provide limited emergency calling as a stand-alone feature but can
   provide no commitment in this respect. Click here for the listing of
   countries (“Enabled Countries”) and software versions and other
   platforms (“Enabled Versions”) that enable limited Skype emergency
   calling. Skype emergency calling is not available for any other
   countries, versions or platforms. You should keep traditional wireless
   (mobile) or fixed line telephone services available for your calls to
   Emergency Services and use Skype’s limited emergency calling only as an
   absolute last resort. In particular, please also note that:

   (i) power cut, battery failure or internet connection failure can lead
   to a Skype call failure, including your call to Emergency Services.
   Additionally, any of the quality limitations set out in paragraph 5.9
   below, may otherwise affect successful call connection.

   (ii) where available, an emergency call made using the Internet
   Communications Software in an enabled country may not receive the same
   network priority as a call made using traditional wireless (mobile) or
   fixed line telephone services.

   (iii) if your emergency call is connected, you will need to tell the
   Emergency Services operator that you speak to where you are physically
   located so that the correct emergency organisation can respond to your
   emergency and knows where to find you. If you do not provide this
   information when prompted, you acknowledge that your emergency call may
   not be completed and you will not be able to gain access to your
   required Emergency Services using the Internet Communications Software.
   Skype will have no liability for your failed emergency call in such
   circumstances.

   (iv) other than for the Enabled Countries and Enabled Versions, Skype
   does not provide limited emergency calling in any country or for or in
   conjunction with any Products or using any platforms, devices, services
   or operating systems (including any products, platforms, devices,
   services or operating systems developed by third parties using Skype’s
   APIs, any of Skype’s software development kits or otherwise).

   5.6.2 In Enabled Countries, you should configure the limited emergency
   calling functionality by setting your default location for emergency
   calling in the Call Settings page of your desktop Internet
   Communications Software (if you are using a 4.1 version for Windows (or
   later) or version 2.8 for Mac OS X (or later)). It is your
   responsibility to ensure that this location information is correct and
   kept up-to-date if your physical address changes. Skype does not
   support emergency calls in the majority of countries around the world.
   Where limited emergency calling is supported Skype will not charge you
   to make an emergency call and you do not need to have a Skype Credit
   balance. If however your country is not supported for limited emergency
   calling then you should not attempt to, and agree not to, make any
   emergency calls using your Internet Communications Software. If, with
   your permission, another user uses your User Account, it is your
   responsibility to inform that user of the limited circumstances in
   which limited emergency calling is available.

   5.7 Content of Communications: Skype is not the source of, does not
   verify or endorse and takes no responsibility for the content of
   communications made using the Software. By using the Software, you
   agree that any content that you submit may be transmitted to the
   recipient of your communication. The content of communications is
   entirely the responsibility of the person from whom such content
   originated. You therefore may be exposed to content that is offensive,
   unlawful, harmful to minors, obscene, indecent or otherwise
   objectionable. The content of communications may be protected by
   intellectual property rights, which are owned by third parties. You are
   responsible for the content you choose to communicate and access using
   the Software. In particular, you are responsible for ensuring that you
   do not submit material that is (i) copyrighted, protected by trade
   secret or otherwise subject to third party proprietary rights,
   including privacy and publicity rights, unless you are the owner of
   such rights or have permission from their rightful owner (ii) a
   falsehood or misrepresentation (iii) offensive, unlawful, harmful to
   minors, obscene, defamatory, libellous, threatening, pornographic,
   harassing, hateful, racially or ethnically offensive, or that
   encourages conduct that would be considered a criminal offense, gives
   rise to civil liability, violates any law, or is otherwise
   objectionable; (iv) an advertisement or solicitation of business; or
   (v) impersonating another person. Skype reserves the right (but shall
   have no obligation) to review content for the purpose of enforcing
   these Terms. Skype may in its sole discretion block, prevent delivery
   of or otherwise remove the content of communications as part of its
   effort to protect the Software, Products or its customers, or otherwise
   enforce these Terms. Further, Skype may in its sole discretion remove
   such content and/or terminate these Terms and your User Account if you
   use any content that is in breach of these Terms.

   5.8 Notice and Take-Down If Skype receives any notification that any
   material that you post, upload, edit, host, share and/or publish on the
   Skype Website or through the Software (excluding your private
   communications) (“User Submission”) is inappropriate, infringes any
   rights of any third party, or if Skype wishes to remove your User
   Submission for any reason whatsoever, Skype reserves the right to
   automatically remove such User Submission for any reason immediately or
   within such other timescales as may be decided from time to time by
   Skype in its sole discretion. The User Submission shall be taken down
   without any admission as to liability and without prejudice to any
   rights, remedies or defenses, all of which are expressly reserved. You
   acknowledge and agree that Skype is under no obligation to put back
   such User Submission at any time. If User Submissions infringe, or if
   you believe that User Submissions infringe any of your rights
   (including intellectual property rights) or are unlawful, please
   contact us immediately by following our notice and takedown procedure.
   Click here to view the Notice and Takedown Procedure. Skype reserves
   the right to ask for verification of your identity and to seek further
   information to verify your complaint. You agree that you are solely
   responsible for the consequences resulting from your complaint
   (including but not limited to removal or blocking of the User
   Submission) and you acknowledge and agree that any complaint may be
   used in court proceedings. Any false, misleading or inaccurate
   information provided by you may result in civil and criminal liability.

   5.9 Quality: Skype cannot guarantee that the Software, Products or
   Skype Websites will always function without disruptions, delay or
   errors. A number of factors may impact the quality of your
   communications and use of the Software, Products (depending on the
   Products used) or Skype Websites, and may result in the failure of your
   communications including but not limited to: your local network,
   firewall, your internet service provider, the public internet, the
   public switched telephone network and your power supply. Skype takes no
   responsibility for any disruption, interruption or delay caused by any
   failure of or inadequacy in any of these items or any other items over
   which we have no control.

   5.10 Changes to Products: Skype is constantly improving the Software
   and Products and may also need to change technical features from time
   to time in order to comply with applicable regulations. Accordingly,
   you acknowledge and agree that the Products and functionality of the
   Software may vary from time to time. Technical requirements for use of
   Products and Software and feature descriptions are available on the
   Skype Website. If you do not agree with any changes to Software and
   Products you may terminate your relationship with Skype in accordance
   with paragraph 11. You may need to upgrade to a new version in order to
   enjoy the benefit of certain Products. In addition, you acknowledge and
   agree that certain Products may be subject to usage limits or
   geographical restrictions, which may vary from time to time. Please
   check the Skype Website for details of the most up-to-date usage
   restrictions that apply to the Products that you are using.

   5.11 Unsolicited Ideas Skype does not consider or accept unsolicited
   proposals or ideas, including without limitation ideas for new
   products, technologies, promotions, product names, product feedback and
   product improvements (“Unsolicited Feedback”). If you send any
   Unsolicited Feedback to Skype through the Skype Website or otherwise,
   you acknowledge and agree that Skype shall not be under any obligation
   of confidentiality with respect to the Unsolicited Feedback.

   5.12 Reports Certain parts of the Skype Websites or the Software may
   ask for written suggestions or problem reports such as using our
   contact form or problem report form (“Reports”). Please read carefully
   any specific terms, which govern those Reports. The Reports shall be
   deemed the property of Skype. Skype shall exclusively own all now known
   or hereafter existing rights to the Reports throughout the universe in
   perpetuity and shall be entitled to use the Reports for any purpose
   whatsoever, commercial or otherwise, without compensation to the
   provider of the Reports. Any Reports you send to Skype will not be
   treated as confidential and Skype shall not be liable for any
   disclosure of the Reports.

   5.13 Linking You may link to the Skype Website from another website
   owned by you, provided you do so in a way that is fair and legal and
   does not damage our reputation or take advantage of it. You must not
   establish a link in such a way as to suggest any form of association,
   approval or endorsement by Skype where none exists. You may not frame
   the Site on any other site. Skype provides a Qik branded embeddable
   flash player feature which you may incorporate into your own personal,
   non-commercial website for use in accessing the materials on the Qik
   branded Skype Website. Skype may revoke the permission to link to the
   Skype Websites at any time at its sole discretion and will notify you
   in this respect.

6. YOUR OBLIGATIONS

   6.1 User Account. Prior to your first use of the Skype Software and
   your first use of the Qik Software, you will be asked to create a User
   Account and choose a user ID and password. We recommend that you choose
   a password that is hard to guess and consists of letters, numbers and
   symbols. You may only use the Software through your User Account. You
   are solely responsible and liable for all activities conducted through
   your User Account. To prevent unauthorised use, you shall keep your
   password confidential and shall not share it with any third party or
   use it to access third party websites or services. If you suspect that
   someone else knows your password, then you shall immediately change it
   in order to protect the security of your User Account. It is your
   responsibility to ensure that you do not respond to any unsolicited
   requests for credit card details, passwords or other data. Skype takes
   no responsibility for your failure to comply with the obligations in
   this paragraph 6.1.

   6.2 Lawful Use: You must use the Software, Products and Skype Websites
   in accordance with the laws of where you are located. In some countries
   there are restrictions on the download and use of the Software,
   Products and/or Skype Websites. It is your responsibility to ensure
   that you are legally allowed to use the Software, Products and/or Skype
   Websites where you are located.

   6.3 Prohibited Use: You may not:

   (a) intercept or monitor, damage or modify any communication which is
   not intended for you;

   (b) use any type of spider, virus, worm, trojan-horse, time bomb or any
   other codes or instructions that are designed to distort, delete,
   damage, emulate or disassemble the Software, Products, Skype Websites,
   communication or protocols;

   (c) send unsolicited communications (also referred to as “SPAM”, “SPIM”
   or “SPIT”) or any communication not permitted by applicable law or use
   the Software, Products or Skype Websites for the purposes of phishing
   or pharming or impersonating or misrepresenting affiliation with
   another person or entity;

   (d) expose any third party to material which is offensive, harmful to
   minors, indecent or otherwise objectionable in any way;

   (e) use the Software, Products or Skype Websites to cause or intend to
   cause embarrassment or distress to, or to threaten, harass or invade
   the privacy of, any third party; or

   (f) use (including as part of your User ID and/or profile picture) any
   material or content that is subject to any third party proprietary
   rights, unless you have a licence or permission from the owner of such
   rights; or

   (g) collect or harvest any personally identifiable information,
   including account names, from the Software, Products or Skype Websites;

   (h) impact or attempt to impact the availability of the Software,
   Products or Skype Websites for example, with a denial of service (DOS)
   or distributed denial of service (DDoS) attack;

   (i) use or launch any automated system, including without limitation,
   robots, spiders or offline readers that access the Software, Products
   or Skype Websites. Notwithstanding the foregoing, you agree that Skype
   grants to the operators of public search engines permission to use
   spiders to copy materials from the Skype Website for the sole purpose
   of creating publicly available searchable indices of the materials, but
   not caches or archives of such materials. Skype reserves the right to
   revoke these exceptions at any time.

   6.4 User Submissions Please exercise respect when participating in any
   features of the Skype Websites or Software such as Forums, Blogs, email
   functions, video hosting, sharing and/or publishing or any other
   function on the Skype Websites or of the Skype Software which allows
   you to post, upload, edit, host, share and/or publish content. You
   acknowledge and agree that: (i) by using the Skype Websites and/or
   Software you may be exposed to content that you may find offensive or
   indecent and you do so at your own risk; (ii) you are solely
   responsible for, and Skype has no responsibility to you or any third
   party for any User Submissions that you create, submit, post or publish
   on the Skype Websites or through the Software; (iii) Skype does not
   guarantee any confidentiality with respect to User Submissions, whether
   or not they are published (iv) Skype is not responsible for any User
   Submissions that you may have access to through your use of the Skype
   Websites or Software and all User Submissions are the responsibility of
   the person from whom such User Submissions originated. Skype does not
   endorse any User Submissions or any opinion, recommendation, or advice
   expressed therein, and expressly disclaims any and all liability in
   connection with User Submissions.

   In connection with your User Submissions, you represent and warrant
   that you

   (i) own or have the necessary licenses, rights, consents, and
   permissions to use and authorise Skype to use all copyrights, trade
   marks, trade secrets, patents and other intellectual property or
   proprietary rights in and to any and all User Submissions in accordance
   with these Terms; and

   (ii) you have the written consent, release and /or permission of each
   and every identifiable individual person in the User Submission to use
   the name and/or likeness of each and every such individual in the User
   Submission, to enable inclusion and use thereof in the manner
   contemplated by these Terms. You shall not copy, post or use text,
   photos, pictures, music, sounds, images or any other content from any
   third party or source (“Third Party Content”) without specific
   permission from the owner. Such Third Party Content may be protected by
   intellectual property laws and the owners of the intellectual property
   rights in such content may object to its use. You must not use any
   Third Party Content without first obtaining the permission of the owner
   of the intellectual property rights in such content.

   Notwithstanding any rights or obligations governed by the Additional
   Terms (as defined below) if, at any time you choose to upload or post
   User Submissions to the Skype Websites or through the Software
   (excluding Reports and excluding the content of your communications)
   you automatically grant Skype a non-exclusive, worldwide, irrevocable,
   royalty-free, perpetual, sub-licensable and transferable license of all
   rights to use, edit, modify, include, incorporate, adapt, record,
   publicly perform, display, transmit and reproduce the User Submissions
   including, without limitation, all trade marks associated therewith, in
   connection with the Skype Websites and Skype’s Software and Products
   including for the purpose of promoting or redistributing part or all of
   the Skype Websites and/or the Software or Products, in any and all
   media now known or hereafter devised. You also hereby grant each user
   of the Skype Website and/or Skype’s Software or Products a
   non-exclusive license to access your User Submission through the Skype
   Website and/or Software or Products and to use, copy, distribute,
   prepare derivative works of, display, perform and transmit such User
   Submissions solely as permitted through the functionality of the Skype
   Websites and/or Software or Products and pursuant to these Terms of
   Use. In addition, you waive any so-called “moral rights” in and to the
   User Submissions, to the extent permitted by applicable law.

   You may not submit or publish through the Skype Website or Software any
   User Submissions that are libelous, defamatory, pornographic,
   harassing, hateful, an invasion of privacy, obscene, abusive, illegal,
   racist, offensive, harmful to a minor or an infringement of any
   intellectual property rights or a trade secret of a third party, or
   would otherwise violate the rights of any third party or give rise to
   civil or criminal liability. Furthermore, you may not submit or publish
   User Submissions that contain falsehoods or misrepresentations, solicit
   funds or services, contain advertising, promotional materials, junk
   mail, spam, chain letters or any form of solicitation, impersonate
   others or include programs that contain viruses or any other programs
   designed to impair the functionality of any computer. You agree not to
   solicit, for commercial purposes, any users of the Skype Website or
   Software with respect to their User Submissions. You agree not to
   circumvent, disable or otherwise interfere with the security related
   features of the Skype Website or Software or features that prevent or
   restrict the use of any content thereof.

   6.5 Your Information: From time to time, Skype may request information
   from you for the purpose of supplying the Software or Products to you.
   You shall ensure that any such information is complete, up-to-date and
   accurate.

   6.6 No Reselling. The Software and Products are for your individual
   use. You shall not resell or commercialise the Software and/or Products
   to any third party.

   6.7 Export Restrictions: The Software may be subject to international
   rules that govern the export of software. You shall comply with all
   applicable international and national laws that apply to the Software
   as well as end-user, end-use, destination restrictions issued by
   national governments or similar bodies, and restrictions on embargoed
   nations. In the US the Internet Communications Software is controlled
   under ECCN 5D992 of the Export Administration Regulations (“EAR”) under
   Encryption Registration Number (“ERN”) R100351 and thus may not be
   exported or re exported from the US to or downloaded by any person in
   any countries controlled for anti terrorism reasons under the EAR,
   which include Iran, North Korea, Cuba, Syria and Sudan. Moreover, the
   Internet Communications Software may not be exported or re exported
   from the US to or downloaded by any person or entity subject to US
   sanctions regardless of location. See
   www.bis.doc.gov/ComplianceAndEnforcement/ListsToCheck.htm and EAR Part
   736. Skype is making the Software available to you for download only on
   the condition that you certify that you are not such a person or entity
   and that the download is not otherwise in violation of US export
   control and sanctions regulations.

7. PROPRIETARY RIGHTS

   7.1 The Software, Products and Skype Websites contain proprietary and
   confidential information that is protected by intellectual property
   laws and treaties.

   7.2 The content and compilation of content included on the Skype
   Websites, (excluding User Submissions) such as sounds, text, graphics,
   logos, icons, images, audio clips, digital downloads and software, are
   the property of Skype, its affiliates or licensors and are protected by
   United States and international copyright laws. Such copyright
   protected content cannot be reproduced without Skype’s express
   permission. You may download and make personal, non-commercial use of
   User Submissions on www.qik.com that are displayed with a “download” or
   similar link. Skype reserves all rights not expressly granted in the
   Skype Websites.

   7.3 Skype and/or its licensors retain exclusive ownership of the
   Software, Products and Skype Websites and all intellectual property
   therein (whether or not registered and anywhere in the world). You will
   not take any action to jeopardise, limit or interfere with Skype’s
   intellectual property rights in the Software, Products and/or Skype
   Websites.

   7.4 “Skype”, associated trademarks and logos and the “S” logo are
   trademarks of Skype. Skype has registered and filed applications to
   register its trademarks in many countries worldwide. Skype’s trademarks
   and trade dress may not be used in connection with any product or
   service that is not Skype’s, in any manner that is likely to cause
   confusion among customers, or in any manner that disparages or
   discredits Skype. All other trademarks not owned by Skype or any of its
   related companies that appear on this site are the property of their
   respective owners. You are not permitted to and shall not register or
   use any trade name, trademark, logo, domain name or any other name or
   sign that incorporates any of Skype’s intellectual property (in whole
   or part) or that is confusingly similar thereto. Please also see
   Skype’s Trademark Guidelines for further details on use of its marks.

8. CHARGES

   8.1 Calling phones and premium rate numbers with Skype Credit:

   (i) Calling landlines and mobiles: The charges payable for calling
   phones (outside of a subscription) consist of a connection fee (charged
   once, per call) and a per-minute rate as set out on
   www.skype.com/go/allrates. All calls will be disconnected and require a
   re-dial after a 4-hour duration and an additional connection fee will
   be charged on re-dial.

   (ii) Premium rate numbers: The charges payable for calling premium rate
   numbers consist of a per-minute rate available at
   www.skype.com/go/rates-premium. No connection fee is payable.

   (iii) Skype may change the rates for calling phones and premium rate
   numbers at any time without notice to you by posting such change at
   www.skype.com/go/allrates. The new rate will apply to your next
   purchase after the new rates have been published. Please check the
   latest rates before you make your call. If you do not accept the new
   rates, do not make your call.

   (iv) The duration of a call shall be based on one-minute increments.
   Fractions of minutes will be rounded up to the next minute. The
   connection fee, where applicable, will be charged at the beginning of
   the call. At the end of a call, fractional cent charges will be rounded
   up to the nearest whole cent, for example a total call price of €0.034
   will be rounded up to €0.04. During the call, charges incurred will be
   deducted automatically from the Skype Credit balance in your User
   Account.

   8.2 Charges for other Paid For Products: The charges for other Paid For
   Products will be confirmed to you before you complete a purchase from
   Skype. Skype may change the charges payable for the purchase of such
   Products at any time without any notice to you. You can choose whether
   or not to accept the new charges prior to completing your next purchase
   of the applicable Product. The new charges will apply to your next
   purchase after the new charges have been published.

   8.3 Promotional Offers: From time to time, Skype may offer Paid-For
   Products for free for a trial period. Skype reserves the right to
   charge you for such Products (at the normal rate) in the event that
   Skype determines (in its reasonable discretion) that you are abusing
   the terms of the offer, including if you are using any service, proxy
   or other devices or anonymous IP address that prevents us from locating
   you.

   8.4 Tax: Skype may collect VAT or other indirect taxes at the
   appropriate rate (as per applicable tax rules) at the time of purchase
   of Skype Credit. 15% Luxembourg VAT generally applies if you are
   located in the EU and the Products are purchased and used in the EU. 8%
   Swiss VAT applies if you are located in Switzerland. Other local taxes
   may apply in certain countries. When you purchase a voucher or pre-paid
   card, depending on the country, 15% Luxembourg VAT, local VAT or other
   taxes may apply and may be deducted from the value of the voucher or
   prepaid card upon redemption. You explicitly waive any right to VAT
   reimbursement from Skype if the amount of VAT ultimately payable by the
   latter to the tax authorities would for any reason be lower than the
   amount of VAT collected from you at the time of purchase. Your Skype
   Credit balance is displayed exclusive of any such taxes. The
   territories in the EU set out below are outside the scope of EU VAT
   under Council Directive 2006/112/EC on the common system of VAT, as
   amended. The Skype Website does not enable users in such territories to
   take advantage of this VAT exemption and we therefore do not provide
   the Products in such territories: Mount Athos, Canary Islands, French
   Overseas Departments, Aland Islands, Channel Islands, Heligoland
   Island, Büsingen / Buesingen Territory, Ceuta, Melilla, Livigno,
   Campione d'Italia and Italian Waters of Lake Lugano.

   8.5 Third-Party Charges: Using the Software on mobile applications will
   use some of the data allowance available on the data package to which
   you have subscribed with your mobile network operator. Out-of-country
   usage may lead to significantly higher costs than regular usage, and
   you are solely responsible for keeping yourself informed and paying for
   possible roaming and other applicable charges levied by your mobile
   network operator.

9. PAYMENT

   9.1 Skype Credit. You can pay for select Paid-For Products using Skype
   Credit. You can purchase Skype Credit using any payment method made
   available to you by Skype from time to time. The Skype Credit that you
   purchase will be credited to your User Account at the time of purchase
   (or if you are using a Skype Credit voucher, at the time you redeem
   that voucher).

   9.2 Inactive Skype Credit. If you do not use your Skype Credit for a
   period of 180 days, (including Skype Credit that has been allocated to
   you by a Skype Manager administrator) Skype will place your Skype
   Credit on inactive status. You can reactivate the Skype Credit by
   following the reactivation link in My Account at
   https://secure.skype.com/account/credit-reactivate. Reactivated Skype
   Credit is not refundable. If you are located in Japan and you buy Skype
   Credit from the Skype Website, this paragraph does not apply to you and
   your Skype Credit shall expire 6 months from the date of purchase. You
   are not permitted to use any Skype Credit on or after the date of its
   expiry.

   9.3 Other payment methods. Skype does not guarantee that you will be
   able to use your Skype Credit balance to purchase all Products. Where
   Skype Credit cannot be used to pay for a Product, Skype will make
   another payment method available to you. Skype reserves the right to
   remove or amend the available payment methods at its sole discretion.

   9.4 Recurring Payments. Where you purchase Products on a subscription
   basis (monthly, every 3 months or annually (as applicable)), you
   acknowledge and agree that this is a recurring payment and payments
   shall be made to Skype by the method you have chosen at the recurring
   intervals chosen by you, until the subscription for that Product is
   terminated by you or by Skype.

   9.5 Auto-Recharge.

   (a) The Auto-Recharge feature will be automatically enabled when you
   buy Skype Credit, unless you untick the appropriate box. Your Skype
   Credit balance will be recharged with the same amount and by the same
   payment method chosen when you first sign up for Auto-Recharge, unless
   you subsequently change the amount by accessing your User Account. For
   example, if you purchase 10 Euros of Skype Credit with your credit
   card, the recharge amount charged to your credit card will also be 10
   Euros of Skype Credit. In future the same amount will be charged to
   your credit card every time your Skype account balance goes below the
   threshold set by Skype from time to time. If you do not want to enable
   Auto-Recharge, please untick the box.

   (b) If you purchased a subscription with a payment method other than
   credit card, PayPal or Moneybookers (Skrill), and you have enabled
   Auto-Recharge, your Skype Credit balance will be recharged with the
   amount necessary to purchase your next recurring subscription.

   (c) You can disable Auto-Recharge at any time by accessing your User
   Account.

10. REFUND POLICY

   10.1 When you purchase Paid-For-Products directly from Skype you will
   be entitled to a cancellation period of fifteen (15) days (a
   “Cooling-Off Period”) unless you have made use of the Paid-For-Products
   in any way, in which case the Cooling-Off Period will be extinguished
   and your purchase cannot be cancelled or refunded.

   10.2 Outside of the Cooling-Off Period, only subscriptions are
   refundable unless used or expired.

   10.3 Expenditure of Skype Credit, allocation of a Skype Number, or use
   of any aspect of a subscription amounts to “use” of a Paid-For-Product.
   You hereby expressly agree that Skype Numbers may be allocated before
   the end of the Cooling-Off Period.

   10.4 The Cooling-Off Period and refunds do not apply to
   Paid-For-Products that are (i) purchased via a third party partner of
   Skype (please contact the partner directly, who may decide in its sole
   discretion whether or not to pay a refund), (ii) not directly acquired
   online from Skype (e.g. vouchers or pre-paid cards) (iii) paid for in
   cash using third party payment methods (such as a cash payment wallet)
   and (iv) paid for and allocated to your Skype Account by a Skype
   Manager administrator. They also do not apply to Membership of Skype
   Developer.

   10.5 If you believe that Skype has charged you in error, you must
   contact Skype within 90 days of such charge. No refunds will be given
   for any charges more than 90 days old.

   10.6 Skype reserves the right to refuse a refund request if it
   reasonably believes (i) that you are trying to unfairly exploit this
   refund policy, for example, by making repetitive refund requests in
   respect of the same Product; (ii) if you are in breach of these Terms
   or (iii) if Skype reasonably suspects that you are using our Products
   or Software fraudulently or that your User Account is being used by a
   third party fraudulently.

   10.7 This refund policy does not affect your statutory rights.

11. ENDING YOUR RELATIONSHIP WITH SKYPE

   11.1 You may terminate your relationship with Skype at any time and
   without recourse to the courts by requesting closure of your User
   Account, ceasing to use the Software, Products and/or Skype Websites
   and cancelling any recurring payments.

   11.2 Skype may terminate its relationship with you, or may terminate or
   suspend your use of the Software, User Account(s), Products or Skype
   Websites at any time and without recourse to the courts:

   (a) if you are in breach of these Terms;

   (b) if Skype reasonably suspects that you are using the Software, the
   Products and/or Skype Websites to break the law or infringe third party
   rights;

   (c) if Skype reasonably suspects that you are trying to unfairly
   exploit or misuse the refund policy, or any of our policies.

   (d) if Skype reasonably suspects that you are using our Products,
   Software and/or Skype Websites fraudulently or that your User Account
   is being used by a third party fraudulently;

   (e) if you have purchased Skype Credit from an unauthorised reseller;

   (f) in respect of a particular Product, on thirty (30) days notice if
   Skype decides to cease offering that Product;

   (g) immediately, if required due to a change in laws/regulation by a
   regulator or authority with a lawful mandate, or by any of Skype’s
   partners;

   (h) on thirty (30) days notice if Skype decides to cease offering the
   Software to users in your jurisdiction generally.

   11.3 Skype shall effect such termination by preventing your access to
   your User Account, the Software, Products and/or Skype Websites (as
   applicable). We reserve the right to cancel User Accounts that have
   been inactive for more than one (1) year.

   11.4 Consequences of Termination: Upon termination of your relationship
   with Skype: (a) all licenses and rights to use the Software, Products
   and/or Skype Websites shall immediately terminate; (b) you will
   immediately cease any and all use of the Software, Products and/or
   Skype Websites; and (c) you will immediately remove the Software from
   all hard drives, networks and other storage media and destroy all
   copies of the Software in your possession or under your control.

12. EXCLUSION OF WARRANTIES, LIMITATION OF LIABILITY AND INDEMNITY

   12.1 For the purposes of this paragraph 12, "Skype" includes its
   subsidiary companies and affiliated legal entities and all their
   directors, officers, agents, licensors and employees.

   12.2 No Warranties: TO THE MAXIMUM EXTENT PERMITTED BY LAW: THE
   SOFTWARE, PRODUCTS AND SKYPE WEBSITES ARE PROVIDED “AS IS” AND USED AT
   YOUR SOLE RISK WITH NO WARRANTIES WHATSOEVER; SKYPE DOES NOT MAKE ANY
   WARRANTIES, CLAIMS OR REPRESENTATIONS AND EXPRESSLY DISCLAIMS ALL SUCH
   WARRANTIES OF ANY KIND, WHETHER EXPRESS, IMPLIED OR STATUTORY, WITH
   RESPECT TO THE SOFTWARE, PRODUCTS AND/OR SKYPE WEBSITES INCLUDING,
   WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF QUALITY, PERFORMANCE,
   NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR USE FOR A PARTICULAR
   PURPOSE. SKYPE FURTHER DOES NOT REPRESENT OR WARRANT THAT THE SOFTWARE,
   PRODUCTS AND/OR SKYPE WEBSITES WILL ALWAYS BE AVAILABLE, ACCESSIBLE,
   UNINTERRUPTED, TIMELY, SECURE, ACCURATE, COMPLETE AND ERROR-FREE OR
   WILL OPERATE WITHOUT PACKET LOSS, NOR DOES SKYPE WARRANT ANY CONNECTION
   TO OR TRANSMISSION FROM THE INTERNET, OR ANY QUALITY OF CALLS MADE
   THROUGH THE SOFTWARE.

   12.3 Nothing in these Terms shall exclude or restrict Skype's liability
   for (a) death or personal injury, (b) loss resulting from Skype's
   wilful default or gross negligence, (c) fraud or deliberate
   misrepresentation, or (d) any liability which cannot be limited or
   excluded by applicable law.

   12.4 No Liability: YOU ACKNOWLEDGE AND AGREE THAT SKYPE WILL HAVE NO
   LIABILITY WHATSOEVER, WHETHER IN CONTRACT, TORT (INCLUDING NEGLIGENCE)
   OR ANY OTHER THEORY OF LIABILITY, AND WHETHER OR NOT THE POSSIBILITY OF
   SUCH DAMAGES OR LOSSES HAS BEEN NOTIFIED TO SKYPE, IN CONNECTION WITH
   OR ARISING FROM YOUR USE OF SKYPE WEBSITES, OR THE INTERNET
   COMMUNICATIONS SOFTWARE OR OTHER SOFTWARE THAT IS PROVIDED FREE OF
   CHARGE. YOUR ONLY RIGHT OR REMEDY WITH RESPECT TO ANY PROBLEMS OR
   DISSATISFACTION WITH SUCH SOFTWARE AND/OR SKYPE WEBSITES IS TO
   IMMEDIATELY DEINSTALL SUCH SOFTWARE AND CEASE USE OF SUCH SOFTWARE
   AND/OR SKYPE WEBSITES.

   12.5 Limitation of Liability: Subject to paragraphs 12.3 and 12.4
   above, Skype shall not be liable to you, whether in contract, tort
   (including negligence) or any other theory of liability, and whether or
   not the possibility of such damages or losses has been notified to
   Skype, for:

   (a) any indirect, special, incidental or consequential damages; or

   (b) any loss of income, business, actual or anticipated profits,
   opportunity, goodwill or reputation (whether direct or indirect); or

   (c) any damage to or corruption of data (whether direct or indirect);

   (d) any claim, damage or loss (whether direct or indirect ) arising
   from or relating to:

   (i) your inability to use the Software to contact Emergency Services;

   (ii) your failure to make additional arrangements to access Emergency
   Services in accordance with paragraph 5.5 above;

   (iii)the service limitations set out in paragraph 5.6;

   (iv)your failure to provide accurate physical location information to
   an Emergency Services operative; or

   (v)conduct of third party Emergency Services operatives and calling
   centres to which you may be connected.

   (e) any claim, damage or loss (whether direct or indirect) arising from
   or relating to:

   (i) any product or service provided by a third party under their own
   terms of service, including without limitation, Skype WiFi;

   (ii) any Third Party Technology;

   (iii) any third party website.

   12.6 Subject to paragraphs 12.3 - 12.5 above, Skype’s total liability
   to you under or in connection with these Terms (whether in contract,
   tort (including negligence) or any other theory of liability)) SHALL
   NOT EXCEED IN AGGREGATE THE AMOUNT PAID BY YOU FOR THE PRODUCTS IN THE
   12 MONTH PERIOD IMMEDIATELY PRIOR TO THE DATE OF THE EVENT GIVING RISE
   TO THE RELEVANT CLAIM, SUBJECT TO A MAXIMUM OF FIVE THOUSAND EUROS IN
   ALL CASES.

   12.7 If any third party brings a claim against Skype in connection
   with, or arising out of (i) your breach of these Terms; (ii) your
   breach of any applicable law of regulation; (iii) your infringement or
   violation of the rights of any third parties (including intellectual
   property rights); (iv) your User Submissions or (v) your complaint in
   relation to any User Submission, you will indemnify and hold Skype
   harmless from and against all damages, liability, loss, costs and
   expenses (including reasonable legal fees and costs) related to such
   claim.

13. THIRD-PARTY WEBSITES, PRODUCTS AND SERVICES

   13.1 Third parties may offer products or services via the Software
   and/or Skype Websites, including games, applications, images, ring
   tones, or avatars. Whilst Skype takes no responsibility for such
   products or services, if you encounter any problems with payment for or
   download, use of installation of such products or services, Skype will
   use commercially reasonable endeavours to assist or resolve the
   problems. The third party products or services may be subject to the
   third party provider’s own terms and privacy policy that you may have
   to accept upon download or installation. You should review such terms
   before making any purchase or using any third party product or service
   and Skype shall not be responsible for your failure to do so.

   13.2 You acknowledge and agree that any third-party product information
   and pricing that is shown on the Skype Websites regarding third-party
   products and services is given to Skype by the applicable third-party
   merchant (“Merchant”). The Merchant has the ability to change its
   pricing or terminate its product availability at anytime. Skype is not
   involved in any transactions between you and any Merchant whose
   products and/or services are listed on the Skype Websites. Skype does
   not control, is not responsible for and does not guarantee: (i) the
   pricing, quality, performance, availability or terms and conditions of
   purchase of products or services provided by the Merchant; (ii) any
   payment transactions, delivery, returns or after sales activities
   related to the products or services purchased on the Merchants’
   websites; (iii) the availability of the Merchant’s websites; (iv) the
   completeness, truth or accuracy of any advertising or other materials
   on, or available from, the Merchants’ websites, nor any listing or
   other content about such products and services displayed on the Skype
   Websites; (v) links to the Merchants’ websites that are featured on the
   Skype Websites. Any questions, complaints, or claims related to any
   product or service provided by a Merchant should be directed to the
   applicable Merchant.

   13.3 The Software and Skype Websites may include hyperlinks to other
   third party websites. Skype is not responsible for such third party
   websites or the availability of such websites and does not endorse any
   content or material on such third party websites. Your use of each of
   these third party websites is subject to the terms and conditions
   posted on the applicable website.

14. ADDITIONAL TERMS

   14.1 The Skype Etiquette provides guidelines on how to use Skype and
   how to treat the other members of Skype’s community properly and
   respectfully. Please read these guidelines carefully which form part of
   the Terms.

   14.2 If you want to use the Internet Communications Software in
   connection with any Broadcast, you must comply with the Broadcast TOS
   at http://www.skype.com/legal/broadcast

   14.3 Software Development Kits and APIs. Software development kits
   provided through Skype Developer on the Skype Website (including
   “SkypeKit”) and the use of any application program interface (“API”)
   exposed or made available by Skype are subject to their own licensing
   terms in which case such licensing terms will govern your use of that
   software. If you use any such software development kit or API (as
   applicable) you agree that you have read and will comply with the
   applicable licensing terms, which are available on
   http://developer.skype.com/.

   14.4 Qik Free and Open Source Software Notice is incorporated herein by
   reference.

15. YOUR CONFIDENTIAL INFORMATION AND YOUR PRIVACY

   Skype is committed to respecting your privacy and the confidentiality
   of your personal information. We will process your personal
   information, the traffic data and the content of your communication(s)
   in accordance with our Privacy Policy: http://www.skype.com/go/privacy.

16. FOR GOVERNMENT USERS ONLY

   The Software and Documentation are “commercial computer software” and
   “commercial computer software documentation,” respectively, as such
   terms are used in United States Federal Acquisition Regulations
   paragraph 12.212. Any use, duplication or disclosure of the Software or
   the Documentation by or on behalf of the U.S. Government is subject to
   restrictions as set forth in this Agreement.

17. HOW TO CONTACT SKYPE

   17.1 To contact Skype in relation to the Skype Software or “Skype”
   branded Products, please submit a support request to support.skype.com.

   17.2 To contact Skype in relation to the Qik Software or “Qik” branded
   Products, please submit a support request to support.qik.com.

   17.3 If you contact Skype by any means other than as set out in
   paragraphs 17.1 or 17.2, your request may not be acknowledged.

18. MISCELLANEOUS

   18.1 You agree to the use of electronic communication in order to enter
   into contracts, place orders, and create other records and to the
   electronic delivery of notices, policies and changes thereto and
   records of transactions with Skype.

   18.2 For your convenience, Skype may provide you with a translation of
   the English language version of these Terms. In the event of any
   inconsistency between a non-English version of these Terms and the
   English version, the English version shall govern your relationship
   with Skype.

   18.3 These Terms constitute the entire agreement between you and Skype
   with respect to your use of the Software, Products and/or Skype
   Websites and replace any prior agreements between you and Skype with
   respect to the Software, Products and/or Skype Websites.

   18.4 If any provision of these Terms (or part of it), is found by any
   court or administrative body of competent jurisdiction or an arbitrator
   to be illegal, invalid or unenforceable, then such provision (or part
   of it) shall be removed from the Terms without affecting the legality,
   validity or enforceability of the remainder of the Terms. Paragraph
   20.3(i) says what happens if parts of paragraph 20.3 (arbitration and
   class action waiver) are found to be illegal, invalid or unenforceable.
   Paragraph 20.3(i) prevails over this paragraph if inconsistent with it.

   18.5 The failure by Skype to exercise, or delay in exercising, a legal
   right or remedy provided by these Terms or by law shall not constitute
   a waiver of Skype’s right or remedy. If Skype waives a breach of these
   Terms, this shall not operate as a waiver of a subsequent breach of the
   Terms.

   18.6 You may not assign these Terms or any rights or obligations
   contained in them. Skype may, without prior notice, assign these Terms
   or any rights or obligations contained in them to any third party.

   18.7 This paragraph 18, along with paragraphs, 4.2, 12, 20.3 and any
   other provisions, which are expressed or clearly intended to survive or
   operate in the event of termination, shall survive termination of the
   Terms.

   18.8 You acknowledge and agree that if Skype is unable to provide the
   Software, Products and/or Skype Websites as a result of a force majeure
   event, Skype will not be in breach of any of its obligations towards
   you under these Terms. A force majeure event means any event beyond the
   control of Skype.

   18.9 These Terms other than paragraph 20.3 shall be governed by and
   interpreted in accordance with the laws of Luxembourg and shall be
   subject to the jurisdiction of the courts of the district of
   Luxembourg. Paragraph 20.3 is governed by the United States Federal
   Arbitration Act.

   18.10 AVC/H.264 NOTICE: If the Software is used to make video calls (i)
   between a personal computer and a device that is not a personal
   computer or (ii) between devices that are not personal computers, the
   AVC/H.264 codec may be used to facilitate video functionality in which
   case the following notice applies: THE AVC VIDEO FUNCTIONALITY IN THIS
   PRODUCT IS LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR THE
   PERSONAL AND NON-COMMERCIAL USE OF A CONSUMER TO (i) ENCODE VIDEO IN
   COMPLIANCE WITH THE AVC STANDARD (“AVC VIDEO”) AND/OR (ii) DECODE AVC
   VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A PERSONAL AND
   NON-COMMERCIAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PROVIDER
   LICENSED TO PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR SHALL BE
   IMPLIED FOR ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM
   MPEG LA, L.L.C. SEE www.mpegla.com.

19. PRODUCT SPECIFIC TERMS

   19.1 Skype Numbers (previously known as “Online Numbers”) and Skype To
   Go numbers

   (a) Availability and use. Where we provide you with a Skype Number or
   Skype To Go number, you agree that:

   (i) you do not own the number or have a right to retain that number
   forever;

   (ii) the number provided to you is subject to applicable numbering
   rules and regulatory practices;

   (iii) you will comply on an ongoing basis with any specific number
   allocation requirements that we make you aware of, or any reasonable
   instructions that Skype or Skype’s partners may give to you with regard
   to the use of the numbers and the Products;

   (iv) you will not transfer or attempt to transfer your number to any
   third party. In particular, you are responsible for compliance with any
   requirements related to residency and or location; and

   (v) you will supply accurate, complete and up-to-date information to us
   where we request it and inform us where such information changes. Skype
   reserves the right to change the terms related to Skype Numbers and/or
   Skype To Go numbers, including without limitation to impose or amend
   any residency requirements and/or require the provision of further user
   information for continued access to such numbers. In certain countries,
   a number may be made available to you by a Skype partner rather than
   Skype, and you may need to enter into a separate agreement with such
   partner.

   (b) Other changes to numbers. If Skype needs to withdraw or change the
   number that has been made available to you, Skype will use commercially
   reasonable endeavours to notify you by e-mail, stating the effective
   date of the change and where possible, your new number. If you do not
   wish to accept this new number, you are entitled to terminate your
   number.

   19.2 User Account on Skype Manager

   (a) You are not permitted to belong to more than one Skype Manager at
   the same time.

   (b) Any Skype Number purchased before 21 July 2009 and allocated to you
   by a Skype Manager administrator shall be taken back by the
   administrator of the Skype Manager, if you leave the Skype Manager
   account for any reason. The right to use the number and the
   cancellation of such right rest with the Skype Manager administrator at
   his/her sole discretion and not you.

   (c) Personal and traffic data – Members. As a member of a Skype Manager
   account you acknowledge and agree that the administrator of the Skype
   Manager may, if you agree, view detailed information about the activity
   on your User Account including the time, date, duration and destination
   number of calls and SMS made and details of your purchases and
   downloads. You can withdraw your agreement at any time by changing the
   settings on your User Account. If you provide personal data including
   your name and job title to be included on the Skype Manager directory,
   you acknowledge that other members of that Skype Manager may view such
   data.

   19.3 Subscriptions

   (a) Fair Usage Policy. At Skype, we want all of our customers to get
   the best calling plans, known as ‘subscriptions’, at the lowest
   possible price. This Fair Usage Policy ("FUP") is designed to prevent
   fraud and abuse of our subscriptions by a small number of users.

   Subject to this FUP, Skype’s unlimited subscriptions allow unlimited
   calls to landlines in the applicable subscription countries (excluding
   special, premium, service and non-geographic numbers). Unlimited calls
   to mobiles may also be included where stated at the time of purchase.
   All calls will be disconnected and require a re-dial after a 2-hour
   duration.

   Skype’s subscriptions are for individual use only (personal or business
   communications) in accordance with our Terms of Use and this FUP
   (“Legitimate Use”). The following is a non-exhaustive list of practices
   that would not be considered Legitimate Use:

   (i) Using subscriptions for telemarketing or call centre operations;

   (ii) Re-selling subscription minutes;

   (iii) Sharing subscriptions between users whether via a PBX, call
   centre, computer or any other means;

   (iv) Calling numbers (whether singly, sequentially or automatically) to
   generate income for yourself or others as a result of merely placing
   the call, other than for your individual business communications (and
   subject to paragraph 4.1 of the Terms of Use); and

   (v) Unusual calling patterns inconsistent with normal, individual
   subscription use, for example, regular calls of short duration or calls
   to multiple numbers in a short period of time.

   Other practices may be relevant in determining Legitimate Use and Skype
   reserves the right to take any unlawful, prohibited, abnormal or
   unusual activity into account in making its determination. Skype may at
   its option, terminate its relationship with you, or may suspend your
   subscription immediately if it determines you are using your
   subscription contrary to this FUP or Skype’s Terms of Use. Where
   reasonable, Skype will provide you with notice of improper usage before
   suspension or termination of your subscription and, if appropriate,
   Skype may offer you an alternative subscription.

   (b) Skype reserves the right to withdraw or change the subscriptions at
   any time. If Skype changes the Products included in your subscription,
   Skype will notify you by email stating the changes and their effective
   date. If you do not wish to accept these changes, you are entitled to
   terminate your subscription, with effect from the date on which the
   changes are due to take effect.

   (c) The “Unlimited World Extra” subscription has a minimum fixed term
   of 2 years from the date of purchase. You are not permitted to
   terminate it before the expiry of the 2-year minimum term except in
   case of breach by Skype of the Terms. This subscription is billed
   monthly as a recurring payment.

   19.4 Skype WiFi

   Skype WiFi is provided by one of Skype’s WiFi partners. Your use of
   Skype WiFi is subject to that partner’s terms of service. Before you
   start a Skype WiFi session at a specific WiFi hotspot, you will be
   notified of the identity of the WiFi provider and their terms of
   service. You will have to read their terms of service, which you agree
   to be subject to by proceeding with the Skype WiFi session. You can pay
   for Skype WiFi using your Skype Credit balance, and your use of Skype
   Credit is subject to these Terms of Service.

   19.5 SMS

   Each SMS message has a limit of 160 characters. If you type a longer
   message it will be broken down into several SMS messages and you will
   be charged for each message sent. If you send SMS messages to more than
   one person you will be charged for each SMS sent to each recipient. If
   Skype cannot (for whatever reason) send your SMS, Skype will continue
   to try and send the message for up to 24 hours after which time the SMS
   charge will be refunded to your Skype Credit balance automatically if
   delivery is unsuccessful.

   19.6 Group Video Calling

   (a) A fair usage policy applies at www.skype.com/go/terms.gvc.fairusage
   and is incorporated herein by reference. Skype reserves the right to
   change the fair usage policy at any time. Changes shall become
   effective when published on the Skype Website. Your continued use of a
   Skype Premium Subscription after publication on the Skype Website shall
   constitute your acceptance to be bound by the terms and conditions of
   the revised fair usage policy.

   (b) Number of Participants. The number of permitted participants on a
   group video call varies from 3 to a maximum of 10, subject to system
   requirements. You can find more details at
   www.skype.com/go/skypepremium.

   (c) Audio Conversion. If a Skype Premium Subscription or Day Pass
   expires during a group video call, or it has exceeded the fair usage
   limit, or the owner of the Skype Premium Subscription leaves the call
   (and there is no other participant on the call who owns a Skype Premium
   Subscription), then the call will convert from video to audio.

   (d) Software Versions. If a participant of a group video call is not on
   a version of Internet Communications Software that supports group video
   calls, then the call will be an audio call only for that participant.
   For details of the system requirements for group video calling, please
   see www.skype.com/go/skypepremium.requirements.

   (e) Live chat. Live chat customer support is available as part of the
   Skype Premium Subscription. This support is available 24 hours a day,
   every day, and only in English.

   19.7 Qik Premium Fair Usage Policy

   Qik Premium is subject to a fair usage policy of 15GB of video storage
   per user per month and each video can be no more than 90 minutes in
   duration. Once these limits have been reached you cannot upload any new
   videos in that month or continue recording beyond the 90-minute mark.

   Skype reserves the right to change the fair usage policy at any time.
   Changes shall become effective when published on the Skype Website.
   Your continued use of Qik Premium after publication on the Skype
   Website shall constitute your acceptance to be bound by the terms and
   conditions of the revised fair usage policy.

   19.8 Skype Video Messaging (“Video Messaging”)

   If you are not a Skype Premium subscriber, the number of Video Messages
   you can send are limited and will be subject to an expiry date.

   Fair Use Policy: This FUP is designed to prevent fraud and abuse of
   Video Messaging. Video Messaging is for personal, individual and
   non-commercial use only, and to be in accordance with these Terms at
   all times (“Legitimate Use”). Skype reserves the right to take any
   unlawful, prohibited, abnormal or unusual activity into account in
   making its determination as to whether your activity does not
   constitute Legitimate Use. Skype may in its option, terminate its
   relationship with you, or suspend your account immediately if it
   determines you are using Video Messaging contrary to this FUP or these
   Terms.

20. PAY BY MOBILE

   20.1 This section applies if you select a third-party payment system
   that enables you to pay for Skype Credit and certain Paid for Products
   via your mobile phone bill where applicable (“Pay by Mobile”).

   20.2 By selecting or using Pay by Mobile:

   (a) You authorise your mobile phone carrier to charge appropriate fees
   directly to your mobile phone bill; and

   (b) You represent that you are the person or entity responsible for the
   mobile phone account associated with the mobile number you provide when
   using Pay by Mobile, or are authorised by that person or entity to
   incur such charges.

   20.3 BINDING ARBITRATION AND CLASS ACTION WAIVER FOR UNITED STATES
   ACCOUNTS. If you select Pay by Mobile and your mobile phone account is
   registered with a mobile phone carrier in the USA or you reside in the
   USA, the following additional terms apply:

   (a) Paragraph 20.3 applies to any dispute arising between you and
   either Skype or any third party including mobile phone carriers and
   Skype’s corporate affiliates (collectively, “Disputed Party” or
   “Disputed Parties”) relating to your use of Pay by Mobile, EXCEPT IT
   DOES NOT INCLUDE A DISPUTE RELATING TO THE ENFORCEMENT OR VALIDITY OF
   YOUR, SKYPE’S, OR EITHER OF OUR LICENSORS’ INTELLECTUAL PROPERTY
   RIGHTS. Dispute, for purposes of paragraph 20.3, means any dispute,
   action, or other controversy whether in contract, warranty, tort,
   statute, regulation, ordinance, or any other legal or equitable basis.
   Dispute will be given the broadest possible meaning allowable under
   law.

   (b) In the event of a dispute, you must provide Skype or other Disputed
   Party with a Notice of Dispute, which is a written statement of the
   name, address and contact information of the party giving it, the facts
   giving rise to the dispute, and the relief requested. You must send any
   Notice of Dispute to Skype or its corporate affiliate at ATTN: Legal
   Department, Microsoft Corporation One Microsoft Way Redmond, WA
   98052-7329. and to any other Disputed Party at its principal place of
   business in the USA, marked ATTN: Legal Department. The Disputed Party
   will send any Notice of Dispute to your address if it has it, or
   otherwise to your e-mail address on file. You and the Disputed Party
   will attempt to resolve any dispute through informal negotiation within
   60 days from the date the Notice of Dispute is sent, after which you or
   the Disputed Party may commence arbitration.

   (c) You may also litigate any dispute in a small claims court in your
   county of residence, if the dispute meets all requirements to be heard
   in the small claims court. You may litigate in a small claims court
   whether or not you negotiated informally first.

   (d) Binding Arbitration. If you and a Disputed Party do not resolve any
   dispute by informal negotiation or in small claims court, any other
   effort to resolve the dispute will be conducted exclusively by binding
   arbitration governed by the United States Federal Arbitration Act
   (“FAA”). You are giving up the right to litigate (or participate in as
   a party or class member) all disputes in court before a judge or jury.
   Instead, all disputes will be resolved before a neutral arbitrator,
   whose decision will be final except for a limited right of appeal under
   the FAA. Any court with jurisdiction over the parties may enforce the
   arbitrator’s award.

   (e) Class Action Waiver. Any proceedings to resolve or litigate any
   dispute in any forum will be conducted solely on an individual basis.
   Neither you nor a Disputed Party will seek to have any dispute heard as
   a class action, private attorney general action, or in any other
   proceeding in which either party acts or proposes to act in a
   representative capacity. No arbitration or proceeding will be combined
   with another without the prior written consent of all parties to all
   affected arbitrations or proceedings.

   (f) Any arbitration will be conducted by the American Arbitration
   Association (the “AAA”) under its Commercial Arbitration Rules. If you
   are an individual and use the Software or Products for personal or
   household use, or if the value of the dispute is $75,000 USD or less
   whether or not you are an individual or how you use them, its
   Supplementary Procedures for Consumer-Related Disputes will also apply.
   For more information, see adr.org or call +1-800-778-7879. In a dispute
   involving $75,000 USD or less, Skype will promptly reimburse your
   filing fees and pay the AAA’s and arbitrator’s fees. You and Skype
   agree to the terms governing procedures, fees and incentives at
   go.microsoft.com/fwlink/?linkid=275219.  To commence arbitration,
   submit the form available at go.microsoft.com/fwlink/?linkid=275627 to
   the AAA. You agree to commence arbitration only in your county of
   residence, in Santa Clara County, California, or another Disputed
   Party’s principal place of business in the USA. Skype and other
   Disputed Parties agree to commence arbitration only in your county of
   residence.

   (g) To the extent permitted by law, any claim or dispute relating to
   your use of Pay by Mobile must be filed within one year in small claims
   court (paragraph 20.3(c)) or in arbitration (paragraph 20.3(d)). The
   one-year period begins when the claim or dispute first could be filed.
   If such a claim or dispute is not filed within one year, it is
   permanently barred.

   (h) Rejecting Future Arbitration Changes. You may reject any change
   Skype makes to paragraph 20.3 (other than address changes) by sending
   us notice within 30 days of the change by U.S. Mail to the address in
   paragraph 20.3(b). If you do, the most recent version of paragraph 20.3
   before the change you rejected will apply.

   (i) If the class action waiver in paragraph 20.3(e) is found to be
   illegal, invalid or unenforceable as to all or some parts of a dispute,
   then paragraph 20.3 will not apply to those parts. Instead, those parts
   will be severed and proceed in a court of law, with the remaining parts
   proceeding in arbitration. If any other provision of paragraph 20.3 is
   found to be illegal, invalid or unenforceable, that provision will be
   severed with the remainder of paragraph 20.3 remaining in full force
   and effect.

   YOU EXPRESSLY ACKNOWLEDGE THAT YOU HAVE READ THESE TERMS AND UNDERSTAND
   THE RIGHTS, OBLIGATIONS, TERMS AND CONDITIONS SET FORTH HEREIN. BY
   CLICKING ON THE ACCEPT BUTTON AND/OR CONTINUING TO INSTALL THE SOFTWARE
   OR USE THE SOFTWARE, PRODUCTS AND/OR SKYPE WEBSITES, YOU EXPRESSLY
   CONSENT TO BE BOUND BY ITS TERMS AND CONDITIONS AND GRANT TO SKYPE THE
   RIGHTS SET FORTH HEREIN.

© Skype – Last updated: April 2013
