---
layout: post
title: The Apache Software Foundation Announces Apache® Syncope™ 2.0
date: '2016-09-13T09:00:24+00:00'
categories: foundation
---
<div><b><i>Open Source, enterprise-grade solution brings Identity Management (IdM) to mission-critical applications, domains, databases, and objects across the Internet of Things (IoT)</i></b></div> 
  <div><b><br /></b></div> 
  <div><b>Forest Hill, MD —13 September 2016—</b> The Apache Software Foundation (ASF), the all-volunteer developers, stewards, and incubators of more than 350 Open Source projects and initiatives, announced today the availability of Apache® Syncope™ 2.0, the digital identity and access management system.</div> 
  <div><br /></div> 
  <div>Implemented in Java EE technology, Apache Syncope is a powerful and flexible system designed to keep enterprise identity data consistent and synchronized across repositories, data formats, and models.</div> 
  <div><br /></div> 
  <div>&quot;Syncope 2.0.0 is a major milestone for the community,&quot; said Francesco Chicchiriccò, Vice President of Apache Syncope, and one of the original creators of the project. &quot;The numbers of this release look great --new features, new components and tools, new contributors, more enterprise appeal, and even more extensibility.&quot;</div> 
  <div><br /></div> 
  <div>Syncope was originally created at Tirasa and entered the Apache Incubator in February 2012. The project has had 30 releases since becoming a Top-Level Project (TLP) in November 2012.</div> 
  <div><br /></div> 
  <div><b>Under The Hood</b></div> 
  <div>Apache Syncope 2.0 features include:</div> 
  <div> 
    <ul> 
      <li>Domains - built to facilitate multi-tenancy, with physical separation of all data of different domains (e.g. tenant) into different database instances;<br /><br /></li> 
      <li>Any Objects - in addition to managing users and groups, Syncope is now also able to define and manage object types such as workstations, printers, folders, sensors, services and more. This positions Apache Syncope at the forefront of bringing identity management to the world of IoT (Internet of Things);<br /><br /></li> 
      <li>New Admin and End User UI - completely revisited Web administration console with new look, features, and self-service Web application allows users to edit details only pertaining to him/herself; and<br /><br /></li> 
      <li>Documentation - brand new Getting Started and Reference guides enable users to become productive quickly and efficiently.</li> 
    </ul> 
  </div> 
  <div><br /></div> 
  <div>&quot;We are particularly proud of our new documentation, which is quite possibly the most widely claimed missing feature of many Open Source projects,&quot; added Chicchiriccò. &quot;Apache Syncope documentation is here to eliminate this Achilles' heel. We're looking forward to welcoming new Syncope users.&quot;</div> 
  <div><br /></div> 
  <div>Apache Syncope is in use at ARAG, Azienda Ospedaliera di Padova, Bibliotheek.nl, iWelcome, Ospedali Riuniti di Ancona, PTC Vuforia, Stadtwerke München (SWM), SURFnet, University of Helsinki, University of Milan, and UShareSoft, among many others.</div> 
  <div><br /></div> 
  <div>&quot;We chose Apache Syncope as the Identity Management platform because of the simplicity and flexibility of its REST API and also for its support to import users from various sources,&quot; said Ben Sorek, Director Software Engineering at PTC. &quot;Syncope's extendibility was important in the implementation of the complex workflows required by Vuforia.&quot;</div> 
  <div><br /></div> 
  <div>&quot;Of all the Open Source systems available, we selected Apache Syncope as it met our requirements in the POC evaluation,&quot; said Päivi Pääkkö, Team Leader and IT Specialist at University of Helsinki. &quot;As the home university of the developer of the Linux system, we have no doubts concerning the use of Open Source solutions.&quot;</div> 
  <div><br /></div> 
  <div>&quot;We rely on Apache Syncope as the fulcrum of our Identity infrastructure,&quot; said Andrea Badaloni, IT Director at Ospedali Riuniti di Ancona. &quot;In the public healthcare sector we need to consider several factors when selecting products, and Apache Syncope has proven to be the winning choice.&quot;</div> 
  <div><br /></div> 
  <div>&quot;Talend has been deploying Apache Syncope for several years as an Identity Management solution, both on-premise and in the Cloud,&quot; said Thomas Steinborn, Director Product Management Cloud and Realtime, Talend. &quot;Members of our team actively contributed to the 2.0.0 release and are looking forward to leveraging its latest advancements in Talend's Integration solutions.&quot;</div> 
  <div><br /></div> 
  <div><b>Availability and Oversight</b></div> 
  <div>Apache Syncope software is released under the Apache License v2.0 and is overseen by a self-selected team of active contributors to the project. A Project Management Committee (PMC) guides the Project's day-to-day operations, including community development and product releases. For downloads, documentation, and more information on Apache Syncope, visit <a href="http://syncope.apache.org/">http://syncope.apache.org/</a> and <a href="https://twitter.com/syncopeidm">https://twitter.com/syncopeidm</a></div> 
  <div><br /></div> 
  <div><b>Get Involved!</b></div> 
  <div>Apache Syncope welcomes contribution and community participation through mailing lists as well as attending face-to-face MeetUps, developer trainings, and user events. Those wishing to get involved in the project can find out more at <a href="http://syncope.apache.org/contributing.html">http://syncope.apache.org/contributing.html</a></div> 
  <div><br /></div> 
  <div><b>About The Apache Software Foundation (ASF)</b></div> 
  <div>Established in 1999, the all-volunteer Foundation oversees more than 350 leading Open Source projects, including Apache HTTP Server --the world's most popular Web server software. Through the ASF's meritocratic process known as &quot;The Apache Way,&quot; more than 550 individual Members and 5,300 Committers successfully collaborate to develop freely available enterprise-grade software, benefiting millions of users worldwide: thousands of software solutions are distributed under the Apache License; and the community actively participates in ASF mailing lists, mentoring initiatives, and ApacheCon, the Foundation's official user conference, trainings, and expo. The ASF is a US 501(c)(3) charitable organization, funded by individual donations and corporate sponsors including Alibaba Cloud Computing, ARM, Bloomberg, Budget Direct, Capital One, Cerner, Cloudera, Comcast, Confluent, Facebook, Google, Hortonworks, HP, Huawei, IBM, InMotion Hosting, iSigma, LeaseWeb, Microsoft, OPDi, PhoenixNAP, Pivotal, Private Internet Access, Produban, Red Hat, Serenata Flowers, WANdisco, and Yahoo. For more information, visit <a href="http://www.apache.org/">http://www.apache.org/</a> and <a href="https://twitter.com/TheASF">https://twitter.com/TheASF</a></div> 
  <div><br /></div> 
  <div>© The Apache Software Foundation. &quot;Apache&quot;, &quot;Syncope&quot;, &quot;Apache Syncope&quot;, and &quot;ApacheCon&quot; are registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries. All other brands and trademarks are the property of their respective owners.</div> 
  <div><br /></div> 
  <div># # #</div>
