void MapsPrivate::loadDiffs( const QString& basePath, unsigned int id )
{
    // Try to read the index
    QDir baseFolder( basePath );
    QStringList files = baseFolder.entryList();
    QString mapDiffListName = QString( "mapdifl%1.mul" ).arg( id );
    QString mapDiffFileName = QString( "mapdif%1.mul" ).arg( id );
    QString statDiffFileName = QString( "stadif%1.mul" ).arg( id );
    QString statDiffListName = QString( "stadifl%1.mul" ).arg( id );
    QString statDiffIndexName = QString( "stadifi%1.mul" ).arg( id );
    for ( QStringList::const_iterator it = files.begin(); it != files.end(); ++it )
    {
        if ( ( *it ).lower() == mapDiffListName )
            mapDiffListName = *it;
        else if ( ( *it ).lower() == mapDiffFileName )
            mapDiffFileName = *it;
        else if ( ( *it ).lower() == statDiffFileName )
            statDiffFileName = *it;
        else if ( ( *it ).lower() == statDiffListName )
            statDiffListName = *it;
        else if ( ( *it ).lower() == statDiffIndexName )
            statDiffIndexName = *it;
    }

    QFile mapdiflist( basePath + mapDiffListName );
    mapdifdata.setName( basePath + mapDiffFileName );

    // Try to read a list of ids
    if ( mapdifdata.open( IO_ReadOnly ) && mapdiflist.open( IO_ReadOnly ) )
    {
        QDataStream listinput( &mapdiflist );
        listinput.setByteOrder( QDataStream::LittleEndian );
        unsigned int offset = 0;
        while ( !listinput.atEnd() )
        {
            unsigned int id;
            listinput >> id;
            mappatches.insert( id, offset );
            offset += sizeof( mapblock );
        }
        mapdiflist.close();
    }
bool mitk::DiffusionCollectionWriter::ExportCollectionToFolder(DataCollection *dataCollection, std::string xmlFile, std::vector<std::string> filter)
{
  // Quick and Dirty: Assumes three level DataCollection
  QDir fileName = QFileInfo(xmlFile.c_str()).absoluteDir();
  std::string outputFolder = fileName.path().toStdString() + QDir::separator().toLatin1();
  QDir baseFolder(outputFolder.c_str());
  baseFolder.mkpath(outputFolder.c_str());

  std::ofstream xmlFileStream;
  xmlFileStream.open (xmlFile.c_str());
  xmlFileStream << "<!-- MITK - DataCollection - File Version 1.0 --> \n";
  xmlFileStream << "<" << COLLECTION << " " << NAME << "=\"" << dataCollection->GetName() << "\" >\n";
  unsigned int subColId = 0;

  unsigned int dataId = 0;

  QDir dir(QString::fromStdString(outputFolder));
  for (size_t i = 0 ; i < dataCollection->Size(); ++i)
  {
    // Write Subcollection tag
    xmlFileStream << "  <" << SUBCOLLECTION <<  " " << NAME << "=\"" << dataCollection->IndexToName(i) << "\" " <<  FILEPATH << "=\"" << dataCollection->GetDataFilePath(i) << "\" id=\"Col" << subColId << "\" >\n";
    // Create Sub-Folder
    dir.mkpath(QString::fromStdString(dataCollection->IndexToName(i)));

    // Herein create data folders
    DataCollection* subCollections = dynamic_cast<DataCollection*> (dataCollection->GetData(i).GetPointer());
    if (subCollections == nullptr)
    {
      MITK_ERROR<< "mitk::DiffusionCollectionWriter::SaveCollectionToFolder: Container is illformed. Aborting";
      return false;
    }

    for (size_t d = 0; d < subCollections->Size(); d++ )
    {
      // Create Sub Paths
      QString subPath = QString::fromStdString(dataCollection->IndexToName(i))+"/"+QString::fromStdString(subCollections->IndexToName(d));
      dir.mkpath(subPath);
      xmlFileStream << "  <" << DATA <<  " " << NAME << "=\"" << subCollections->IndexToName(d) << "\" " <<  FILEPATH << "=\"" << subCollections->GetDataFilePath(d) << "\" id=\"Data" << dataId << "\" >\n";

      DataCollection* itemCollections = dynamic_cast<DataCollection*> (subCollections->GetData(d).GetPointer());
      if (itemCollections == nullptr)
      {
        MITK_ERROR<< "mitk::DiffusionCollectionWriter::SaveCollectionToFolder: Container is illformed. Aborting";
        return false;
      }

      for (size_t s = 0; s < itemCollections->Size(); s++)
      {
        if (filter.size() > 0)
        {
          bool isSelected = false;
          for (size_t f = 0; f < filter.size(); f++)
          {
            if (filter.at(f) == itemCollections->IndexToName(s) )
            {
              isSelected = true;
              break;
            }
          }
          if (isSelected == false)
            continue;
        }
        Image* image = dynamic_cast<Image*> (itemCollections->GetData(s).GetPointer());
        QString fileName = dir.path() + dir.separator() + subPath + dir.separator() +  QString::fromStdString(dataCollection->IndexToName(i)) + "_" + QString::fromStdString(subCollections->IndexToName(d)) + "_" + QString::fromStdString(itemCollections->IndexToName(s));
        try
        {
          if (itemCollections->IndexToName(s) == "DTI" || itemCollections->IndexToName(s) == "DTIFWE")
          {
            fileName += ".dti";
            IOUtil::Save(image,fileName.toStdString());
          }
          else if (itemCollections->IndexToName(s) == "FIB")
          {
            fileName += ".fib";
            FiberBundle* fib = dynamic_cast<FiberBundle*> (itemCollections->GetData(s).GetPointer());
            IOUtil::Save(fib, fileName.toStdString());
          }
          else if (itemCollections->IndexToName(s) == "DWI")
          {
            fileName += ".dwi";
            IOUtil::Save(image,fileName.toStdString());
          }
          else
          {
            fileName += ".nrrd";
            Image::Pointer image = itemCollections->GetMitkImage(s).GetPointer();
            IOUtil::Save(image,fileName.toStdString());
          }
        }
        catch( const std::exception& e)
        {
          MITK_ERROR << "Caught exception: " << e.what();
        }

        std::string relativeFilename = baseFolder.relativeFilePath(fileName).toStdString();
        xmlFileStream << "    <" << ITEM <<  " " << NAME << "=\"" <<itemCollections->IndexToName(s) << "\" " <<  FILEPATH << "=\""  << "\" " << LINK << "=\"" << relativeFilename << "\" />\n";
      }
      xmlFileStream << "  </" << DATA << ">\n";
      dataId++;
    }

    xmlFileStream << "  </" << SUBCOLLECTION << ">\n";
    subColId++;
  }
  xmlFileStream << "</" << COLLECTION << ">\n";
  xmlFileStream.flush();
  xmlFileStream.close();
  return true;
}