
Sixth session Geneva , 17-21 June 2002 The sixth session of the Intergovernmental Negotiating Committee for an International Legally Binding Instrument for Persistent Organic Pollutants was held at the Geneva International Conference Centre , Geneva , from 17 to 21 June 2002. The session was opened by Mr. John Buccini ( Canada ) , Chair of the Committee , at 10.30 a. m. on Monday , 17 June 2002. An opening statement was made by Mr. Philippe Roch , State Secretary , Director of the Swiss Agency for the Environment , Forests and Landscape . In his statement Mr. Roch said that persistent organic pollutants ( POPs ) present a problem of global dimension which called for concerted efforts on a global scale . In that regard , several remaining problems needed to be discussed and resolved , such as the question of technical assistance for capacity-building . An efficient way had to be found to evaluate the specific needs of different regions and subregions and the transfer of technology required by developing country Parties and Parties with economies in transition . In order to respond to the needs of the Stockholm Convention on Persistent Organic Pollutants , and to those of the Convention to Combat Desertification , the Global Environment Facility ( GEF ) , which had been designated as the financial mechanism , must have the necessary funds at its disposal , without reducing its means of intervention in other areas , namely climate and biodiversity . He said that to enable both Conventions to enter into force it was necessary that contributions to GEF be increased . KMON On the issue of enhancing the synergies and linkages between multilateral environmental agreements , as a means of strengthening international environmental governance , Mr. Roch welcomed the fact that the Stockholm Convention called for the Conference of the Parties to collaborate closely with the competent entities of the Basel Convention to determine methods to ensure environmentally appropriate disposal . He singled out the excellent collaboration in Geneva between the Basel , Stockholm and Rotterdam Conventions , which strengthens the coordination of the activities taking place within the framework of those agreements . Turning to the issue of the permanent secretariat for the Stockholm Convention , Mr. Roch said that the existing infrastructure in Switzerland and the potential synergies with other international organizations directly related to chemicals would offer the future secretariat ideal working conditions that would be strengthened by the presence of 140 permanent missions and numerous environmental non-governmental organizations located in Geneva . He said that Switzerland would be honoured to welcome the seventh session of the Intergovernmental Negotiating Committee in Geneva . Mr. Jim Willis , Executive Secretary of the Stockholm Convention presented the opening statement on behalf of Mr. Klaus Töpfer , Executive Director of the United Nations Environment Programme ( UNEP ) . Mr. Willis conveyed the apologies of Mr. Töpfer , who was unable to attend the current meeting . He presented Mr. Töpfer 's address to the Intergovernmental Negotiating Committee , noting in particular the contribution of the Stockholm Convention to sustainable development ; the major issues to be addressed by the Intergovernmental Negotiating Committee at its sixth session ; and the budget shortfall of the secretariat . Mr. Töpfer also congratulated the 151 countries that had signed the Convention as well the 11 Governments that had thus far ratified or acceded to it . Attendance The session was attended by representatives of the following Parties : Algeria , Antigua and Barbuda , Argentina , Armenia , Australia , Austria , Azerbaijan , Bahamas , Bahrain , Bangladesh , Belarus , Belgium , Benin , Bhutan , Bolivia , Brazil , Bulgaria , Burkina Faso , Burundi , Cambodia , Canada , Central African Republic , Chad , Chile , China , Colombia , Comoros , Costa Rica , Côte d'Ivoire , Croatia , Cuba , Czech Republic , Denmark , Djibouti , Dominican Republic , Ecuador , Egypt , Ethiopia , Fiji , Finland , France , Gabon , Gambia , Georgia , Germany , Ghana , Greece , Guatemala , Guinea , Hungary , Iceland , India , Indonesia , Iran ( Islamic Republic of ) , Iraq , Italy , Jamaica , Japan , Jordan , Kazakhstan , Kenya , Kiribati , Kuwait , Kyrgyzstan , Latvia , Lesotho , Libyan Arab Jamahiriya , Liechtenstein , Lithuania , Madagascar , Malawi , Malaysia , Mauritania , Mauritius , Mexico , Monaco , Mongolia , Morocco , Mozambique , Myanmar , Netherlands , New Zealand , Nicaragua , Nigeria , Niue , Norway , Oman , Panama , Paraguay , Peru , Philippines , Poland , Portugal , Qatar , Republic of Korea , Republic of Moldova , Romania , Russian Federation , Rwanda , St. Lucia , Samoa , Saudi Arabia , Senegal , Seychelles , Singapore , Slovakia , Slovenia , South Africa , Spain , Sudan , Suriname , Sweden , Switzerland , Syrian Arab Republic , Tajikistan , Thailand , The former Yugoslav Republic of Macedonia , Togo , Trinidad and Tobago , Tunisia , Uganda , Ukraine , United Kingdom of Great Britain and Northern Ireland , United Republic of Tanzania , United States of America , Uruguay , Uzbekistan , Venezuela , Yemen , Yugoslavia , Zambia , Zimbabwe . The following United Nations bodies , specialized agencies and convention secretariats were represented : Food and Agriculture Organization of the United Nations ( FAO ) , United Nations Development Programme ( UNDP ) , United Nations Economic Commission for Europe ( UNECE ) , United Nations Industrial Development Organization ( UNIDO ) , United Nations Institute for Training and Research ( UNITAR ) , World Bank , World Health Organization ( WHO ) , World Meteorological Organization , World Trade Organization ( WTO ) , Global Environment Facility ( GEF ) , secretariat of the Basel Convention on the Control of Transboundary Movements of Hazardous Wastes and their Disposal , secretariat of the Convention on Biological Diversity , secretariat of the United Nations Convention to Combat Desertification in those Countries Experiencing Serious Drought and/or Desertification , particularly in Africa and the interim secretariat for the Rotterdam Convention on the Prior Informed Consent Procedure for Certain Hazardous Chemicals and Pesticides in International Trade The following intergovernmental organizations and other bodies were represented : European Commission ( EC ) , Intergovernmental Forum on Chemical Safety ( IFCS ) , League of Arab States ( LAS ) , South Pacific Regional Environment Programme ( SPREP ) , ABB Environmental Services , Aptechnologies , Dongbu Honnong Chemical ( DHC ) , Federation of Thai Industries ( FTI ) , Royal Entomological Society , Trent University The following non-governmental organizations and other bodies were represented : AC-DASSUR Africa Fighting Malaria ( AFM ) , American Chemistry Council ( ACC ) , Armenian Women for Health and a Healthy Environment ( AWHHE ) , ARNIKA , Berne Declaration , Center for International Environmental Law ( CIEL ) , Centro de Derecho Ambiental del Sur , AC-DASSUR , Climate and Development Initiative , s ( CDI ) , Comisiones Obreras , Comité Sahelien des Pesticides ( CSP ) , Eco-Accord Center for Environment and Sustainable Development , Environment Quality Protection Foundations ( EQPF ) , European Chemical Industry Council ( CEFIC ) , Federation of Thai Industries ( FTI ) , Greenpeace International , Indigenous Environmental Network ( IEN ) , International Council of Chemical Associations ( ICCA ) , International Council of Environmental Law ( ICEL ) , International POPs Elimination Network ( IPEN ) , Japan Chemical Industry Association ( JCIA ) , Japan Offspring Fund ( JOF ) , Mouvement pour les Droits et le Respect des Générations Futures , National Toxics Network ( NTN ) , Oekometric GmbH ( the Bayreuth Institute of Environmental Research ) , People 's Task Force for Bases Clean-up , Pesticide Action Network ( PAN ) , Physicians for Social Responsibility ( PSR ) , Thanal Conservation Action and Information Network , World Chlorine Council ( WCC ) , World Wide Fund for Nature ( WWF ) . Officers Introducing the item , the Chair informed the meeting of the death of Mr. Mir Jafar Ghaemieh who had served as Vice-Chair for the Asia and Pacific region . The Chair made particular reference to the constructive contribution made by Mr. Ghaemieh throughout the negotiations . The Chair also drew the Committee 's attention to the note prepared by the secretariat ( UNEP/POPS/INC.6/2 ) on the subject of Bureau issues , which contained a proposal submitted by the Group of 77 and China to the effect that rule 8 of the rules of procedure of the Intergovernmental Negotiating Committee should be revised with a view to increasing the membership of the Bureau to 10 members . Further to clarifications provided by the sponsors of the proposal , the Committee decided to amend rule 8 of the rules of procedure to state that : “ 1. The Committee shall elect from among the representatives of the State Parties a Bureau composed of one Chair and nine Vice-Chairs , one of whom shall act as Rapporteur . “ 2. In electing the officers , the Committee shall have due regard to the principle of equitable geographical representation . Each of the five regional groups shall be represented by two members . ” Decision INC-6/1 on the amendment of rule 8 of the rules of procedure for the meeting of the Intergovernmental Negotiating Committee is contained in annex I to the present report . A number of representatives stressed that they agreed to the expansion of the Bureau , on the understanding that it did not constitute a precedent either for the organizational structure of the Conference of the Parties or for other multilateral environmental agreements . It was also stressed that the increased number of Bureau members would not cause a budget increase . In view of the above-mentioned decision , and taking into consideration the absence at the current session of previously elected Bureau members for the Africa region and the Latin America and Caribbean region , as well as the recent demise of the Bureau member from the Asia and Pacific region , the elected members of the Bureau of the Intergovernmental Negotiating Committee at its sixth session were as follows : Chair : Mr. John Buccini ( Canada ) Vice-Chairs : Mr. Mahi Boumediene ( Algeria ) Mr. Manfred Schneider ( Austria ) Mr. Yue Ruisheng ( China ) Ms. Darka Hamel ( Croatia ) Ms. Fatoumata Jallow NDoye Ndoye ( Gambia ) Mr. Seyed Reza Tabatabaei ( Iran , Islamic Republic of ) Mr. Tomás Guardia ( Panama ) Ms. Natalia Karpova ( Russian Federation ) Mr. Gonzalo Casas ( Uruguay ) In accordance with rule 8 of the Committee 's rules of procedure , Ms. Hamel , Vice-Chair , also agreed to continue as rapporteur . C. Adoption of the agenda The Committee adopted the following agenda on the basis of the provisional agenda , which had been circulated as document UNEP/POPS/INC.6/1 : Opening of the session . Organizational matters : ( a ) Adoption of the agenda ; ( b ) Organization of work ; ( c ) Report by the secretariat on intersessional work requested by the Committee or the Conference of Plenipotentiaries on the Stockholm Convention on Persistent Organic Pollutants ; ( d ) Bureau issues . Review of ongoing international activities relating to the work of the Committee . Activities of the secretariat and review of the situation as regards extrabudgetary funds . Preparation for the Conference of the Parties . Other matters . Adoption of the report . Closure of the session . Organization of work At its opening session , the Committee decided to work in plenary and to establish contact groups on an as-needed basis . The Committee took note of the election of Ms. Anne Daniels ( Canada ) as the new chair of the legal drafting group . E. E. Report by the secretariat on intersessional work requested by the Committee or the Conference of Plenipotentiaries on the Stockholm Convention on Persistent Organic Pollutants The secretariat noted that , while no specific intersessional work had been requested by the Committee at its fifth session , considerable work had been undertaken intersessionally as a result of the resolutions ensuing from the Conference of Plenipotentiaries on the Stockholm Convention . In addition to the reports of both the fifth session of the Committee ( UNEP/POPS/INC.5/7 ) and the Conference of Plenipotentiaries ( UNEP/POPS/CONF/4 ) , the secretariat had produced a booklet containing the text of the Stockholm Convention and the documentation for the current session of the Committee . A full list of the documents available to the Committee is provided in annex IX to the present report . At its opening session , the Intergovernmental Negotiating Committee took up consideration of the above item . Introducing the item , the secretariat drew the Committee 's attention to the relevant documentation available ( see annex IX ) ) Mr. Willis , speaking as Executive Secretary , said that the fourth edition of the master list of actions on the reduction and/or elimination of the release of POPs ( UNEP/POPS/INC.6/INF/10 ) , prepared by the secretariat , contained input from over 100 countries . Because of the volume of material , and for reasons of economy , the document was being made available in CD-ROM format , which would be the practice for all such lengthy information documents in the future , perhaps with additional interactive features . Hard-copy versions would also be available to those who required them . Mr. Willis , speaking on behalf of UNEP Chemicals , briefly summarized some of the capacity-building activities of UNEP in the intersessional period , as set out in document UNEP/POPS/INC.6/INF/17 . He expressed appreciation to the Governments of Canada , Denmark , Germany , Sweden , Switzerland and the United States , as well as to GEF , World Bank and the Inuit Circumpolar Conference for their assistance in the financing of POPs-related workshops , and also thanked the countries that had hosted those workshops for their in-kind contributions and efforts . The representative of the United Nations Institute for Training and Research ( UNITAR ) described the relevant activities of UNITAR , as set out in document UNEP/POPS/INC.6/INF/27 , and highlighted its programmes to assist in : the development of national chemicals management profiles ; skills-building training for sound management of chemicals ; risk management decision-making for priority chemicals ; and developing integrated national programmes for the sound management of chemicals . The representative of the United Nations Industrial Development Organization ( UNIDO ) said that the UNIDO General Conference and the Industrial Development Board recognized the importance of priority action on POPs . UNIDO had received a number of requests for assistance from countries , which had been and were being submitted to GEF and other donors for funding , inter alia , for capacity-building and technical assistance on best available techniques ( BAT ) for POPs reductions and on substitutes for POPs . Ms. Sachiko Kuwabara-Yamamoto , Executive Secretary of the Basel Convention on the Control of Transboundary Movements of Hazardous Wastes and their Disposal , reporting on the status of preparation of the technical guidelines for the environmentally sound management of POPs as wastes , said that a first draft was expected in November 2002 , and work was continuing on the revised technical guidelines for PCBs , PCTs and PBBs . Concerning the regional centres for training and technology transfer of the Basel Convention on the Control of Transboundary Movements of Hazardous Wastes and their Disposal , the Working Group for Implementation had at its recent first session prepared , for the upcoming sixth meeting of the Conference of the Parties , a draft decision on strengthening their legal status . Welcoming the workshops organized by the Stockholm Convention at the Basel regional centres and the proposal to develop pilot regional and subregional centres to provide technical assistance under article 12 of the Stockholm Convention , she stressed that such involvement in the centres could strengthen their viability , avoid duplication and enhance the collaboration between the two Conventions . The representative of the United Nations Economic Commission for Europe ( UNECE ) , speaking on behalf of the Convention on Long-range Transboundary Air Pollution , reported on activities under its protocol on POPs , which was expected to enter into force by the end of 2002. Monitoring and evaluation activities under that protocol involved , inter alia , emissions inventories , methodologies and modelling work , and evaluation of the effects of POPs and their health risks . An expert group on POPs was focusing on issues of the scheduled reassessment of certain POPs , and attention was being given to potential candidate POPs . He underlined the continued interest of UNECE in furthering collaboration with UNEP . The representative of the World Health Organization ( WHO ) drew attention to document UNEP/POPS/INC.6/INF/26 which highlighted WHO activities to reduce or eliminate POPs . He drew special attention to the overall WHO policy regarding POPs , progress in POPs-related activities and programmes , and progress in implementing the WHO action plan for the reduction of reliance on DDT in disease vector control . The representative of the Food and Agriculture Organization of the United Nations ( FAO ) drew attention to document UNEP/POPS/INC.6/INF/24 which highlighted relevant FAO programmes and publications , including the “ International Code of Conduct on the Distribution and Use of Pesticides ; ” guidelines on Integrated Pest Management ( IPM ) and Integrated Vector Management ( IVM ) , produced with the Global IPM Facility , UNEP and WHO ; the “ Prevention and Disposal of Obsolete Pesticides ” programme ; and the new cooperative Africa Stockpile Programme . The representative of the secretariat of the Rotterdam Convention on the Prior Informed Consent Procedure on Certain Hazardous Chemicals and Pesticides in International Trade informed the Committee on the successful operation of the Interim Chemical Review Committee . He also reported that in response to country requests , a series of workshops had been held or were planned for 2002 to provide practical hands-on training in the operational elements of the Rotterdam Convention . Representatives of the Intergovernmental Forum on Chemical Safety ( IFCS ) drew attention to document UNEP/POPS/INC.6/INF/21 and outlined the Information Exchange Network on Capacity Building for the Sound Management of Chemicals ( INFOCAP ) . They explained that INFOCAP was a web-based information exchange network designed to enhance effective cooperation among countries and organizations providing and/or receiving assistance related to the sound management of chemicals , including information on : national profiles , priorities , plans of action and related needs ; sources of potential support ; past , ongoing and planned projects ; a reference library of existing training and guidance documents ; and contact points . A representative of the World Bank reported that under a trust fund established by the Government of Canada , the World Bank had undertaken work to help countries develop their capacity to implement the Convention effectively . The World Bank had also developed a number of related materials , including document UNEP/POPS/INC.6/INF/8 , prepared with UNEP , on the development of national implementation plans . With regard to international activity by other intergovernmental organizations , a representative of the secretariat drew attention to document UNEP/POPS/INC.6/INF/20 on the International Convention on the Control of Harmful Anti-fouling Systems on Ships of the International Maritime Organization and document UNEP/POPS/INC.6/INF/22 on the International Whaling Commission 's resolution on the Stockholm Convention on Persistent Organic Pollutants . Many representatives reported on activities within their countries relating to the work of the Committee and provisional implementation of the Stockholm Convention , including : signing and ratification of the Convention ; development of national implementation plans ; capacity-building ; stakeholder participation ; regulatory developments ; programmes to reduce or eliminate the use or release of specific POPs , eliminate obsolete stockpiles of pesticides , control and disposal of POPs contaminated wastes , and address contaminated sites ; regional and subregional workshops ; monitoring and assessment of POPs , their long-range transport and their impacts on the environment and human health ; identification and assessment of potential candidate POPs ; ensuring synergistic cooperation among the Stockholm , Rotterdam and Basel Convention secretariats ; the effective utilization of financial and technical assistance ; programmes developed in collaboration with bilateral donors , UNEP Chemicals , the Stockholm , Rotterdam and Basel Convention secretariats , Basel Convention regional technical centres , GEF , the World Bank and other institutions ; and financial contributions toward the work of the Committee and national and international implementation of the Convention . A summary of statements made by representatives of non-governmental organizations is contained in annex VIII to the present report . Introducing the item , the Executive Secretary drew attention to the documentation prepared on the subject ( see annex IX ) ) and elaborated on the main points raised therein . He expressed gratitude to those donors that had made pledges to the POPs Club . He stressed that , with the 29.3 per cent reduction in the allocation to UNEP Chemicals from the Environment Fund , the in-kind support provided by UNEP in the past now had to be costed and financed . The secretariat of the Stockholm Convention thus depends entirely upon the level of funding of the voluntary POPs Club , which currently displayed a downward trend compared with previous years . It was noted that UNEP expected that the outstanding balance of the loan from the Environment Fund reserve of US$ 818,241 would be repaid . The secretariat was not eligible to receive direct funding from GEF , and existing trust funds were usually earmarked for specific programme activities . Many representatives , expressing concern at the decline in the level of contributions to the POPs Club , called upon Governments and non-governmental organizations , including industry , to make a sustained effort and commitment towards supporting the POPs Club . A number of representatives , pointing to the 2003-2004 priorities listed in the proposed budget , called on the secretariat to prepare a more detailed breakdown of the activities coming under each priority area , including the proposed budgetary allocation for each activity . In addition , in light of the possibility of a budget shortfall , the secretariat was requested to prepare a paper to provide details of the impact on activities in the event that receipts are less than the 2002 budget . One representative saw merit in the budget proposed by the secretariat and supported its adoption . Another representative questioned where the funding would come from to underpin such a budget , if approved . The following representatives announced their Governments ' intention to make contributions to the POPs Club for 2002 : Australia , US$ 31,157 ; Finland , 20,000 Euros ; Japan , US$ 100,000 ; and Luxembourg , US$ 8,033 . The representative of the Inuit Circumpolar Conference also announced her organization 's donation of CAN $1,000 to the POPs Club , a sum which represented a large proportion of the Inuit communities ' funding for all POPs issues . Some representatives , noting the uncertain financial situation , considered that a draft budget only for 2003 should be approved , with purely notional proposals for 2004. In answer to a suggestion that Governments be called upon to offset secretariat staffing costs by means of staff secondments , the secretariat explained that , while such a practice was very welcome , seconded staff often came from one particular regional group , and that over reliance on secondments could affect the regional balance of the composition of the secretariat . In answer to a query , the secretariat clarified that the budgetary implications of the capacity assistance network , as set out in document UNEP/POPS/INC.6/19 , were not included in the budget proposed by the secretariat , and would need to be considered separately . The Committee agreed that , in the course of its consideration of the items on its agenda , the special financial implications of adoption or deletion of any of the proposed activities would be discussed . The outcome would then be reflected in a report of running costs to be prepared by the secretariat . The Executive Secretary introduced a conference room paper containing details of the proposed 2003-2004 budget and an overview of the potential impacts of funding shortfalls in 2002. He also reported on the additional impact of the decisions taken by the Committee at its current meeting , which were not yet reflected in the document . He noted that the cumulative impact of the decisions adopted at the current meeting was to increase the 2003 budget by US$ 300,000 . The Committee agreed to note the budget for the year 2003 , on the understanding that the budget for 2004 would be indicative only and would be further examined in detail by the Committee at its seventh session . The secretariat was requested to provide the Committee at its seventh session with a report on the actual expenditures on budget items , based on the figures set out in the current draft budget . The budget for 2003 and the indicative budget for 2004 are contained in annex VI to the present report . The Committee also agreed to establish a budget group at the seventh session of the Committee , which would also be able to examine the possible budgetary implications of the Committee 's decisions and report on them . The secretariat was requested to prepare , in advance of the seventh session of the Committee , an information paper compiling the reports used in other multilateral environmental agreements for dealing with their budgets . In light of the fact that a large proportion of the draft budget was a debt to the Environment Fund reserve , the Committee requested the Executive Secretary to request the Executive Director of UNEP to examine the possibility of retiring some or all of that debt . Noting that the draft budget also required a 13 per cent overhead charge to be paid to UNEP , the Committee called for an examination of the possibility of reducing those costs or of UNEP providing a Finance Officer under that allocation . Precedents for such a course of action existed under other multilateral agreements . One representative said that the future budget group should consider the high level of effectiveness of the secretariat in carrying out activities and its excellent budget management , and examine the advantages that could accrue to developing countries from interaction with the secretariat . The Committee took note of the detailed information on programme priorities and budget for 2003-2004 provided by the secretariat which may be found in annex VI to the present report . Measures to reduce or eliminate releases from intentional production and use and Register of specific exemptions ( Articles 3 and 4 , and Annex A and Annex B ) In its deliberations , the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) Introducing the item , the secretariat drew attention to possible action by the Committee set out in the note by the secretariat on work on DDT ( UNEP/POPS/INC.6/5 , paragraphs 4 and 5 ) . Several representatives pointed to the efforts underway in their countries to reduce reliance on DDT and apply alternatives . One representative offered to exchange information on the experiences and problems encountered in that endeavour . It was stressed that alternative means of vector control needed to be analysed to determine whether they were easily applicable in developing countries and whether they cost no more than the current use of DDT . One representative said that , despite tremendous work , her Government had not been able to identify an economically viable substitute for DDT . She wondered whether WHO could work in close collaboration with her country to develop an economically viable alternative and a format for registering DDT , to be submitted to the Conference of the Parties at its first meeting . In light of the large quantities of DDT produced by her country , the identification of an alternative would have great repercussions . Another representative said that a national debate was underway in her country to determine whether it should revoke the 1996 ban on the use of DDT and revert to its use for vector control , since alternatives had not had the desired effect . She sought advice from WHO before such a major decision could be taken . Another representative requested WHO to start a process of communication and discussion with the countries with a DDT use exemption , to inform them of developments and progress in the identification and application of alternatives . One representative , speaking on behalf of a regional economic integration organization and its member States and supported by another representative , welcomed the proposals for possible action set out in the secretariat 's note on DDT and encouraged increased cooperation between UNEP and WHO . He also suggested that the secretariat consider all documents and work undertaken by non-governmental organizations on the subject . He believed that research activities in the field should be increased , in order to promote and develop alternative vector control methods and strategies and achieve the elimination of DDT . He proposed that the secretariat consider the information to be included in the DDT Register established in annex B , part II , paragraph 1 and prepare a format of the DDT Register , to be presented for discussion to the Committee at its seventh session . He also asked the secretariat and WHO to start work to develop the format for reporting by the Parties referred to under paragraph 4 of annex B , part II . The information to be gathered in a Party 's report might include , inter alia , monitoring data on human exposure to DDT ; public health impacts of DDT reduction ; production , storage and usage of DDT ; efficacy and appropriateness of DDT in areas where it continued to be used ; and efficacy and appropriateness of alternatives to DDT . On the basis of the deliberations the Committee agreed that further consideration of the matter was necessary and requested the secretariat to prepare a report on a possible format for reporting by Parties that use DDT on amounts used , conditions of such use and its relevance in disease management strategies , as well as a report on guidance and information needed to assist the Conference of the Parties in evaluating the continued need for DDT for disease vector control and submit both reports to the Intergovernmental Negotiating Committee for further consideration at its seventh session . Decision INC-6/2 on DDT , is contained in annex I to the present report . Register of specific exemptions In its deliberations , the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) Introducing the item , the secretariat said that , in addition to the elements of the process as specified in the Convention , and listed in the note by the secretariat ( UNEP/POPS/INC.6/4 , paragraph 5 ) , there might be other possible elements . He also drew attention to the possible action by the Committee set out in the note by the secretariat ( UNEP/POPS/INC.6/4 , paragraphs 7 and 8 ) . One representative , speaking on behalf of a regional economic integration organization and its member States , underscored the need to eliminate the chemicals listed in annexes A and B of the Convention and hoped that , eventually , no exemptions would be required , except in extraordinary cases . While the rules and criteria for such exemptions should be as strict as possible , it was necessary to bear in mind the specific circumstances and needs of the developing countries and the countries with economies in transition . He suggested that the secretariat should prepare , for submission to the Committee at its seventh session , a set of guidelines and criteria for the granting of a temporary exemption to a Party and for the extension of exemptions . While one representative called for the establishment of a technical group to conduct the review process , another representative considered that the creation of a subsidiary body for the process was premature , since it was dependent on the number of requests for exemptions and renewals that were yet to be received . One representative observed that efforts to develop guidance should start with a request for input s from countries , which could be compiled by the secretariat and discussed at the seventh session of the Committee . Expressing the view that the Committee should not become involved in the policy aspects of the review process , since the need for and nature of any such criteria should be developed based on the experience and deliberations of the Conference of the Parties , he considered that the focus should be on the logistical and process aspects , such as those set out in the note by the secretariat , and including the timing of the submission of the exemption extension request to the secretariat . Annex F provided a good example of the kinds of information countries should include in their reports justifying an exemptionextension Another representative stressed the need for countries to provide information on the maximum quantities of the chemical substances that would be produced and used under the proposed exemption extension A number of representatives proposed amendments to the draft format of the Register of specific exemptions attached to document UNEP/POPS/INC.6/INF/6 . One considered that the footnotes thereto should not generate any extra legal obligations under the Stockholm Convention . Another representative , speaking on behalf of a regional economic integration organization and its member States , said that footnotes 4 and 8 should use the agreed terminology of the Stockholm Convention , and footnote 9 should be deleted . One representative said that the secretariat should develop a unified format for notifications pursuant to note ( ii ) of annexes A and B of the Convention . One representative , considering that the “ remarks ” column was useful for providing additional information on the scope of the exemption for countries , said that a footnote was needed to clarify the types of information to be put in that column . The Register should also contain specific information about the nature of the exemptions . The Committee decided to request the secretariat to further prepare a report on : a possible format for country reporting of requests for specific exemptions , a possible process that might be considered by the Conference of the Parties , as well as a possible format for a Register of specific exemptions to be submitted to the Intergovernmental Negotiating Committee for further consideration at its seventh session . Decision INC-6/3 , on the Register of specific exemptions ( Articles 3 and 4 and Annexes A and B ) , is contained in annex I to the present report . Measures to reduce or eliminate releases from unintentional production ( article 5 and Annex C ) In its deliberations , the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) Introducing the item , the representative of the secretariat drew attention to the note on guidance on best available techniques ( BAT ) and best environmental practices ( BEP ) ( UNEP/POPS/INC.6/7 ) and enumerated the points raised therein . He also drew attention to a conference room paper containing the report of a regional workshop on national action on measures to reduce or eliminate the releases of by-products from unintentional production , held in Bangkok from 13 to 15 March 2002 and organized by the Governments of Germany and Thailand , in cooperation with UNEP Chemicals . Stressing the highly technical nature of the issues involved in providing guidance on BAT and BEP for the first meeting of the Conference of the Parties , which called for specialized expertise , he said that the Committee might wish to consider establishing a subsidiary body to assist it in that effort . Because of the budgetary implications , the costs of the different options within the process chosen would also need to be carefully assessed . One representative , speaking on behalf of a regional economic integration organization and its member States , welcomed the outcome of the regional workshop held in Thailand and pointed to a conference room paper on BAT and BEP for reducing and/or eliminating emissions of by-product POPs , submitted by his organization and its member States . He considered that there was a need to initiate the establishment of a process for the development of BAT and BEP that might include the creation of a technical working group and the organization of a workshop . Measures to reduce or eliminate release from unintentional production of chemicals listed in annex C of the Stockholm Convention , including measures to promote BAT and BEP , must be included in national implementation plans . He expressed the hope that the secretariat would emphasize the promotion of effective information exchange , which could be facilitated by the experience gained through his organization 's directive on integrated pollution and prevention control . Several representatives , referring to the possibility of establishing a contact group to consider how to proceed on the issue , stressed the need for all participants to have the opportunity to play an active part in its deliberations , particularly the developing countries , since BAT and BEP were directly linked to the subject of emissions and thus affected their industries . Some representatives noted that it was essential to have BAT and BEP guidelines that would be useful to countries at all levels of development , so it was necessary to ensure that a balance of countries at all levels of development participate in the guidance development process . One representative , pointing to a conference room paper submitted by his Government on the development of guidelines on BAT and BEP , considered that work on the issue was very timely and needed to be initiated soon . It was very important to have a contact group convene to discuss the terms of reference of any subsidiary body to be established on BAT and BEP . The Committee decided to establish an open-ended contact group , co-chaired by Mr. Sergio Vives ( Chile ) and Mr. Robert Kellam ( United States ) , with a mandate to address issues of guidelines on BAT and guidance on BEP pursuant to article 5 of the Stockholm Convention , as set out in the note by the secretariat ( UNEP/POPS/INC.6/7 ) . The contact group was to propose a way forward with regard to acquiring the expertise needed and formulating the guidelines and guidance for adoption by the Conference of the Parties . Mr. Robert Kellam , The co-chairs of the contact group , speaking also on behalf of co-chair Sergio Vives , reported to plenary on the results of the deliberations of the group , which were before the Committee in a conference room paper . He They drew particular attention to the need for a decision at the first meeting of the Conference of the Parties on whether to continue work on the subject using the current methodology or whether to establish another group . Following discussion on the item , the Committee adopted the terms of reference for the Expert Group on BAT/BEP contained in annex VII to the present report . The Committee selected Mr. Sergio Vives ( Chile ) and Mr. Robert Kellem Kellam ( United States ) to serve as interim co-Chairs of the Expert Group for the purpose of facilitating the first meeting of the Group . The Committee noted that Algeria , Chile , Gabon , Iran ( Islamic Republic of ) , Kenya , Mongolia , Nigeria , Saudi Arabia and Zambia would serve as nine of the 15 members of the Group from developing countries . For the remaining six positions , Iran would inform the secretariat of the identities of two countries from the Asia and Pacific region and the Dominican Republic would inform the secretariat of the identities of four countries from the Latin American and Caribbean region . The Committee noted that Kazakhstan , Poland and Yugoslavia would serve as the three members from countries with economies in transition . The Committee noted that Australia and the country occupying the presidency of the European Union would inform the secretariat of the identities of the 18 countries that would serve as members from developed countries . In its deliberation of guidance on the evaluation of current and projected releases of chemicals listed in annex C , the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) Introducing the item , the secretariat noted the UNEP Standardized Toolkit for Identification and Quantification of Dioxin and Furan Releases . This Toolkit was now being used by 14 countries , with funding being identified for its use in a further three countries . The generous financial and other support of the Governments of Canada , Denmark , Germany , Switzerland and the United States as well as the Arctic Council Assessment Programme was acknowledged . A number of representatives spoke very favourably on the usefulness of the Toolkit . Representatives observed that the Toolkit was a good basis for provisional guidance but ultimately needed to be more detailed and that a strategy for proper identification of all sources should be included . It was further noted that currently emissions factors should be useable by developed countries , developing countries and countries with economies in transition . Representatives noted that the Toolkit would perhaps need to address new sources , as well as all of the unintentionally produced POPs in annex C of the Convention . It was noted that more references and more detail would also be useful . The Committee agreed that an update of the Toolkit should be prepared by the secretariat taking into account comments and input to be received from Governments and others by 31 December 2002 as well as the experiences of those countries using the Toolkit . That update would be presented for discussion at the seventh session of the Intergovernmental Negotiating Committee and then forwarded as appropriate to the Conference of the Parties to serve as guidance once the Convention entered into force . Decision INC-6/4 , on the evaluation of current and projected releases of chemicals listed in annex C is contained in annex I to the present report . C. Measures to reduce or eliminate releases from stockpiles and wastes ( Article 6 ) In its deliberations , the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) . Introducing the item , the secretariat observed that the Committee might wish to take note of the information papers before it , and might further wish to comment on the cooperative activities undertaken with the Basel Convention and on possible further areas of cooperation . A number of representatives welcomed the progress made by the Technical Working Group of the Basel Convention in the preparation of technical guidelines for the environmentally sound management of POPs wastes and encouraged cooperation with the Basel Convention secretariat in the process of their finalization , considering this activity to be of high priority . One representative was of the view that technical experts from the Stockholm Convention should be enabled to participate in the process of drafting these guidelines to the same extent as Parties to the Basel Convention , and through their attendance at its technical meetings , despite the fact that not all interested countries were Parties to the Basel Convention . It was noted that advantage should be taken of the possibility for stakeholders to submit comments on the technical guidelines by 15 September 2002. One representative , speaking on behalf of a regional economic integration organization and its member States said that , once the technical guidelines had been finalized , the secretariat should study them to see their implications for the Stockholm Convention , and should draft recommendations for the first meeting of the Conference of the Parties concerning those elements of the guidelines that could be adopted as legal provisions under the Convention . He also encouraged cooperation with the Basel Convention in the revision of the technical guidelines on PCBs , PCTs and PBBs . Pointing to the recently approved Basel Convention technical guidelines for the dismantling of ships , which were to be submitted to the Conference of the Parties at its sixth meeting , in December 2002 , he noted the possibility that such activities could involve releases of POPs , and said that his organization would monitor the situation to see if the safeguards were at the level required by the provisions of the Stockholm Convention . Many representatives welcomed the current cooperation at the institutional level between the secretariats of the Basel Convention and the Stockholm Convention and encouraged an increase in such cooperation in other areas , particularly capacity-building , implementing and reporting . Several representatives said that such cooperation should also be extended at the national level on matters related to the two Conventions . One representative , pointing to the evidence of good cooperation to date between the Basel Convention and the Stockholm Convention , expressed strong support for the clustering of the secretariats of chemicals and wastes-related multilateral environmental agreements . The Committee invited the Conference of the Parties of the Basel Convention to consider inviting experts from the Intergovernmental Negotiating Committee to participate in the process related to preparing the technical guidelines on POPs waste . The Committee also invited the secretariat to make an analysis of the compiled technical guidelines on POPs and prepare a report for the first meeting of the Conference of the Parties , with guidance on what elements of the technical guidelines should be adopted as legal provisions of the Stockholm Convention . Decision INC-6/5 on measures to reduce or eliminate releases from stockpiles and wastes : development of technical guidelines on the environmentally sound management of persistent organic pollutant wastes , is contained in annex I to the present report . National implementation plans ( Article 7 ) In its deliberations , the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) Introducing the item , the secretariat suggested that the Committee might wish to consider whether there was a need , first , to prepare guidance relevant to review and updating , as appropriate , of national implementation plans for consideration by the Conference of the Parties and , second , to prepare interim guidance to countries to assist in the development of those national implementation plans in the interim period . In the latter context , the secretariat referred to a guidance document being developed in the context of a GEF-supported pilot project executed in 12 countries by UNEP with in-kind support from the World Bank and the Government of Denmark . In addition , guidelines for enabling activities had been prepared by GEF prior to the adoption of the Stockholm Convention and recent decisions of the GEF Council , and which had been used as a basis for developing national implementation plans to date . Further clarification on the guidelines prepared for enabling activities was provided by the GEF representative who noted that the guidelines would be revised to take into account the final text of the Stockholm Convention . He added that there were 64 developing countries or countries with economies in transition receiving or about to receive funding to prepare national implementation plans . Representatives noted the importance of having national implementation plans that would ensure efficient compliance with the obligations of the Convention . While guidance for preparing those plans would ensure consistency and inclusion of key elements , representatives emphasized that it should not be prescriptive but rather flexible and dynamic , taking into account the different environmental , economic and political commitments of countries . The necessity of considering both developing and developed country situations and the need for a transparent process was also stressed . The Committee wished to see incorporated into the guidance the experiences of countries that were preparing or had implemented national implementation plans , including the 12 pilot countries , as well as experiences gained from other multilateral environmental agreements , especially chemical agreements . The Committee requested the secretariat to prepare guidance relevant to the review and updating of national implementation plans for consideration by the Conference of the Parties . The Committee also requested the secretariat to prepare interim guidance to assist countries to develop their national implementation plans and take into account written comments from Governments that should be received no later than 31 October 2002. A revised interim guidance document would be submitted to the Committee for consideration at its seventh session . Decision INC-6/6 the development of interim guidance to assist countries in the preparation of national implementation plans and guidance for reviewing and updating national implementation plans , is contained in annex I to the present report . E. Listing of chemicals in annexes A , B and C ( Article 8 , annexes D , E and F , and paragraph 6 of article 19 ) In its deliberations , the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) Introducing the item , the secretariat , pointing to the anticipated rapid rate of ratification of the Convention , underlined the need for clear guidance to be given at the current meeting on the draft rules of procedure , composition and operational guidelines for the functioning of the Persistent Organic Pollutants Review Committee . Although it was possible to request the secretariat to prepare a set of such draft elements for future submission to the Committee , in light of the time factor , it was perhaps more desirable to establish a contact group at the current meeting to develop relevant recommendations concerning the POPs Review Committee , for consideration by the Conference of the Parties at its first meeting . One representative , speaking as Chair of the Interim Chemical Review Committee of the Rotterdam Convention , underlined the importance of ensuring that suitably qualified experts were selected by the Intergovernmental Negotiating Committee . Under the Rotterdam Convention , the experts worked mainly intersessionally , through e-mail , and in English only , in order to draft the decision guidance documents . Transparency was ensured by attaching to the translated reports of the Interim Chemical Review Committee the rationale behind a decision to list a chemical , and submitting the translated draft decision guidance documents to Parties six months prior to a meeting of the Intergovernmental Negotiating Committee . One representative , speaking on behalf of a regional economic integration organization and its member States , considered that the Interim Chemical Review Committee of the Rotterdam Convention was an appropriate starting point for the development of the rules of procedure , which could be amended according to the needs of the Stockholm Convention , ensuring the efficient , timely and effective operation of the POPs Review Committee and its conduct of a step-wise procedure . In order to ensure flexible and transparent procedures , the meetings of the POPs Review Committee should be open to observers and the Committee should be able to establish subgroups to provide specialist advice to assist its work . The POPs Review Committee should be able to make recommendations to the Conference of the Parties regarding its own functioning , as well as guidance which might be established by the Conference of the Parties . He expressed a readiness to start work to enable the adoption of the rules of procedure by the Conference of the Parties at its first meeting . Another representative , expressing support for that position , noted that the list of examples of technical subsidiary bodies contained in the information paper prepared by the secretariat ( UNEP/POPS/INC.6/INF/4 ) was not exhaustive , and that the operational aspects of other bodies could also be taken into account , such as the Technology and Economic Assessment Panel under the Montreal Protocol on Substances that Deplete the Ozone Layer . In addition , he considered that , while the secretariat 's paper provided a quantitative analysis of the operations of the subsidiary bodies listed , what was needed was a qualitative analysis , setting out the advantages and disadvantages that had been encountered as they performed their functions . The Committee decided to establish an open-ended contact group , to be co-chaired by Mr. Reiner Arndt ( Germany ) and Ms. Fatoumata Jallow NDoye Ndoye ( Gambia ) , with a mandate to consider issues of the terms of reference , operational guidelines and rules of procedure for the POPs Review Committee , and to report to plenary on the results of its work . Reporting to plenary on the results of the deliberations of the contact group , co-chair Reiner Arndt pointed to a conference room paper containing the report of the contact group and noted that it had not reached agreement on the question of what was meant by “ equitable geographical distribution ” , which the contact group agreed to put to the UNEP legal counsel/legal drafting group . Co-chair Fatoumata Jallow NDoye Ndoye highlighted the contact groups ' group 's view that , due to the expected workload , either co-chairs or vice-chairs could be used . On that issue , the group had considered that the Conference of the Parties be given flexibility to decide , and the issue could be raised with the legal drafting group in its consideration of the draft rules of procedure for the Conference of the Parties . The Committee took note of the report of the contact group and requested the secretariat to use the report as the basis to propose a brief description and draft terms of reference for the subsidiary body to review candidate POPs for further consideration by the Committee at its seventh session . The report of the contact group is contained in annex V to the present report . Information exchange ( Article 9 ) In its deliberations the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) Introducing the item , the secretariat observed that guidance was sought from the Committee on the process for the design , development , operation and scope of the clearing-house mechanism , as well as on the possible operation of that mechanism on a pilot basis . Some representatives noted the need to explore synergies with other information exchange systems such as those of the Intergovernmental Forum on Chemical Safety , UNEP Chemicals and other organizations as well as with information exchange activities that were being discussed in the context of the capacity assistance network . Further to a request for clarification , the secretariat informed the Committee that while US$ 250,000 was estimated per annum for 2003 and 2004 to maintain the current web site and clearing house , as well as begin design of a future clearing house , US$ 1-1.3 million would be required per annum to establish a clearing house at the same level as some other multilateral environmental agreements . Some representatives questioned the appropriateness of assigning such a budget to the development of a clearing-house mechanism when resources were limited . The Committee noted the valuable and excellent information contained in the UNEP POPs web site and wished to see the current commitment to that web site maintained . The Committee considered that it was premature to embark on a pilot project on a clearing-house mechanism and that prior to initiating a process for the design , development , operation and scope of a clearing-house mechanism , a more detailed work programme should be prepared by the secretariat based on comments to be received from Governments . Decision INC-6/7 on a clearing-house mechanism for information exchange on persistent organic pollutants is contained in annex I to the present report . The Committee agreed to further consider this item at its next session . Technical assistance ( Article 12 ) In its deliberations the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) Introducing this item , the secretariat observed that the Committee might wish to consider three central issues : whether to establish a process for developing the guidance called for in paragraph 3 of article 12 for consideration by the Conference of the Parties at its first meeting , as well as the timing and modalities for that work ; whether to request the secretariat to undertake a feasibility study on ways and means of establishing and ensuring the functioning of regional and subregional centres called for in paragraph 4 of article 12 for capacity-building and transfer of technology within the framework of the Stockholm Convention ; or whether to request the secretariat to develop and conduct , in cooperation with the secretariat of the Basel Convention and the Basel Convention regional centres , a pilot initiative of regional and subregional centres for the purpose of facilitating technical assistance , subject to the availability of extrabudgetary resources . Representatives noted the important role that technical assistance , including technical assistance for capacity-building , would play in assisting developing country Parties and Parties with economies in transition to fulfil their obligations under the Stockholm Convention . A rapid start to the provision of effective assistance was thus desirable . To focus efforts on the most important areas , it was necessary to evaluate the specific needs of different regions , subregions and countries regarding capacity-building and the transfer of technology . That information could be provided through written submissions from countries and other stakeholders ; experience gained in the development of national implementation plans under article 7 ; broader relevant experience gained developing and implementing action plans under other multilateral environmental agreements ; and proposals and other information gathered during the negotiation process that led to the Stockholm Convention , particularly article 12 on technical assistance . To enhance the provision of technical assistance in accordance with article 12 , representatives noted the value of seeking and utilizing efficiencies and synergies between the institutional arrangements provided for under the Stockholm Convention and other multilateral environmental institutions . Particular attention was placed on possible utilization of the regional and subregional centres created under the Basel Convention . At the same time , it was recognized that other potential arrangements existed , including : utilizing regional and subregional centres associated with other multilateral environmental institutions ; using some but not necessarily all of the Basel Convention centres , based on their comparative effectiveness and location , among other factors ; and creating new centres to address geographic or substantive gaps among existing regional and subregional centres . In examining potential arrangements , many factors needed to be taken into account , including : the comparative operational and economic efficiencies and synergies ; the consequences of co-locating centres for conventions with different memberships , mandates and implementation requirements and for which different government agencies are often responsible ; the experience of other multilateral environmental institutions with regard to the effective utilization of regional and subregional centres ; various mandates to increase synergies amongst multilateral environmental agreements and institutions ; relevant differences across regions and subregions with regard to implementing the Stockholm Convention ; the necessity and uncertainty of securing agreement with the Conference of the Parties to the Basel Convention and/or other multilateral environmental agreements ; and the various budgetary impacts . The Committee noted the potential value that a pilot initiative could have for determining the value of utilizing Basel Convention regional and subregional centres for facilitating the provision of technical assistance in accordance with article 12 of the Stockholm Convention . At the same time , important issues and concerns regarding the scope of the pilot initiative , the proper sequencing of the various studies , and the availability of extrabudgetary resources were recognized . In its deliberations on the capacity assistance network , the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) . Introducing the item , the secretariat invited the Committee to consider the appropriateness of requesting the secretariat to begin preparatory work on the potential establishment of a capacity assistance network , as well as the possible timing and modalities for that work . Representatives noted the valuable role that some type of capacity assistance network could play to better facilitate and coordinate the provision of technical assistance to developing country Parties and Parties with economies in transition . Such a network might also serve to link , with respect to the provision of technical assistance , various entities created under the Convention , such as the national focal points , regional and subregional centres and secretariat . Many uncertainties remained , however , including : the relevant options for the precise goals , design , operation , management , timing and funding of such a network ; the ability of any proposed network to take full account of the specific needs and special situation of least developed countries and small island developing States with regard to technical assistance , as required in paragraph 5 of article 12 ; the overall relationship between a capacity assistance network and the provision of technical assistance under article 12 or the clearing-house mechanism established under article 9 ; its relationship with other institutional entities involved in the provision of financial and technical assistance or the exchange of information , such as GEF and IFCS- INFOCAP ; its relationship with the broad issue of technology transfer ; the proper role for regional and subregional centres ; and the involvement of the private and non-governmental sectors . The Committee then decided to establish an open-ended contact group co-chaired by Mr. Jozef Buys ( Belgium ) and Mr. Christopher Corbin ( Saint Lucia ) with a mandate to address the draft decisions relating to technical assistance prepared by the secretariat . The outcome of the deliberations as adopted by the Committee are decisions INC-6/8 , INC-6/9 , INC-6/10 and INC-6/11 contained in annex I to the present reportnote H. Financial resources and mechanisms ( Article 13 ) Interim financial mechanism ( Article 14 ) The Committee took up its consideration of the above items concurrently . Introducing these items , the secretariat drew the Committee 's attention to the documentation prepared on the subject ( see annex IX ) ) Representatives of the GEF secretariat then provided an overview of the structure and operation of GEF as well as details of the action taken by GEF since May 2001 in response to the resolutions of the Conference of Plenipotentiaries on the Stockholm Convention and the steps taken to facilitate early implementation of the Convention , particularly in relation to building capacity in eligible countries . Of particular note wereere the decision by the GEF Council in May 2002 to recommend to the GEF Assembly the creation of a new focal area for POPs and the progress made in facilitating simpler and more expeditious access to funding , including new approval procedures for project proposals under US$ 500,000 . To date , 64 countries representing all regions and levels of preparedness had already submitted proposals for national implementation plans funding to GEF and 45 proposals had already been approved under the expedited procedures . In addition , 12 countries were receiving GEF funding for their national implementation plans as part of the project - Development of National Implementation Plans for the Management of persistent organin organic pollutants - which was approved by the Council in May 2001 and which was being executed by UNEP Chemicals . In their presentations and in response to questions , the representatives of GEF outlined the formal relationships GEF had developed with the governing bodies of other conventions . They also outlined the proposed amendments to the GEF Charter that would reflect a new focal area for POPs as well as the status of GEF as the principal entity , on an interim basis , entrusted with the operation of the financial mechanism for the Stockholm Convention . Noting that GEF activity in the area of POPs was in its initial phase , they emphasized that GEF would respond to guidance from the Committee and , eventually , the Conference of the Parties , while continuously evolving its activities to suit the needs of the Stockholm Convention as far as possible . The Committee welcomed the efforts made by GEF to facilitate early implementation of the Convention , particularly the decision to recommend the creation of a new focal area for POPs , the proposed amendments to the GEF Charter , and the progress made in facilitating the application , approval and funding of projects to develop national implementation plans . The Committee noted the desirability of a memorandum of understanding between the Conference of the Parties and GEF to define the relationship between , and the respective responsibilities of , the two entities . To facilitate the development of the memorandum of understanding , the Committee noted that it would be advantageous to incorporate useful elements of similar agreements between GEF and other conventions , views of Governments regarding elements to be included , as well as the results of consultations between the secretariat and GEF , the secretariats of other conventions , and other bodies and experts regarding the experience gained in other conventions . Decision INC-6/12 on a draft memorandum of understanding with the Global Environment Facility , is contained in annex I to the present report . During the adoption of this decision , the Committee noted that the secretariat would compile any comments received from Governments , prior to its seventh session regarding the draft memorandum of understanding and make these available to the Committee at that session as an information document . The Committee acknowledged the need for the first Conference of the Parties to provide guidance to the financial mechanism , as required under paragraph 7 of article 13. It was recognized that such guidance would be most useful if it were geared toward substantive issues related to specific implementation requirements under the Convention , and that it would be open to revision or expansion by subsequent meetings of the Parties . To facilitate their further deliberation , the Committee requested the secretariat to solicit views from Governments regarding elements they believed should be included in such guidance and to develop a document for consideration at the next meeting of the Committee . Such a document should also include elements drawn from consultations , as appropriate , between the secretariat and GEF , the secretariats of other conventions , and other bodies and experts regarding the experience gained in other conventions . The Committee acknowledged the potential value of developing for consideration by the Conference of the Parties draft terms of reference for use in the review of the financial mechanism called for under paragraph 8 of article 13. It was noted that subparagraphs ( a ) through ( e ) of paragraph 7 of article 13 established much of the basis of such a review , although a number of other potential elements and processes were also discussed . With regard to the need to initiate preparations for a possible decision to be taken by the Conference of the Parties on the financial mechanism under article 14 , the Committee concluded that it was premature for it to discuss the issue at that time or for the secretariat to prepare any documentation for its next meeting . The secretariat then drew the Committee 's attention to a document on the possible collection of information from relevant funding institutions on the ways in which they could support the Stockholm Convention ( UNEP/POPS/INC.6/13 ) . The secretariat referred to resolutions of the Conference of Plenipotentiaries and , in particular , paragraph 5 of its resolution 2 , as the background to the paper . In this regard the Committee was invited to consider whether it wished to provide advice to the secretariat on the timing and the types of information to be collected , the process of doing so , and the type of funding institutions to contact . The Committee noted that gathering and synthesizing such information would be most useful but should be done in a judicious manner . It was also important not to limit the survey to intergovernmental organizations . Rather , the secretariat should gather information , as appropriate , from the full array of international , regional , national , private sector , non-governmental and private foundation-based funding institutions . On the basis of its deliberations , the Committee adopted decisions INC-6/13 , INC-6/14 and INC-6/15 , contained in annex I to the present report . J. Reporting ( Article 15 ) In its deliberations , the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) Introducing the item , the secretariat said that the Committee might wish to consider the initiation stage or developing a process for format and timing of Party reporting obligations . The Committee noted that in preparing a reporting format effort should be placed on ensuring compatibility with provisions for reporting in other multilateral environmental agreements . The secretariat was encouraged to steer that format towards simplicity to facilitate efficient and effective reporting and to avoid making reporting an onerous burden to countries . In addition , a delineation should be made between reporting requirements that were mandatory and those that were not . The Committee requested the secretariat to prepare a paper on a possible format and timing for Party reporting obligations taking into account comments received from Governments as well as reporting obligations under other multilateral environmental agreements . The Committee also requested the secretariat to prepare a draft model format on reporting for consideration at its next session . Decision INC-6/16 , on format and timing of Party reporting is contained in annex I to the present report . Effectiveness evaluation ( Article 16 ) Introducing the item , the secretariat drew the Committee 's attention to the documentation prepared on the subject ( see annex IX ) ) as well as a written proposal submitted to the Committee during the meeting . The Committee welcomed the continuing efforts of UNEP Chemicals in two major assessment and monitoring related activities , the Regionally Based Assessment of Persistent Toxic Substances project , funded by GEF and the Global Network on the Monitoring of Persistent Organic Pollutants in the Environment . The Committee noted the importance of activities that provided high quality , comparable , long-term , national , regional and global monitoring data on the substances controlled under the Convention . To be most useful for the purposes of evaluating the effectiveness of the Convention , the acquisition and evaluation of monitoring data would need to follow particular sequencing and procedures . It was recognized that capacity to obtain , compare and utilize such data varied across countries and regions . There were also opportunity , cost and budgetary implications of the different approaches to this issue . Following its initial deliberations , the Committee established a drafting group to draft text for a possible draft decision on this item . Decision INC-6/17 on effectiveness evaluation is contained in annex I to the present report . L. Non-compliance ( Article 17 ) In its deliberations the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) Introducing the item , the secretariat invited the Committee to consider initiating the process of developing a procedure and institutional mechanism for determining non-compliance with the Stockholm Convention as well as elements to be included in that regime . All representatives were of the view that the documentation prepared by the secretariat was a useful basis on which to initiate work . It was noted that article 17 of the Stockholm Convention provided that the Conference of the Parties would develop and approve procedures and institutional mechanisms for determining non-compliance “ as soon as practicable ” . Some representatives stated that the Committee should focus efforts during the interim period on activities that would facilitate the implementation of the Convention and its speedy entry into force . As such it was considered premature to precipitate the process for developing and approving non-compliance procedures and institutional mechanisms that would most likely not be presented to the Conference of the Parties at its first meeting . Other representatives stated that a compliance mechanism should be established at the first meeting of the Conference of the Parties or shortly thereafter . They also noted that the resolution on interim arrangements adopted at the Conference of Plenipotentiaries in Stockholm to facilitate the rapid entry into force and effective implementation of the Convention provided for work on non-compliance by the Intergovernmental Negotiating Committee . It was stressed that an effective mechanism to examine non-compliance was essential and that when developing that regime emphasis should be placed on a non-confrontational , facilitative and flexible regime that would encourage and assist countries to achieve and maintain compliance rather than be punitive . Some representatives also emphasized the importance of appropriate measures for addressing non-compliance . It was also noted that reporting on non-compliance should not place an undue burden on Parties and that provisions for technical assistance , technology transfer , financial resources and capacity-building should be taken into account while ensuring the territorial integrity and sovereignty of countries . Some representatives also emphasized the importance of appropriate measures for addressing non-compliance . Some representatives requested the secretariat to prepare , based on written comments from Governments , a draft model for a compliance mechanism for consideration by the Intergovernmental Negotiating Committee at its seventh session , while others proposed that the secretariat , based on those comments prepare a synthesis . Other representatives wanted the secretariat to only compile the written comments received from Governments . As an initial step , Governments would submit comments and proposals in writing , and preferably in electronic format , to the secretariat based on the provisions of article 17 of the Convention , on the elements provided in the draft text submitted by the secretariat in document UNEP/POPS/INC.6/17 , or regarding any other relevant aspects or national concerns . Those comments were to reach the secretariat no later than 31 December 2002. The Committee requested the secretariat to prepare a full compilation of comments and proposals received from Governments for submission to the Committee at its seventh session . The secretariat would also provide a synthesis by issue of the comments and proposals to accompany that document . The Committee further requested the secretariat to prepare an analysis of non-compliance procedures included in other multilateral environmental agreements , taking into account pre-existing work on the subject , and to submit that analysis to the Committee at its seventh session . Decision INC-6/18 on non-compliance is contained in annex I to the present report . Settlement of disputes ( Article 18 ) In its deliberations , the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) Introducing the item , the secretariat drew attention to the draft rules on arbitration and conciliation prepared by the secretariat . One representative , referring to articles 10 and 16 of the draft arbitration rules , noted that a precedent existed under the International Court of Justice to the effect that a decision of the court had not been binding on a third party intervening in a dispute . It was thus necessary to consider further whether the language of article 16 was appropriate to the Stockholm Convention . Another representative , referring to article 13 of the arbitration draft rules , considered that provision should be included for proper adequate notification of parties that did not appear before the tribunal , as well as guidance or warning concerning the consequences of continued non-appearance . The Committee agreed to forward the draft rules on arbitration and conciliation , as contained in the annex to the note by the secretariat on settlement of disputes ( UNEP/POPS/INC.6/18 ) , to the legal drafting group for consideration , taking into account the comments made in the plenary . Reporting back to plenary on the draft rules on conciliation , the Chair of the legal drafting group noted in particular one policy issue that had been flagged for consideration at the seventh session of the Committee which was that for budgetary reasons , the group had examined the possibility of reducing the number of members of the Conciliation Commission of the Stockholm Convention from five members , as is standard in most other conciliation commissions , to three members . The Chair of the legal drafting group further reported that the group had not had sufficient time to consider the draft rules on arbitration at the current session but that it would return to that item at the seventh session of the Committee . The draft rules on arbitration and conciliation as reviewed by the legal drafting group are contained in annex II to the present report . Conference of the Parties ( Article 19 ) In its deliberations , the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) ( i ) Draft rules of procedure of the Conference of the Parties and its subsidiary bodies Introducing the item , the secretariat drew attention to the draft rules of procedure for the Conference of the Parties and its subsidiary bodies , as prepared by the secretariat and contained in the annex to document UNEP/POPS/INC.6/14 . It was explained that , while the rules of procedure of the Intergovernmental Negotiating Committee had been taken into account in the preparation work , they did not constitute a precedent for the rules of the Conference of the Parties . A number of representatives expressed appreciation for the work of the secretariat , which was considered to be a good basis for discussion . Others pointed out that they would be bringing specific concerns and proposals directly to the attention of the legal drafting group . In the course of the debate in plenary , proposals and comments addressed the following specific rules : Rule 6 ( Participation of United Nations , specialized agencies and non-Parties ) Rule 7 ( Participation of other bodies or agencies ) Several representatives proposed an amendment to the above rules to the effect that Parties are informed on the participation of observers in the meeting 60 days in advance of the meeting . That would allow developing countries , countries with economies in transition and non-governmental and other organizations to have time for adequate planning and coordination for their effective participation . Several other representatives drew attention to a potential policy issue of having to provide such notice to non-governmental organizations . Some representatives and expressed a reservation to the proposed amendment . The Committee requested the legal drafting group , in its consideration of the draft rules of procedure , to take fully into account the issues raised in the discussion on rules 6 and 7. Rule 46 ( Majority required ) A number of representatives highlighted the need for further consideration of the different kinds of procedures required for decisions under the Stockholm Convention , and the different options available for the question , particularly considering the types of solutions applied under other multilateral agreements . One representative expressed a reservation at the concept of a two-thirds majority . Another representative stressed the need for the procedure chosen to be obstacle-free and to facilitate decision-making . One other representative offered to make available a conference room paper containing an analysis of the types of decisions to be adopted by the Conference of the Parties . Attention was also drawn to the link between rule 46 and rule 60 ( Amendments to the rules of procedure ) . Another representative considered that the provision in paragraph 4 , by which a proposal would be rejected after a second inconclusive vote , needed to be amended to provide for more time and , perhaps , an alternative method . It was observed that it might be necessary to see whether any precedent for such a method existed . The Committee requested the legal drafting group , in its consideration of the draft rules of procedure , to take fully into account the issues raised in the discussion on rule 46. Rule 47 ( Order of voting on proposals ) One representative proposed deletion of the sentence “ The Conference of the Parties may , after each vote on a proposal , decide whether to vote on the next proposal ” . The Committee requested the legal drafting group , in its consideration of the draft rules of procedure , to take fully into account the issues raised in the discussion on rule 47. The chair of the legal drafting group reported that the group had examined the draft rules of procedure of the Conference of the Parties . The chair indicated that there were several items relevant to rules 6 ( Participation of United Nations , specialized agencies and non-Parties ) , 7 ( Participation of other bodies or agencies ) , 22 ( Election of officers ) , 31 ( Voting in subsidiary bodies ) , 46 ( Majority required ) , and 47 ( Order of voting on proposals ) and 60 ( Amendments to the rules of procedure ) that would require policy decisions by the Committee . Those items were identified either by footnotes or by square brackets in the draft text of the legal drafting group that is contained in annex III to the present report . With regard to paragraph 4 of rule 46 , the last line sentence of rule 47 and a question raised on rule 60 , the chair of the legal drafting group confirmed that those were standard rules that could be found in other multilateral environmental agreements . The draft rules of procedure of the Conference of the Parties and its subsidiary bodies as reviewed by the legal drafting group are contained in annex III to the present report . ( ii ) Draft financial rules for the Conference of the Parties , its subsidiary bodies and the Convention secretariat Introducing the item , the secretariat drew attention to the draft financial rules for the Conference of the Parties , its subsidiary bodies and the Convention secretariat , as prepared by the secretariat and contained in the appendix to document UNEP/POPS/INC.6/15 . It was noted that several paragraphs of the draft rules contained bracketed text , and that in some cases those would require further consideration . It was suggested that , following comments and proposals from the floor , the draft financial rules would be forwarded to the legal drafting group for examination , which would report to plenary on the results of its deliberations , bringing to its attention any areas where policy , rather than technical , matters required a decision . Several representatives expressed a reservation with regard to the reference in paragraph 12 ( a ) of the draft rules to the application of the indicative scale of assessments of the United Nations as a basis for the calculation of contributions to the Stockholm Convention . One representative pointed out that , in the General Assembly resolutions pertaining to the scale of assessments , it was noted that the scale of assessments and its adjustments did not automatically apply to specialized agencies and other intergovernmental organizations , and he called upon the secretariat to verify the General Assembly resolutions on application of the scale of assessments to members . One representative supported the current text in paragraph 12 ( a ) and requested the removal of the square brackets around the figures 0.001 , 22 and 0.01 . Attention was also drawn to the need to clarify how the member States ' contributions to the Stockholm Convention were to be calculated . Several representatives pointed to the need to assess the options and methods used by other conventions and multilateral agreements for calculating the distribution of contributions , and one of them asked the secretariat to prepare for the seventh session of the Committee a reference document compiling information on the subject . The secretariat agreed to collect additional information and make it available to the Committee . One representative drew attention to the link between paragraph 1 of rule 46 of the draft rules of procedure , concerning decision-making by the Conference of the parties , and paragraph 4 of the draft financial rules . The Committee requested the legal drafting group , in its consideration of the draft financial rules for the Conference of the Parties , its subsidiary bodies and the Convention secretariat , to take fully into account the issues raised in the discussion in plenary . The chair of the legal drafting group reported that the group had had a first reading of the draft financial rules for the Conference of the Parties , its subsidiary bodies and the Convention secretariat . Some issues had been noted for review at the seventh session of the Committee and these had been highlighted in square brackets . The chair of the legal drafting group wished to have the assistance of a financial officer in that group during its deliberations second reading of the rules in order to refer them to the Committee for consideration on the item at the its seventh session of the Committee The draft financial rules for the Conference of the Parties to the Stockholm Convention on Persistent Organic Pollutants , its subsidiary bodies and the Convention secretariat as reviewed by the legal drafting group are contained in annex IV to the present report . Issues relating to the Stockholm Convention not covered above No issues were raised under this agenda item . P. Other issues for consideration by the Conference of the Parties at its first meeting ( i ) Location of the secretariat ( Resolution 6 of the Conference of Plenipotentiaries ) In its deliberations , the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) Introducing the item , the secretariat invited the Committee to consider document UNEP/POPS/INC.6/21 on the location of the secretariat , which in its appendix set out the categories of information to be provided by potential host countries in support of their tenders , in order to ensure some comparability of the offers made . The Committee was invited to also consider the question of a deadline for the submission of such information , in order to allow for its adequate compilation by the secretariat in time for consideration by the Committee at its seventh session . The representatives of Germany , Italy and Switzerland reaffirmed the offers made by their Governments to host the secretariat . The Committee discussed and amended the information contained in the appendix to UNEP/POPS/INC.6/21 and requested that candidate countries base their proposals to offer to host the secretariat on the information contained therein . The Committee agreed to invite interested countries to submit , by 30 November 2002 , the information called for in the appendix as amended by the Committee and contained in the appendix to decision INC-6/19 referred to below , for consideration by the Committee at its next session . Further to its deliberation , the Committee adopted decision INC-6/19 on consideration of offers to host the permanent secretariat of the Stockholm Convention , contained in annex I to the present report . ( ii ) Liability and redress ( Resolution 6 of the Conference of Plenipotentiaries ) In its deliberations , the Committee had before it the documentation on the subject prepared by the secretariat ( see annex IX ) ) Introducing the item , the secretariat invited the Committee to take note of the information submitted by countries and others on the subject of liability and redress , in response to the invitation by the Conference of Plenipotentiaries , which was compiled in an information paper prepared by the secretariat ( UNEP/POPS/INC.6/INF/5 ) . Attention was drawn to a workshop on liability and redress in the context of the Convention , to be hosted by the Government of Austria in Vienna from 19 to 21 September 2002. The report of the workshop would be considered by the Conference of the Parties at its first meeting with a view to deciding what further action should be taken . Several representatives said that further comments on the subject of liability and redress should be solicited from those that had not yet provided information . Several representatives expressed gratitude and appreciation to the Government of Austria for hosting the upcoming workshop on liability and redress , which was considered to be very useful in helping the Conference of the Parties to take a decision on that question . Some disappointment was voiced that there had not been an opportunity at the current meeting for an exchange of views on liability and redress , since it was considered that such a discussion could have provided guidance for the agenda of the workshop . One representative , recalling that experience in other multilateral agreements had shown that liability and redress regimes involved lengthy and detailed negotiations , considered that , without greater justification , such a regime should not be developed for the Stockholm Convention . He thus proposed that the Vienna workshop should focus on examining such justification , rather than on the details of a liability and redress mechanism . The Committee called upon those that had not already done so to provide their comments on liability and redress to the secretariat by 31 July 2002. The Committee also noted with gratitude Austria 's hosting of the workshop on liability and redress in Vienna in September 2002. The Group of Latin American and Caribbean Countries expressed their interest to host the first meeting of the Conference of the Parties of the Stockholm Convention at the opening of the sixth session of the Intergovernmental Negotiating Committee . A presentation was made by the representatives of Uruguay and Switzerland on preparations under way towards the possible holding of the first meeting of the Conference of the Parties in Uruguay . The Committee welcomed the news of those discussions . The secretariat drew attention to the list of those that had signed and/or ratified , acceded to , accepted or approved the Stockholm Convention as at 11 June 2002 , as contained in document UNEP/POPS/INC.6/INF/12 , pointing out that there had been no additions to that list to date . The secretariat referred also to the invitation of the Secretary-General of the United Nations to Governments , requesting those intending to sign or ratify multilateral agreements to endeavour to do so on the occasion of the World Summit on Sustainable Development , to be held in Johannesburg from 26 August to 4 September 2002. In order to assist countries to ratify or accede to the Convention , the Committee recommended that the secretariat , in consultation with the United Nations Treaty Section , prepare a checklist that would identify the general steps that a sovereign nation should complete before it deposits its instruments of ratification or accession to the United Nations . The representative of the United States informed the meeting that his Government would contribute $100,000 to support the convening of the first meeting of the expert group on BAT and BEP . The Committee agreed to review the process for reporting on its work early on in the agenda of the seventh session of the Intergovernmental Negotiating Committee . The Committee adopted its report on the basis of the draft report contained in documents UNEP/POPS/INC.6/L.1 and L.1/Add.1 which had been circulated during the meeting , as amended , and on the understanding that finalization of the report would be entrusted to the Rapporteur , working in conjunction with the secretariat . Following the customary exchange of courtesies , the Chair declared the session closed at 7.25 p. m. on Friday , 21 June 2002. Annex I ITS SIXTH SESSION , HELD IN GENEVA FROM 17 TO 21 JUNE 2002 Decision INC-6/1 : Amendment of rule 8 of the rules of procedure for the meetings of the Intergovernmental Negotiating Committee The Intergovernmental Negotiating Committee Decides by consensus , in accordance with rule 56 of the rules of procedure for its meetings , to amend rule 8 of the rules of procedure in order to increase the membership of the Bureau of the Committee to ten members ; Decides that the amended rule 8 shall read as follows : “ 1. The Committee shall elect from among the representatives of the State Parties a Bureau composed of one Chair and nine Vice-Chairs , one of whom shall act as Rapporteur . In electing the officers , the Committee shall have due regard to the principle of equitable geographical representation . Each of the five regional groups shall be represented by two members . ” Decision INC-6/2 : DDT The Intergovernmental Negotiating Committee Requests the secretariat , in cooperation with the World Health Organization , to prepare a report on a possible format for reporting by Parties that use DDT on amounts used , conditions of such use and its relevance in disease management strategies as required under paragraph 4 of part II of annex B to the Stockholm Convention on Persistent Organic Pollutants ; Further requests the secretariat , in cooperation with the World Health Organization , to develop a report on guidance and information needed to assist the Conference of the Parties in evaluating the continued need for DDT for disease vector control as required under paragraph 6 of part II of annex B ; Invites the World Health Organization to actively participate in the development of the above reports ; Requests the secretariat to provide the above reports to the Intergovernmental Negotiating Committee for further consideration at its seventh session . Decision INC-6/3 : Register of specific exemptions ( Articles 3 and 4 and annexes A and B ) The Intergovernmental Negotiating Committee Requests the secretariat to prepare a report on : ( a ) A possible format for country reporting of requests for specific exemptions ; ( b ) A possible process , including alternative approaches , that might be considered by the Conference of the Parties in deciding upon the review process for the entries in the Register called for in paragraph 5 of article 4 of the Stockholm Convention on Persistent Organic Pollutants ; ( c ) A possible format for a Register of specific exemptions ; The secretariat report shall be based upon input from countries and the meeting documents UNEP/POPS/INC.6/4 and UNEP/POPS/INC.6/INF/6 ; Invites Governments to provide the secretariat with their views on a possible reporting format , process and format for the Register before 31 October 2002 ; Further requests the secretariat to submit the report to the Intergovernmental Negotiating Committee for further consideration at its seventh session . Decision INC-6/4 : Evaluation of current and projected releases of chemicals listed in annex C The Intergovernmental Negotiating Committee Notes that the “ Standardized Toolkit for Identification and Quantification of Dioxin and Furan Releases ” ( Toolkit ) of the United Nations Environment Programme provides a basis for the development of provisional guidance on the evaluation of current and projected releases of chemicals listed in annex C of the Stockholm Convention on Persistent Organic Pollutants ; Notes further that it may be appropriate to update the Toolkit and to include additional chemicals , emissions factors , levels of detail and other elements to enhance its usefulness ; Invites Governments and others to provide the secretariat with comments on how the Toolkit can be updated and expanded before 31 December 2002 ; Requests the secretariat to develop an updated and expanded version of the Toolkit , taking into consideration the comments received as well as experience in field-testing the Toolkit in countries , for consideration by the Intergovernmental Negotiating Committee at its next session . Decision INC-6/5 : Measures to reduce or eliminate releases from stockpiles and wastes : development of of technical guidelines on the environmentally sound management of persistent organic pollutant wastes The Intergovernmental Negotiating Committee Welcomes progress made by the Technical Working Group of the Basel Convention on the Control of Transboundary Movements of Hazardous Wastes and their Disposal in developing technical guidelines on the environmentally sound management of persistent organic pollutant wastes , and affirms the high priority attached by the Intergovernmental Negotiating Committee to the guidelines , particularly as they relate to the issues outlined in paragraph 2 of article 6 of the Stockholm Convention on Persistent Organic Pollutants ; Welcomes the cooperation to date between the secretariat of the Stockholm Convention and the secretariat of the Basel Convention ; Encourages continuing and strengthened collaboration between the secretariat of the Stockholm Convention and the secretariat of the Basel Convention related to activities of mutual interest to the two Conventions , in particular capacity-building ; Encourages countries to ensure close coordination at the national level between authorities responsible for the Stockholm Convention and those responsible for the Basel Convention ; Invites the Conference of the Parties to the Basel Convention to consider inviting members of the Intergovernmental Negotiating Committee to participate in partnership in activities under the Basel Convention relating to persistent organic pollutants ; Requests the secretariat to prepare a report for the Conference of the Parties to the Stockholm Convention on such guidelines relating to persistent organic pollutants as may be adopted by the Conference of the Parties to the Basel Convention , including an analysis of implications of those guidelines for the Stockholm Convention and an indication of elements that might be considered suitable for adoption under paragraph 2 of article 6 of the Stockholm Convention . Decision INC-6/6 : Development of interim guidance to assist countries in the preparation of national implementation plans and guidance for reviewing and updating national implementation plans The Intergovernmental Negotiating Committee Recalling the need for each Party to develop and endeavour to implement a plan for the implementation of its obligations under the Stockholm Convention on Persistent Organic Pollutants , Noting the guidance document prepared by the United Nations Environment Programme and the World Bank with the support of the Government of Denmark for the pilot project to support 12 countries in the preparation of their national implementation plans , Further noting guidelines prepared by the Global Environment Facility for enabling activities , Invites Governments to provide their comments on the full document referred to in UNEP/POPS/INC.6/INF/8 and other views on guidance for the preparation of national implementation plans to the secretariat by 31 October 2002 ; Requests the secretariat to : ( a ) Prepare , based on those comments and relevant existing guidance material , interim guidance to assist countries to develop their national implementation plans , taking into account the different situations , needs and experiences of countries ; ( b ) Submit a draft interim guidance document for consideration by the Intergovernmental Negotiating Committee at its seventh session ; ( c ) Prepare guidance relevant to the review and updating of national implementation plans for consideration by the Intergovernmental Negotiating Committee at its seventh session . Decision INC-6/7 : Clearing-house mechanism for information exchange on persistent organic pollutants The Intergovernmental Negotiating Committee Recognizing the importance of having a clearing-house mechanism for information exchange on persistent organic pollutants that would assist countries in the implementation of the Stockholm Convention on Persistent Organic Pollutants , Invites Governments to submit , by 31 October 2002 , questions and comments related to the design , development , operation and scope of a clearing-house mechanism for information exchange on persistent organic pollutants ; Requests the secretariat to prepare , taking into account those submissions , a detailed work plan and budget on the initiation and maintenance of such a clearing-house mechanism for consideration by the Intergovernmental Negotiating Committee at its seventh session . Decision INC-6/8 : Guidance on technical assistance The Intergovernmental Negotiating Committee Decides to initiate a process for developing the guidance on the provision of technical assistance called for in paragraphs 3 and 4 of article 12 of the Stockholm Convention on Persistent Organic Pollutants and all possible arrangements for providing technical assistance for consideration by the Conference of the Parties at its first meeting ; Invites Governments to provide the secretariat , by 31 October 2002 , with the following , relating to implementation of the obligations under the Stockholm Convention : For developed countries and other countries in accordance with their capabilities , views and information on priorities and arrangements for their provision of technical assistance to developing countries and countries with economies in transition ; For developing countries and countries with economies in transition , views and information on priorities and arrangements regarding technical assistance from developed countries and other countries in accordance with their capabilities ; Requests the secretariat to prepare a report on priorities and arrangements for technical assistance , to be based on : The views and information received from countries ; The relevant experience gained from the development of the implementation plans under article 7 ; Information gathered and proposals developed throughout the negotiating process that relate to technical assistance ; Information gathered from regional and subregional consultative workshops ; Further requests the secretariat to submit the report to the Intergovernmental Negotiating Committee for its consideration at its seventh session . Decision INC-6/9 : Feasibility study on regional and subregional centres The Intergovernmental Negotiating Committee Requests the secretariat to undertake , in consultation with the secretariat of the Basel Convention on the Control of Transboundary Movements of Hazardous Wastes and their Disposal , as appropriate , a feasibility study on regional and subregional centres for capacity-building and transfer of technology . The study shall include : ( a ) An identification of the needs of countries in the area of capacity-building and transfer of technology that might be facilitated by regional and subregional centres ; ( b ) An assessment of the capacity of all relevant regional and subregional centres , in particular , but not limited to Basel Convention regional centres , to facilitates capacity-building and transfer of technology . Such an assessment shall include , but not be limited to , a review of mandates , functions , performance , institutional arrangements and the needs identified in paragraph 1 ( a ) above ; ( c ) An assessment of the gaps and limitations of existing arrangements , including the availability of technology to be transferred , and the means to address these constraints ; ( d ) A review of the experiences gained by other international agreements in capacity-building and transfer of technology ; ( e ) An identification and analysis of the potential synergies between the Stockholm Convention on Persistent Organic Pollutants and other multilateral environmental agreements regarding the provision of capacity-building and transfer of technology ; Further requests the secretariat to communicate terms of reference for the feasibility study to Governments for comments prior to its commencement , and to present the intermediate or final report of the study to the Intergovernmental Negotiating Committee at its seventh session . The final report should be presented no later than 31 December 2003 , unless otherwise decided by the Intergovernmental Negotiating Committee at its seventh session . Decision INC-6/10 : Case studies on regional and subregional centres The Intergovernmental Negotiating Committee Requests the secretariat to develop and conduct , in cooperation with the secretariat of the Basel Convention on the Control of Transboundary Movements of Hazardous Wastes and their Disposal and the Basel Convention regional centres , as appropriate , one or more case studies of regional and subregional centres for the purpose of facilitating capacity-building and transfer of technology in accordance with article 12 of the Stockholm Convention on Persistent Organic Pollutants and with a view to contributing to the feasibility study provided for in decision INC-6/ on the feasibility study on regional and subregional centres ; Invites Governments , intergovernmental organizations , non-governmental organizations , the private sector and international financial institutions to provide information to the secretariat on how they might contribute to the case studies . Such information should be submitted to the secretariat by 31 October 2002 ; Requests the secretariat to report to the Intergovernmental Negotiating Committee at its seventh session on progress made in implementing the case studies ; Agrees that implementation of the case studies should be subject to the availability of extrabudgetary resources , and invites developed countries and other countries in accordance with their capabilities , intergovernmental organizations , non-governmental organizations , the private sector and international financial institutions who are in a position to do so , to contribute resources . Decision INC-6/11 : Capacity assistance network The Intergovernmental Negotiating Committee Invites intergovernmental organizations , non-governmental organizations , the private sector and international financial institutions to provide the secretariat with information on how they might contribute to facilitating and coordinating access to financial and technical assistance . Such information should be submitted to the secretariat by 31 October 2002 ; Requests the secretariat , based on the views and information gathered by the secretariat in pursuance of paragraph 1 above and decision INC-6/ on guidance on technical assistance , to include in the feasibility study referred to in decision INC-6/ on the feasibility study on regional and subregional centerscentres , arrangements for developing possible modalities for a capacity assistance network as agreed upon in resolution 3 , paragraph 2 of the Conference of Plenipotentiaries and taking into consideration the work done in document UNEP/POPS/INC.6/19 . Decision INC-6/12 : Draft memorandum of understanding with the Global Environment Facility The Intergovernmental Negotiating Committee Recognizing the designation of the Global Environment Facility as the principal entity entrusted , on an interim basis , with the operation of the financial mechanism for the Stockholm Convention on Persistent Organic Pollutants , Decides to initiate a process for developing a draft memorandum of understanding between the Conference of the Parties to the Stockholm Convention and the Global Environment Facility ; Requests the secretariat to submit to the Intergovernmental Negotiating Committee at its seventh session a review of similar agreements between the Global Environment Facility and the governing bodies of other multilateral environmental agreements , including the relevant experience gained from the use of these agreements between the Global Environment Facility and the governing bodies of other multilateral environmental agreements ; Further requests the secretariat , in consultation with the secretariat of the Global Environment Facility , to prepare a draft memorandum of understanding for consideration by the Intergovernmental Negotiating Committee at its seventh session and to make available to the Committee at that session any comments thereon by Governments . Decision INC-6/13 : Guidance to the financial mechanism The Intergovernmental Negotiating Committee Decides to initiate a process for developing , for consideration by Conference of the Parties , draft guidance to the financial mechanism , as required under paragraph 7 of article 13 of the Stockholm Convention on Persistent Organic Pollutants ; Draws the attention of Governments to the elements contained in subparagraphs ( a ) through ( e ) of paragraph 7 of article 13 ; Invites Governments to provide to the secretariat by 30 November 2002 their views on elements that might be included in such guidance ; Requests the secretariat to submit a report on possible elements of such guidance to the Intergovernmental Negotiating Committee for its further consideration at its seventh session . The report is to comprise : A compilation of the views received from countries ; A synthesis of the views received from countries ; A review of the relevant experience gained from the provision of guidance given to the Global Environment Facility by the governing bodies of other multilateral environmental agreements . Decision INC-6/14 : Draft terms of reference for the review of the financial mechanism under paragraph 8 of article 13 The Intergovernmental Negotiating Committee Decides to initiate a process for developing draft terms of reference for consideration by the Conference of the Parties for use in the review of the financial mechanism called for under paragraph 8 of article 13 of the Stockholm Convention on Persistent Organic Pollutants ; Requests the secretariat to submit elements of such draft terms of reference to the Intergovernmental Negotiating Committee for its further consideration at its seventh session . In developing the draft terms of reference , the secretariat should : ( a ) Use paragraphs 7 and 8 of article 13 of the Stockholm Convention on Persistent Organic Pollutants as the primary basis for the draft terms of reference ; ( b ) Seek the input of relevant experts regarding potential options for conducting such reviews , as appropriate . Decision INC-6/15 : Collection of information from relevant funding institutions on the ways in which they can support the Stockholm Convention on Persistent Organic Pollutants The Intergovernmental Negotiating Committee Takes note of paragraphs 5 and 6 of resolution 2 , on interim financial arrangements adopted by the Conference of Plenipotentiaries on the Stockholm Convention on Persistent Organic Pollutants , held in Stockholm , Sweden , from 22 to 23 May 2001 ; Invites Governments to provide the secretariat with relevant information on ways in which their funding institutions may support the objectives of the Convention ; Invites intergovernmental organizations , non-governmental organizations and other observers , as appropriate , to provide the secretariat with relevant information on ways in which they can support the objectives of the Convention ; Requests the secretariat to begin collecting information from relevant funding institutions on the ways in which they can support the Convention , and to submit a preliminary draft report of the information received to the Intergovernmental Negotiating Committee for consideration at its next session . Draft decision INC-6/16 : Format and timing of Party reporting The Intergovernmental Negotiating Committee Invites Governments to provide the secretariat , by 30 November 2002 , with comments on timing and format of Party reporting under the Stockholm Convention on Persistent Organic Pollutants ; Requests the secretariat , taking into account the submissions received , to prepare : ( a ) A draft model format on reporting for consideration by the Intergovernmental Negotiating Committee at its seventh session ; ( b ) A report that reviews obligations , processes and formats for reporting under other multilateral environment agreements and the reporting obligations under the Stockholm Convention for consideration by the Committee at its seventh meeting , and for possible consideration by the Conference of the Parties at its first meeting following any further work on the report by the Committee . Decision INC-6/17 : Effectiveness evaluation The Intergovernmental Negotiating Committee Requests the secretariat to begin to address the environmental monitoring and evaluation needs as described in article 16 of the Stockholm Convention on Persistent Organic Pollutants for chemicals included in annexes A , B , and C of the Convention and in doing so to : Develop guidance on the nature of the effectiveness evaluation ; Identify the basic data needed to support the effectiveness evaluation ; Assess the capacity of existing monitoring programmes to make available necessary monitoring data and then begin making arrangements for the provision of comparable monitoring data for the effectiveness evaluation . This can be assisted by continuing the work initiated by UNEP Chemicals for the substances listed in annexes A , B , and C ; Identify where suitable monitoring data are not available ; Compile guidance for the collection of data and , subject to the availability of additional external funding , test the guidance by developing a pilot project in one or more regions ; Facilitate arrangements to obtain appropriate monitoring information on annexes A , B , and C substances for regions where such information would not otherwise be available , taking into consideration that cost effectiveness in other regional evaluations has been achieved by using a tiered approach ( e. g. one which centralizes the most advanced laboratory capacity at regional nodes ) ; Report on progress to the Intergovernmental Negotiating Committee at its seventh session . Decision INC-6/18 : Non-compliance The Intergovernmental Negotiating Committee Invites Governments and the secretariats of multilateral environmental agreements to provide the secretariat with their views on non-compliance addressed in article 17 of the Stockholm Convention on Persistent Organic Pollutants by 31 December 2002 ; Requests the secretariat to prepare and submit to the Intergovernmental Negotiating Committee at its seventh session : ( a ) A report that provides a compilation of views submitted pursuant to paragraph 1 and a synthesis of those views ; ( b ) A report on the existing non-compliance regimes under multilateral environmental agreements , taking into account a study on the subject prepared for the Intergovernmental Negotiating Committee for an International Legally Binding Instrument for the Application of the Prior Informed Consent Procedure for Certain Hazardous Chemicals and Pesticides in International Trade , in connection with the Rotterdam Convention . Decision INC-6/19 : Consideration of offers to host the permanent secretariat of the Stockholm Convention on Persistent Organic Pollutants The Intergovernmental Negotiating Committee Invites interested countries to provide to the secretariat , by 30 November 2002 , detailed information on the conditions and advantages attached to their offers to host the permanent secretariat of the Stockholm Convention on Persistent Organic Pollutants , with special focus on the items listed in the appendix to the present decision ; Requests the secretariat to compile the offers received and submit them to the Committee for consideration at its seventh session . Appendix to decision INC-6/19 Legal framework Privileges and immunities that would be conferred on the permanent secretariat and its staff members , as well as government representatives and other persons engaged in official business of the Convention . Legal framework for ensuring equal treatment of premises and staff of the United Nations and its specialized agencies . Rules , including any restrictions , applicable to the employment of dependants of staff members . Nature of the headquarters agreement ( e. g. , stand-alone agreement , incorporated into another existing agreement , etc. ) . Features of the office site and related financial issues Main features of the building to house the permanent secretariat , including office space and scope for its expansion , facilities for conferences and availability of general services ( security , maintenance , etc ) . Basis for placing the office facilities at the disposal of the permanent secretariat , such as : ( a ) Ownership by the permanent secretariat ( through donation or purchase ) ; ( b ) Ownership by the host Government without rent ; ( c ) Host Government ownership with rent , and amount of such rent . Responsibility for : ( a ) Major maintenance and repairs to the office facilities ; ( b ) Normal maintenance and repair ; ( c ) Utilities , including communication facilities . The extent to which the office facilities would be furnished and equipped by the host Government . Duration of the arrangements regarding office space . Local facilities and conditions Description of the following facilities and conditions : ( a ) Diplomatic representation in the host city ; ( b ) Presence of international organizations ; Determinants of synergies of chemicals-related multilateral environmental agreements and agencies in the proposed location ; Availability of international conference facilities and the conditions for their use ( free of charge , rental , etc. ) ; Access to qualified conference servicing staff , e. g. , interpreters , translators , editors and meeting coordinators familiar with United Nations conferences and practices ; International transport facilities ; Local transport facilities and their proximity to the office facilities at the disposal of the permanent secretariat ; Local availability of trained personnel for possible employment in the permanent secretariat , taking account of language and other skills ; Health facilities and access to them by staff members of the permanent secretariat ; Availability of suitable housing , including information on housing prices and vacancy rate and the proximity of this housing to the office facilities at the disposal of the permanent secretariat ; Availability of schools at all levels , including those providing classes in languages other than the local language ; Facilities for the transfer of funds to and from foreign countries for the permanent secretariat and its staff members ; The time needed for processing entry requirements and ability to ensure that participants in meetings organized by the permanent secretariat in the territory of the host Government are granted visa entry permits , where necessary , in expeditious manner . Other relevant information Any additional contributions to be made by the host Government to meet the operating costs of the permanent secretariat or to defray conference-servicing expenses . These contributions must be divided into contributions that : Are not earmarked ( i. e. are provided to the secretariat without any restricitions placed on their expenditure by the host country ) ; Are earmarked for certain purposes , together with an explanation of the nature of the restrictions . Information on potential synergies from cooperation and coordination with other international chemical management organizations in proposed locations . Any other information that the potential host country may deem relevant . Annex II The arbitration procedure for purposes of paragraph 2 ( a ) of aArticle 18 of the Stockholm Convention on Persistent Organic Pollutants shall be as follows . Article A Party may initiate recourse to arbitration in accordance with aArticle 18 of the Convention by written notification addressed to the other party to the dispute . The notification shall be accompanied by a statement of the claim , together with any supporting documents , and state the subject-matter of arbitration and include , in particular , the articles of the Convention , the interpretation or application of which are at issue . The claimant party shall notify the sSecretariat that the parties are referring a dispute to arbitration pursuant to aArticle 18. The notification shall be accompanied by the written notification of the claimant party , the statement of claim and the supporting documents referred to in paragraph 1 above . The sSecretariat shall forward the information thus received to all Parties . Article In disputes between two parties , an arbitral tribunal shall be established . It shall consist of three members . Each of the parties to the dispute shall appoint an arbitrator and the two arbitrators so appointed shall designate by common agreement the third arbitrator who shall be the President of the tribunal . The President of the tribunal shall not be a national of one of the parties to the dispute , nor have his or her usual place of residence in the territory of one of these parties , nor be employed by any of them , nor have dealt with the case in any other capacity . In disputes between more than two parties , parties in the same interest shall appoint one arbitrator jointly by agreement . Any vacancy shall be filled in the manner prescribed for the initial appointment . If the parties do not agree on the subject-matter of the dispute before the President of the arbitral tribunal is designated , the arbitral tribunal shall determine the subject-matter . Article If one of the parties to the dispute does not appoint an arbitrator within two months of the date on which the respondent party receives the notification of the arbitration , the other party may inform the Secretary-General of the United Nations who shall make the designation within a further two-month period . If the President of the arbitral tribunal has not been designated within two months of the date of the appointment of the second arbitrator , the Secretary-General of the United Nations shall , at the request of a party , designate the President within a further two-month period . Article The arbitral tribunal shall render its decisions in accordance with the provisions of the Convention and international law . Article Unless the parties to the dispute otherwise agree , the arbitral tribunal shall determine its own rules of procedure . Article The arbitral tribunal may , at the request of one of the parties , recommend essential interim measures of protection . Article The parties to the dispute shall facilitate the work of the arbitral tribunal and , in particular , using all means at their disposal , shall : ( a ) Provide it with all relevant documents , information and facilities ; and ( b ) Enable it , when necessary , to call witnesses or experts and receive their evidence . Article The parties and the arbitrators are under an obligation to protect the confidentiality of any information they receive in confidence during the proceedings of the arbitral tribunal . Article Unless the arbitral tribunal determines otherwise because of the particular circumstances of the case , the costs of the tribunal shall be borne by the parties to the dispute in equal shares . The tribunal shall keep a record of all its costs , and shall furnish a final statement thereof to the parties . Article A Party that has an interest of a legal nature in the subject-matter of the dispute which may be affected by the decision in the case , may intervene in the proceedings with the consent of the tribunal . Article The tribunal may hear and determine counterclaims arising directly out of the subject-matter of the dispute . Article Decisions both on procedure and substance of the arbitral tribunal shall be taken by a majority vote of its members . Article If one of the parties to the dispute does not appear before the arbitral tribunal or fails to defend its case , the other party may request the tribunal to continue the proceedings and to make its award . Absence of a party or a failure of a party to defend its case shall not constitute a bar to the proceedings . Before rendering its final decision , the arbitral tribunal must satisfy itself that the claim is well founded in fact and law . Article The tribunal shall render its final decision within five months of the date on which it is fully constituted unless it finds it necessary to extend the time-limit for a period which should not exceed five more months . Article The final decision of the arbitral tribunal shall be confined to the subject-matter of the dispute and shall state the reasons on which it is based . It shall contain the names of the members who have participated and the date of the final decision . Any member of the tribunal may attach a separate or dissenting opinion to the final decision . Article The award shall be binding on the parties to the dispute . It shall also be binding upon a Party intervening under aArticle 10 above insofar as it relates to matters in respect of which that Party intervened . It shall be without appeal unless the parties to the dispute have agreed in advance to an appellate procedure . Article Any controversy which may arise between those bound by the final decision in accordance with aArticle 16 above , as regards the interpretation or manner of implementation of that decision , may be submitted by any of them for decision to the arbitral tribunal which rendered it . The conciliation procedure for purposes of paragraph 6 of article 18 of the Stockholm Convention on Persistent Organic Pollutants shall be as follows . Article 1 A request by a party to a dispute to establish a conciliation commission in consequence of paragraph 6 of article 18 shall be addressed in writing to the secretariat . The secretariat shall forthwith inform all Parties to the Convention accordingly . The cConciliation cCommission shall , unless the parties otherwise agree , be composed of [ five][three ] members , [ two][one ] appointed by each party concerned and a President chosen jointly by those members . Article 2 In disputes between more than two parties , parties in the same interest shall appoint their members of the cCommission jointly by agreement . Article 3 If any appointments by the parties are not made within two months of the date of receipt by the secretariat of the written request referred to in article 1 , the Secretary-General of the United Nations shall , upon request by a party , make those appointments within a further two-month period . Article 4 If the President of the cConciliation cCommission has not been chosen within two months of the fourth member of the cCommission being appointed , the Secretary-General of the United Nations shall , upon request by a party , designate the President within a further two-month period . Article 5 The cConciliation cCommission shall , unless the parties to the dispute otherwise agree , determine its own rules of procedure . The parties and members of the cCommission have are under an obligation to protect the confidentiality of any information they receive in confidence during the proceedings of the commission . Article 6 The cConciliation cCommission shall take its decisions by a majority vote of its members . Article 7 The cConciliation cCommission shall render a report with recommendations for resolution of the dispute within twelve months of being established , which the parties shall consider in good faith . Article 8 Any disagreement as to whether the cConciliation cCommission has competence to consider a matter referred to it shall be decided by the cCommission . Article 9 The costs of the cCommission shall be borne by the parties to the dispute in shares agreed by them . The cCommission shall keep the record of all its costs and shall furnish a final statement thereof to the parties . Annex III Scope Rule 1 The present rules of procedure shall apply to any meeting of the Conference of the Parties to the Convention convened in accordance with article 19 of the Convention . Definitions Rule 2 For the purposes of the present rules : ( a ) " Convention " means the Stockholm Convention on Persistent Organic Pollutants , adopted at Stockholm , on 22 May 2001 ; ( b ) " Party " means a Party as defined in article 2 ( a ) of the Convention ; ( c ) " Conference of the Parties " means the Conference of the Parties established by article 19 of the Convention ; ( d ) " Meeting " means any ordinary or extraordinary meeting of the Conference of the Parties convened in accordance with article 19 of the Convention ; ( e ) " Regional economic integration organization " means an organization as defined in article 2 ( b ) of the Convention ; ( f ) " President " means the President of the Conference of the Parties elected in accordance with rule 22 , paragraph 1 ; ( g ) " Secretariat " means the secretariat established by article 20 , paragraph 1 of the Convention . ( h ) " Subsidiary body " means the body established pursuant to article 19 , paragraph 6 of the Convention , as well as any body established pursuant to article 19 , paragraph 5 ( a ) of the Convention . ( i ) " Parties present and voting " means Parties present at the meeting in which voting takes place and casting an affirmative or negative vote . Parties abstaining from voting shall be considered as not voting . Place of meetings Rule 3 The meetings of the Conference of the Parties shall take place at the seat of the secretariat , unless the Conference of the Parties decides otherwise or other appropriate arrangements are made by the secretariat in consultation with the Parties . Dates of meetings Rule 4 Unless otherwise decided by the Conference of the Parties , the second and third ordinary meetings of the Conference of the Parties shall be held yearly and , thereafter , ordinary meetings shall be held every two years . At each ordinary meeting , the Conference of the Parties shall decide on the date and duration of the next ordinary meeting . The Conference of the Parties should endeavour not to hold such meetings at a time that would make the attendance of a significant number of delegations difficult . Extraordinary meetings of the Conference of the Parties shall be held at such times as may be decided either by the Conference of the Parties at an ordinary meeting or at the written request of any Party , provided that , within ninety days of the request being communicated to the Parties by the secretariat , it is supported by at least one third of the Parties . In the case of an extraordinary meeting held at the written request of a Party , it shall be held not more than ninety days after the date on which the request is supported by at least one third of the Parties in accordance with paragraph 3. Notification of meetings Rule 5 The secretariat shall notify all Parties of the dates and venue of ordinary and extraordinary meetings at least sixty days before the meeting in question is due to commence . Participation of United Nations , specialized agencies and non-Parties Rule 6 The United Nations , its specialized agencies , the International Atomic Energy Agency , as well as any State not Party to the Convention , as well as entities operating the mechanism referred to in paragraph 6 of article 13 of the Convention , may be represented at meetings as observers . [ At least 30 days before the meeting the secretariat shall notify the Parties of those who have indicated they will be so represented . ] Such observers may , upon invitation of the President , participate in the proceedings of any meeting without the right to vote , unless at least one third of the Parties present at the meeting object . Participation of other bodies or agencies Rule 7 Any body or agency , whether national or international , governmental or non-governmental , which is qualified in matters covered by the Convention and which has informed the secretariat of its wish to be represented at a meeting as an observer may be so admitted . [ At least 30 days before the meeting the secretariat shall notify the Parties of those who have indicated they will be so represented . Those bodies or agencies should be entitled as observers unless at least one third of the parties present at the meeting object . ] Such observers may , upon invitation of the President , participate without the right to vote in the proceedings of any meeting in matters of direct concern to the body or agency they represent , unless at least one third of the Parties present at the meeting object . Notification by secretariat Rule 8 The secretariat shall notify those entitled to be observers and those which have informed the secretariat of their wish to be represented , pursuant to rules 6 and 7 , of the dates and venue of the next meeting . Preparation of provisional agenda Rule 9 In agreement with the President , the secretariat shall prepare the provisional agenda for each meeting . Items on provisional agenda for ordinary meeting Rule 10 The provisional agenda for each ordinary meeting shall include , as appropriate : Items arising from the articles of the Convention , including those specified in its article 19 ; Items the inclusion of which has been decided at a previous meeting ; Items referred to in rule 16 ; The proposed budget as well as all questions pertaining to the accounts and financial arrangements ; Any item proposed by a Party and received by the secretariat before the provisional agenda is circulated . Distribution of provisional agenda Rule 11 For each ordinary meeting , the provisional agenda , together with supporting documents , shall be distributed in the official languages by the secretariat to the Parties at least six weeks before the opening of the meeting . Supplementary items Rule 12 The secretariat shall , in agreement with the President , include any item that is proposed by a Party and has been received by the secretariat after the provisional agenda for an ordinary meeting has been produced , but before the opening of the meeting , in a supplementary provisional agenda . Addition , deletion , deferment or amendment of items Rule 13 When adopting the agenda for an ordinary meeting , the Conference of the Parties may decide to add , delete , defer or amend items . Only items that are considered by the Conference of the Parties to be urgent and important may be added to the agenda . Agenda for extraordinary meeting Rule 14 The agenda for an extraordinary meeting shall consist only of those items proposed for consideration by the Conference of the Parties at an ordinary meeting or in the request for the holding of the extraordinary meeting . It shall be distributed to the Parties at the same time as the notification of the extraordinary meeting . Report on administrative and budgetary implications Rule 15 The secretariat shall report to the Conference of the Parties on the administrative and budgetary implications of all substantive agenda items submitted to the meeting , before they are considered by it . Unless the Conference of the Parties decides otherwise , no such substantive agenda item shall be considered until at least forty-eight hours after the Conference of the Parties has received a report of the secretariat on its administrative and budgetary implications . Incomplete consideration of item Rule 16 Any item of the agenda of an ordinary meeting , consideration of which has not been completed at the meeting , shall be included automatically in the provisional agenda of the next ordinary meeting , unless otherwise decided by the Conference of the Parties . Composition of delegation Rule 17 Each Party participating in a meeting shall be represented by a delegation consisting of a head of delegation and such other accredited representatives , alternate representatives and advisers as it may require . Alternates and advisers Rule 18 An alternate representative or an adviser may act as a representative upon designation by the head of delegation . Submission of credentials Rule 19 The credentials of representatives as well as the names of alternate representatives and advisers shall be submitted to the secretariat if possible not later than twenty-four hours after the opening of the meeting . Any later change in the composition of the delegation shall also be submitted to the secretariat . The credentials shall be issued either by the Head of State or Government or by the Minister of Foreign Affairs or , in the case of a regional economic integration organization , by the competent authority of that organization . Examination of credentials Rule 20 The Bureau of any meeting shall examine the credentials and submit its report to the Conference of the Parties . Provisional participation Rule 21 Representatives shall be entitled to participate provisionally in the meeting , pending a decision by the Conference of the Parties to accept their credentials . Election of officers Rule 22 At the first ordinary meeting of the Conference of the Parties , a President and [ nine][four ] Vice-Presidents , one of whom shall act as Rapporteur , shall be elected from among the representatives of the Parties present at the meeting . These officers shall serve as the Bureau of the Conference of the Parties . Each of the five United Nations regional groups shall be represented by [ one ] [ two ] Bureau member[s ] . The Bureau shall remain in office until the closure of the second ordinary meeting of the Conference of the Parties , including for any intervening extraordinary meeting . At the second and subsequent ordinary meetings of the Conference of the Parties , the election of officers from among the Parties to serve as the Bureau for the following meeting of the Conference of the Parties shall take place before the end of the meeting . These officers shall commence their term of office at the closure of the meeting and shall serve until the closure of the following ordinary meeting of the Conference of the Parties , including for any intervening extraordinary meeting . The offices of the President and Rapporteur shall normally be subject to rotation among the United Nations regional groups . No elected officer may serve on the Bureau for more than two consecutive terms . The President shall participate in meetings of the Conference of the Parties in that capacity and shall not at the same time exercise the rights of a representative of a Party . The Party concerned shall designate another representative who shall be entitled to represent the Party in the meetings and to exercise the right to vote . The Chairpersons of the Persistent Organic Pollutants Review Committee and any other subsidiary bodies shall be members ex-officio of the Bureau . General powers of the President Rule 23 In addition to exercising the powers conferred upon the President elsewhere by the present rules , the President shall declare the opening and closing of the meeting , preside at the meetings , ensure the observance of the present rules , accord the right to speak , put questions to the vote and announce decisions . The President shall rule on points of order and , subject to the present rules , shall have complete control of the proceedings and over the maintenance of order thereat . The President may propose to the Conference of the Parties the closure of the list of speakers , a limitation on the time to be allowed to speakers and on the number of times each representative may speak on a question , the adjournment or the closure of the debate and the suspension or the adjournment of a session . The President , in the exercise of the functions of that office , remains under the authority of the Conference of the Parties . Acting President Rule 24 The President , if temporarily absent from a meeting or any part thereof , shall designate a Vice-President to act as President . The President so designated shall not at the same time exercise the rights of a representative of a Party . A Vice-President acting as President shall have the powers and duties of the President . Replacement of an officer Rule 25 If an officer of the Bureau resigns or is otherwise unable to complete the assigned term of office or to perform the functions of that office , a representative of the same Party shall be named by the Party concerned to replace the said officer for the remainder of that officer 's term . Application of rules to subsidiary bodies Rule Save as provided in rules 28 to 34 , the present rules shall apply , mutatis mutandis , to the proceedings of any subsidiary bodies , subject to any modifications decided by the Conference of the Parties . Establishment of subsidiary bodies Rule 27 The Conference of the Parties may establish , in accordance with article 19 , paragraph 5 ( a ) of the Convention , such subsidiary bodies , as it considers necessary for the implementation of the Convention , in addition to the subsidiary body established under article 19 , paragraph 6. Meetings of subsidiary bodies shall be held in public unless the Conference of the Parties or the subsidiary body concerned decides otherwise . Quorum for non open-ended subsidiary bodies Rule 28 In the case of a subsidiary body that is not open-ended , a simple majority of the Parties designated by the Conference of the Parties to participate therein shall constitute a quorum . Dates of meetings Rule 29 The Conference of the Parties shall decide on the dates of the meetings of the subsidiary bodies , taking note of any proposals to hold such meetings in conjunction with the meetings of the Conference of the Parties . Election of officers for subsidiary bodies Rule 30 The Chairperson of the Persistent Organic Pollutants Review Committee shall be elected by the Conference of the Parties . Unless the Conference of the Parties decides otherwise , the Chairperson of any other subsidiary body shall be elected by the Conference of the Parties . Each subsidiary body shall elect its own officers other than the Chairperson . The officers of such subsidiary bodies shall be elected with due regard to the principle of equitable geographical representation and shall not serve for more than two consecutive terms . [ Voting in subsidiary bodies Rule 31 With respect to decisions taken by a subsidiary body , the Chairperson of that subsidiary body may exercise the right to vote . ] Matters for consideration Rule 32 Subject to article 19 , paragraph 6 ( b ) , of the Convention , the Conference of the Parties shall determine the matters to be considered by each subsidiary body and the President may , upon the request of the Chair of the subsidiary body concerned , adjust the allocation of work . Duties of the head of the secretariat Rule 33 The head of the secretariat , or the representative of the head of the secretariat , shall exercise the functions of that office in all meetings of the Conference of the Parties and of its subsidiary bodies . The head of the secretariat shall arrange for the provision of staff and services required by the Conference of the Parties and its subsidiary bodies , within available resources . The head of the secretariat shall manage and direct such staff and services and provide appropriate support and advice to the Bureau of the Conference of the Parties and its subsidiary bodies . Functions of the secretariat Rule 34 In addition to the functions specified in the Convention , in particular in article 20 , the secretariat shall , in accordance with the present rules : ( a ) Arrange for interpretation at the meeting ; ( b ) Collect , translate , reproduce and distribute the documents of the meeting ; ( c ) Publish and distribute the official documents of the meeting ; ( d ) Make and arrange for keeping of sound recordings of the meeting ; and ( e ) Arrange for the custody and preservation of the documents of the meeting . Sessions Rule 35 Sessions of the Conference of the Parties shall be held in public , unless the Conference of the Parties decides otherwise . Quorum Rule 36 The President shall not declare a session of the meeting of the Conference of the Parties open or permit the debate to proceed unless at least one third of the Parties to the Convention are present . The presence of two thirds of the Parties to the Convention shall be required for any decision to be taken . For the purposes of determining a quorum for a decision to be taken on a matter within the competence of a regional economic integration organization , that organization shall be counted to the extent of the number of votes it is entitled to cast in accordance with paragraph 2 of article 23 of the Convention . Procedures for speaking Rule 37 No one may address a meeting without having previously obtained the permission of the President . Subject to rules 38 , 39 , 40 and 42 , the President shall call upon speakers in the order in which they signify their desire to speak . The secretariat shall maintain a list of speakers . The President may call a speaker to order if the speaker 's remarks are not relevant to the subject under discussion . The Conference of the Parties may , on a proposal from the President or from any Party , limit the time allowed to each speaker and the number of times each representative may speak on a question . Before a decision is taken , two representatives may speak in favour of and two against a proposal to set such limits . When the debate is limited and a speaker exceeds the allotted time , the President shall call the speaker to order without delay . Precedence Rule 38 The Chairperson or Rapporteur of a subsidiary body may be accorded precedence for the purpose of explaining the conclusions arrived at by that subsidiary body . Points of order Rule 39 During the discussion of any matter , a representative may at any time raise a point of order , on which the President shall immediately rule in accordance with the present rules . A representative may appeal against the ruling of the President . The appeal shall be put to the vote immediately and the ruling shall stand unless overruled by a majority of the Parties present and voting . A representative may not , in raising a point of order , speak on the substance of the matter under discussion . Decisions on competence Rule 40 Any motion calling for a decision on the competence of the Conference of the Parties to discuss any matter or to adopt a proposal or an amendment to a proposal submitted to it shall be put to the vote before the matter is discussed or a vote taken on the proposal or amendment in question . Proposals and amendments to proposals Rule 41 Proposals and amendments to proposals shall normally be introduced in writing , in one of the official languages , by the Parties and handed to the secretariat , which shall circulate copies to delegations . As a general rule , no proposal or amendment to proposal shall be discussed or put to the vote at any session unless copies of it have been circulated to delegations not later than the day preceding that session . The President may , however , permit the discussion and consideration of proposals , of amendments to proposals or of procedural motions even though such proposals , amendments to proposals or motions have not been circulated or have been circulated only the same day . Order of procedural motions Rule 42 Subject to rule 39 , the following motions shall have precedence in the order indicated below over all other proposals or motions : ( a ) To suspend the meeting ; ( b ) To adjourn the meeting ; ( c ) To adjourn the debate on the question under discussion ; ( d ) To close the debate on the question under discussion . Permission to speak on a motion falling within paragraph 1 ( a ) to ( d ) shall be granted only to the proposer and , in addition , to one speaker in favour of and two against the motion , after which it shall be put immediately to the vote . Withdrawal of proposals or motions Rule 43 A proposal or motion may be withdrawn by its proposer at any time before voting on it has begun , provided that the proposal or motion has not been amended . A proposal or motion thus withdrawn may be reintroduced by any other Party . Reconsideration of proposals Rule 44 When a proposal has been adopted or rejected , it may not be reconsidered at the same meeting , unless the Conference of the Parties , by a two-thirds majority of the Parties present and voting , so decides . Permission to speak on a motion to reconsider shall be accorded only to the mover , to one speaker in favour of and two against the proposal , after which it shall be put immediately to the vote . Right to vote Rule 45 Each Party shall have one vote , except as provided for in paragraph 2. A regional economic integration organization , on matters within its competence , shall exercise its right to vote with a number of votes equal to the number of its member States that are Parties to the Convention . Such an organization shall not exercise its right to vote if any of its member States exercises its right to vote , and vice versa . Majority required Rule 46 [ 1. The Parties shall make every effort to reach agreement on all matters of substance by consensus . If all efforts to reach consensus have been exhausted and no agreement has been reached , the decision shall , as a last resort , be taken by a two-thirds majority vote of the Parties present and voting , ] unless otherwise provided by the Convention , by the financial rules referred to in Article 19 , paragraph 4 of the Convention or by the present rules of procedure . ] Decisions of the Conference of the Parties on matters of procedure shall be taken by a majority vote of the Parties present and voting . [ 3. If the question arises whether a matter is one of procedural or substantive nature , the President shall rule on the question . An appeal against this ruling shall be put to the vote immediately and the President 's ruling shall stand unless overruled by a majority of the Parties present and voting . ] If on matters other than elections a vote is equally divided , a second vote shall be taken . If this vote is also equally divided , the proposal shall be regarded as rejected . Order of voting on proposals Rule 47 If two or more proposals relate to the same question , the Conference of the Parties , unless it decides otherwise , shall vote on the proposals in the order in which they have been submitted . The Conference of the Parties may , after each vote on a proposal , decide whether to vote on the next proposal . Division of proposals and amendments Rule 48 Any representative may request that any part of a proposal or of an amendment to a proposal be voted on separately . The President shall allow the request unless a Party objects . If an objection is made to the request for division , the President shall permit two representatives to speak , one in favour of and the other against the request , after which it shall be put immediately to the vote . The President may limit the time allowed to each speaker . If the request referred to in paragraph 1 is allowed or adopted , those parts of a proposal or of an amendment to a proposal that are approved shall then be put to vote as a whole . If all operative parts of a proposal or amendment have been rejected , the proposal or amendment shall be considered to have been rejected as a whole . Amendment to a proposal Rule 49 A motion is considered to be an amendment to a proposal if it merely adds to , deletes from , or revises parts of that proposal . An amendment shall be voted on before the proposal to which it relates is put to the vote , and if the amendment is adopted , the amended proposal shall then be voted on . Order of voting on amendments to a proposal Rule 50 If two or more amendments to a proposal are moved , the Conference of the Parties shall first vote on the amendment furthest removed in substance from the original proposal , then on the next amendment furthest removed therefrom , and so on , until all amendments have been put to the vote . The President shall determine the order of voting on the amendments under this rule . Method of voting for general matters Rule 51 Voting , except for elections , shall normally be by show of hands . A roll call vote shall be taken if so requested by any Party . The roll call shall be taken in the English alphabetical order of the names of the Parties , beginning with the Party whose name is drawn by lot by the President . If at any time , however , a Party requests a secret ballot , that shall be the method of voting on the issue in question . When the Conference of the Parties votes by mechanical means , a non-recorded vote shall replace a vote by show of hands and a recorded vote shall replace a roll call . The vote of each Party participating in a roll call or recorded vote shall be included in the relevant documents of the meeting . Conduct during voting Rule 52 After the President has announced the beginning of voting , no representative shall interrupt the voting except on a point of order in connection with the actual conduct of the voting . The President may permit the Parties to explain their votes , either before or after the voting . The President may limit the time to be allowed for such explanations . The President shall not permit the proposer of a proposal or of an amendment to a proposal to explain his/her vote on his/her own proposal or amendment , except if it has been amended . Method of voting for elections Rule 53 All elections shall be held by secret ballot , unless otherwise decided by the Conference of the Parties . Absence of majority Rule 54 If , when one person or one delegation is to be elected , no candidate obtains in the first ballot a majority of the votes cast by the Parties present and voting , a second ballot restricted to the two candidates obtaining the largest number of votes shall be taken . If in the second ballot the votes are equally divided , the President shall decide between the candidates by drawing lots . In the case of a tie in the first ballot among three or more candidates obtaining the largest number of votes , a second ballot shall be held . If a tie results among more than two candidates , the number shall be reduced to two by lot and the balloting , restricted to them , shall continue in accordance with the procedure set forth in paragraph 1. Election to two or more elective places Rule 55 When two or more elective places are to be filled at one time under the same conditions , those candidates , not exceeding the number of such places , obtaining in the first ballot the largest number of votes and a majority of the votes cast by the Parties present and voting shall be deemed elected . If the number of candidates obtaining such majority is less than the number of persons or delegations to be elected , there shall be additional ballots to fill the remaining places , the voting being restricted to the candidates obtaining the greatest number of votes in the previous ballot , to a number not more than twice the places remaining to be filled , provided that , after the third inconclusive ballot , votes may be cast for any eligible person or delegation . If three such unrestricted ballots are inconclusive , the next three ballots shall be restricted to the candidates who obtained the greatest number of votes in the third of the unrestricted ballots , to a number not more than twice the places remaining to be filled , and the following three ballots thereafter shall be unrestricted , and so on until all the places have been filled . Official languages Rule 56 The official languages of the Conference of the Parties shall be Arabic , Chinese , English , French , Russian and Spanish . Interpretation Rule 57 Statements made in an official language shall be interpreted into the other official languages . A representative of a Party may speak in a language other than an official language if the Party provides for interpretation into one such official language . Languages of official documents Rule 58 Official documents of the meetings shall be drawn up in one of the official languages and translated into the other official languages . Sound recordings of meetings Rule 59 Sound recordings of the meetings of the Conference of the Parties , and whenever possible of the subsidiary bodies , shall be kept by the secretariats , consistent with the practice of the United Nations . Rule 60 The present rules of procedure may be amended by consensus by the Conference of the Parties . Precedence of Convention Rule 61 In the event of any conflict between any provision of the present rules and any provision of the Convention , the Convention shall prevail . Annex IV STOCKHOLM CONVENTION ON PERSISTENT ORGANIC POLLUTANTS , Rule Scope The present rules shall govern the financial administration of the Conference of the Parties to the Stockholm Convention on Persistent Organic Pollutants , its subsidiary bodies and the Convention secretariat . In respect of matters not specifically provided for by the present rules , the Financial Regulations and Rules of the United Nations shall apply . Financial period Rule The financial period shall be a biennium , of which the first calendar year shall be an even-numbered year . Budget Rule The head of the Convention secretariat shall prepare the budget estimates for the following biennium in United States dollars showing projected income and expenditures for each year of the biennium concerned . The head of the Convention secretariat shall dispatch the estimates [ , as well as the actual income and expenditure for each year of the previous biennium , ] to all Parties to the Convention at least ninety days before the opening of the meeting of the Conference of the Parties at which the budget is to be adopted . The Conference of the Parties shall , prior to the commencement of the financial period that the budget covers , consider the budget estimates and adopt a budget by consensus authorizing expenditures , other than those referred to in paragraphs 9 and 10. Adoption of the budget by the Conference of the Parties shall constitute authority to the head of the Convention secretariat to incur obligations and make payments for the purposes for which the appropriations were approved and up to the amounts so approved , provided always that , unless specifically authorized by the Conference of the Parties , commitments shall be covered by related income . The head of the Convention secretariat may make transfers within each of the main appropriation lines of the approved budget . The head of the Convention secretariat may also make transfers between such appropriation lines up to limits that the Conference of the Parties may set . Funds Rule A General Trust Fund for the Convention shall be established by the Executive Director of the United Nations Environment Programme and managed by the head of the Convention secretariat . Contributions made pursuant to paragraph 12 ( a ) , ( b ) and ( c ) , with the exception of the earmarked funds referred to in paragraph 9 , shall be credited to this fund . All budget expenditures that are made pursuant to paragraph 5 shall be charged to the General Trust Fund . Within the General Trust Fund there shall be maintained a working capital reserve at a level to be determined from time to time by the Conference of the Parties by consensus . The purpose of the working capital reserve shall be to ensure continuity of operations in the event of a temporary shortfall of cash . Drawdowns from the working capital reserve shall be restored from contributions as soon as possible . A Special Trust Fund shall be established by the Executive Director of the United Nations Environment Programme and managed by the head of the Convention secretariat . This fund shall receive contributions pursuant to paragraphs 12 ( b ) and ( c ) that have been earmarked to support the participation of representatives of developing countries and countries with economies in transition in meetings of the Conference of the Parties and its subsidiary bodies . Subject to the approval of the Conference of the Parties , the Executive Director of the United Nations Environment Programme may establish other trust funds , provided that they are consistent with the objective of the Convention . In the event that the Conference of the Parties decides to terminate a trust fund established pursuant to the present rules , it shall so advise the Executive Director of the United Nations Environment Programme at least six months before the date of termination so decided . The Conference of the Parties shall decide , in consultation with the Executive Director of the United Nations Environment Programme , on the distribution of any uncommitted balances after all liquidation expenses have been met . Contributions Rule The resources of the Conference of the Parties shall comprise : [ ( a ) Contributions made each year by Parties on the basis of an indicative scale adopted by consensus by the Conference of the Parties[ , and based on such a scale of assessments of the United Nations as may be adopted from time to time by the General Assembly , ] adjusted so as to ensure that no Party contributes less than [ 0.001 ] [ 0.01 ] per cent of the total , that no one contribution exceeds per cent of the total and that no contribution from a least developed country Party exceeds [ 0.01 ] per cent of the total ; ] ( b ) Contributions made by Parties in addition to those made pursuant to paragraph ( a ) , including those made by the Government hosting the Convention Secretariat ; ( c ) Contributions from States not Parties to the Convention , as well as governmental , intergovernmental and non-governmental organizations , and other sources ; ( d ) The uncommitted balance of appropriations from previous financial periods ; ( e ) Miscellaneous income . The Conference of the Parties shall , in adopting the indicative scale of contributions referred to in paragraph 12 ( a ) , make adjustments to take account of contributions of Parties that are not members of the United Nations , as well as those of regional economic integration organizations that are Parties . In respect of contributions made pursuant to paragraph 12 ( a ) : ( a ) Contributions for each calendar year are [ due][expected ] on 1 January of that year ; ( b ) Each Party shall , as far in advance as possible of the date due for the contribution , inform the head of the Convention secretariat of the contribution it intends to make and of the projected timing of that contribution . Contributions made pursuant to paragraph 12 ( b ) and ( c ) shall be used in accordance with such terms and conditions , consistent with the objectives of the Convention and the Financial Regulations and Rules of the United Nations , as may be agreed between the head of the Convention Secretariat and the contributor . Contributions made pursuant to paragraph 12 ( a ) from States and regional economic integration organizations that become Parties to the Convention after the beginning of a financial period shall be made pro rata temporis for the balance of that financial period . Consequent adjustments shall be made at the end of each financial period for other Parties . All contributions shall be paid in United States dollars or the equivalent in a convertible currency . They shall be paid into a bank account to be designated by the Executive Director of the United Nations Environment Programme in consultation with the head of the Convention secretariat . [ In conversion into United States dollars , the United Nations operational rate of exchange shall be used . ] The head of the Convention secretariat shall acknowledge promptly the receipt of all pledges and contributions and shall inform the Parties , [ once ] [ twice ] a year , of the status of pledges and payments of contributions . Contributions not immediately required shall be invested at the discretion of the Executive Director of the United Nations Environment Programme , in consultation with the head of the Convention secretariat . The resulting income shall be credited to the related Convention trust fund . Accounts and audit Rule The accounts and financial management of all funds governed by the present rules shall be subject to the internal and external audit process of the United Nations . An interim statement of accounts for the first year of the financial period shall be provided to the Conference of the Parties during the second year of the period , and a final audited statement of accounts for the full financial period shall be provided to the Conference of the Parties as soon as possible after the accounts for the financial period are closed . Administrative support costs Rule [ 22. The Conference of the Parties shall reimburse the United Nations Environment Programme for the services provided to the Conference of the Parties [ , ][and ] its subsidiary bodies [ and the Convention secretariat ] from the funds referred to in paragraphs 7 , 9 and 10 under such terms as may from time to time be agreed upon between the Conference of the Parties and the United Nations Environment Programme or , in the absence of such agreement , in accordance with the general policy of the United Nations . ] Amendments Rule Any amendment to the present rules shall be adopted by the Conference of the Parties by consensus . Annex V REPORT OF CONTACT GROUP ON ARTICLE 19 , PARAGRAPH 6 : ESTABLISHMENT OF A SUBSIDIARY BODY TO REVIEW CANDIDATE POPS Co-chairs : Ms. Fatoumata Jallow Ndoye ( The Gambia ) Mr. Reiner Arndt ( Federal Republic of Germany ) Participants : More than 40 participants from all United Nations regions including intergovernmental organizations and non-governmental organizations The following issues were discussed : A Task of the Committee The Conference of the Parties shall at its first meeting , establish a subsidiary body to be called the Persistent Organic Pollutants Review Committee ( POPRC ) for the purposes of performing the functions assigned to that Committee by this Convention . The tasks of the Committee are outlined in article 8. In brief , the Committee will examine information submitted by a Party in support of a proposal for listing of a chemical in annexes A , B or C. The outcome of the screening evaluation will be communicated to all Parties and observers for comments and input of additional information . A draft risk profile will then be prepared and addressed by the Committee , which will also request further information on socio-economic factors from Parties and observers . The Committee will subsequently discuss options for measures and prepare a draft report for the Conference of the Parties including recommendations for listing . In conclusion the process can be described as a scientific evaluation followed by a risk management evaluation . B Selection of Committee members and invited experts Expertise The expertise will be provided as laid out in article 19 , paragraph 6 ( a ) , by experts in chemicals assessment or management . It was agreed that procedures for designation should be sufficiently flexible to allow participation of government-designated experts with different types of expertise . To ascertain the qualifications of the experts , relevant curriculum vitae should be provided by Governments and be accessible to the Conference of the Parties . Some members considered that it was clear from the annexes that this involves among other disciplines experts from health and environment areas and that it is important that the different types of expertise needed for the Committee are balanced . It was agreed , however , that guidance given to Governments should not be too prescriptive . Length of term It was agreed that four years would be a reasonable minimum term . It was considered necessary to develop a flexible system that would ensure continuity as well as sufficient turnover , bearing in mind equitable geographical distribution , and a strategy of overlapping terms was suggested . Conflict of interest The PIC model ( Decision INC-8/1 ) was acknowledged as a good starting point on how to resolve the conflict of interest issue for Pollutant Organic Pollutants Review Committee members . Invited experts to the Committee and the role of such experts It was agreed that the Committee would need to invite external experts to support it in its work . Criteria would need to be set for the selection of such experts . A pool or roster of external experts might be established by inviting Governments to designate experts , e. g. for areas of expertise or specific substance knowledge . The Committee would normally invite experts from this pool/roster . Consideration should be given to developing processes by which such a pool could be created . Costs of travel and other costs related to participation would be expected to be covered for invited experts from developing countries and countries with economies in transition according to normal United Nations practice . In addition , if specific expertise is not available for a certain issue from this pool , POPRC could identify other non-government-designated experts as necessary . The way of funding their participation needs to be addressed . Committee members might bring additional experts to the meeting , as appropriate . Conflict of interest issues for experts invited by POPRC would be evaluated and decided by POPRC , while those of the POPRC members would be evaluated and decided by the Conference of the Parties . Some experts could come from industry and other non-governmental organizations . In such a case , it would be important for POPRC to identify through conflict of interest procedures where the potential conflict of interest lies in order to decide on their participation . Composition and size of the Persistent Organic Pollutants Review Committee Composition and regional balance It was agreed that the number of POPRC members should be approximately 30 to 40. It was suggested by several countries that the Convention should follow the five United Nations regions in achieving equitable geographical distribution and that seven members per region might be a starting point for discussion . Other members could not agree on this point . It was agreed that the question of what is meant by “ equitable geographical distribution ” should be put to the UNEP legal counsel/legal drafting group . Some members suggested that concepts used in other instruments , e. g. , the Montreal Protocol should also be studied . Nominations At the first meeting of the Conference of the Parties , the Parties will establish the Persistent Organic Pollutants Review Committee pursuant to article 19 , paragraph 6. This means that Governments need to be prepared to designate experts for POPRC at the first meeting of the Conference of the Parties . This implies the need for a timely start of preparations on a process that would encompass and address this issue . Replacements This would have to be looked at in the context of how experts are designated by Governments for POPRC . Frequency of meetings Due to the technical nature of work to be accomplished it was agreed that POPRC should normally meet once a year , subject to availability of funds and work requirements . The meetings should take place between meetings of the Conference of the Parties and be scheduled so that proposals for listing chemicals could go forward to the following Conference of the Parties . D Operational guidelines Ad hoc and intersessional groups It was agreed to have operational procedures that facilitate establishment of ad hoc working groups , such as chemical specific groups during meetings , and also to work intersessionally to support the expeditious work of the Committee . These groups should be chaired by at least one of the Committee members but they could consist of POPRC members as well as experts selected by the Committee . Formal subcommittees should be avoided . Transparency of procedures The Convention provides for transparency at all stages of the process for adding candidate POPs as described in article 8. It was agreed that the reports from POPRC should be publicly available and easily accessible . Any recommendation from the Committee should provide the reasons for the decision , as well as dissenting views . The decisions and meeting reports would be available as the Conference of the Parties meeting documents in all six United Nations languages . Observers The Committee should be open to observers and Parties that are not members of the Committee . The role of observers will be addressed in the rules of procedure for the Conference of the Parties and is also described under article 8. It was noted that one of the major roles of observers was to increase transparency and provide additional information . It was agreed that the Party which submits a proposal for listing a chemical should be invited as an observer to POPRC meetings . Work plan with time frames It was agreed that the Committee should work in an efficient and timely manner and would also need to set priorities on substances in case of a large workload . For each chemical under consideration a work plan with time frames would be needed for its work . Such work plans would need to be flexible , determined by the workload and by the need to acquire information from all stakeholders and should be submitted to the Conference of the Parties . Preparations of meetings The Convention states that the Committee shall prepare the risk profiles and risk management evaluation for its meetings . In practice this usually means that members of the Committee would lead the preparation of these documents , drawing upon existing peer reviewed material in the first instance . The group encouraged nominating Party or Parties to speed up the process by submitting a proposal for listing of a chemical together with a draft risk profile and a draft risk management proposal . This could substantially facilitate the work of the Committee . Recommendations and reports to the Conference of the Parties The Committee could make recommendations to the Conference of the Parties on its functioning and operational procedures . Recommendations to list chemicals in annexes A , B or C are sent to the Conference of the Parties . Confidentiality of data It was agreed that if the Committee received confidential information it should ensure that article 9 , paragraph 5 was respected . It was agreed that confidentiality arrangements should be codified by POPRC as a matter of priority . E Rules Status of the Chair and Bureau It was suggested that due to the expected workload , besides the Chair , a co-Chair for POPRC might also be elected . Alternatively , vice-chairs may be used . The Conference of the Parties should be given enough flexibility to decide . This might be raised with the legal drafting group when it addresses the draft rules of procedure of the Conference of the Parties . Rules of procedure of the Conference of the Parties concerning subsidiary bodies It was agreed that some of the rules of procedure of the Conference of the Parties might not be applicable to POPRC . The working language for POPRC and its working groups as well as for the documentation for the meetings should be English only , but the outcome of the meetings should be available in all United Nations languages . Concerning rule 11 in the draft rules of procedure of the Conference of the Parties , it was suggested that six weeks would be insufficient for the distribution of some very technical and complicated documents to POPRC and that three months would be more appropriate . It was agreed , however , that this should be left to POPRC to decide as part of its operational guidelines . F Budget Support for members of the Persistent Organic Pollutants Review Committee from developing countries and countries with economies in transition It was agreed that financial support , i. e. , travel and daily subsistence allowance , to members of POPRC from developing countries and countries with economies in transition should be made available for participation in POPRC meetings . Budgeting and costs for various parts of the work The issue of total costs for the functioning of POPRC was raised . The cost of a workshop-like meeting with 40 participants ( about 30 being paid for ) for one week would amount to approximately $100,000-150,000 depending on the amount of preparation made outside the secretariat . Annex VI Budget for 2003 and indicative budget for 2004 ( in US$ ) Table 1 Additional information : Budget breakdown by work area Annex VII An Expert Group on best available techniques/best available practices ( BAT/BEP ) is hereby established by the Intergovernmental Negotiating Committee of the Stockholm Convention on Persistent Organic Pollutants to develop guidelines on best available techniques and to develop provisional guidance on best environmental practices relevant to the provisions of article 5 of the Convention , for consideration by the Conference of the Parties upon entry into force of the Convention . The guidelines and guidance to be developed should be practical and general in nature but with reference to more detailed and specialized technical information to achieve a realistic and meaningful level of release reduction or source elimination . These should also help assist decision-making at the country level . To enhance the practicality of the guidelines and the guidance , the Expert Group should provide commentary on issues and approaches relevant to their implementation . For example , the guidelines and guidance to be developed should take into consideration : The problems and opportunities that might be encountered in implementing BAT and BEP ; The particular circumstances of developing countries and some countries with economies in transition ; Available mechanisms for information exchange of BAT and BEP measures . The work of the Expert Group is technical in nature . Therefore , to enhance the efficiency of the Group and taking into account budgetary constraints , the number of participants in the meetings of the Expert Group should be kept to a manageable number ( a maximum of 50-55 ) in the following proportions : The Expert Group 's meetings shall be open to government-designated experts . Representation from developing countries ( 15 ) , from countries with economies in transition ( three ) and from developed countries ( 18 ) shall be ensured . Representation of all regions should be encouraged ; Intergovernmental ( two ) and non-governmental organizations ( four from environmental non-governmental organizations and four from industrial non-governmental organizations ) may participate as observers . A balanced representation of developing and developed countries is encouraged ; Additional experts shall be invited as needed for each meeting with the status of observer . In order to promote an open and transparent process , regional networking should be encouraged to ensure the input of a broad representation of views and to offset differences in expertise available to countries at varying stages of development . Further , all documents under consideration by the Expert Group shall be made available to all interested parties ( to the extent feasible ) who shall be encouraged to provide written comments . Participants should have expertise in one or more of the following areas : Specialized technical issues or technological overview ; Relevant environmental policy ; or The functioning and provisions of the Stockholm Convention . Funding will be provided for 15 participants from developing countries and three participants from countries with economies in transition ; Funding will be provided for one participant from an environmental non-governmental organization in consultation with the non-governmental organizations . The following meetings are envisaged : First meeting of the Expert Group ( prior to the seventh session of the Intergovernmental Negotiating Committee ) : Possible reference materials : UNEP/POPS/INC.6/CRP.1 - Regional workshop held in Bangkok , Thailand , from 13 to 15 March 2002 , on national action on measures to reduce or eliminate the releases of by-products from unintentional production as requested by the Stockholm Convention on Persistent Organic Pollutants ; UNEP/POPS/INC.6/CRP.6 - Best available techniques ( BAT ) and best environmental practices ( BEP ) for reducing and/or eliminating emission of POPs by-products ; Proceedings of the “ Regional Workshop on National Action on measures to reduce or eliminate the releases of by-products from unintentional production as requested by the Stockholm Convention on Persistent Organic Pollutants ” , Bangkok , Thailand , 13-15 March 2002 ; Proceedings of the “ Workshop for South American Countries on BAT/BEP to Support the Stockholm Convention on Persistent Organic Pollutants ” , Buenos Aires , Argentina , October/November 2002 ( tentatively ) ; Other reference material submitted no later than two months before the meeting ; Seventh session of the Intergovernmental Negotiating Committee : Discussion and adoption of report of the Expert Group of its first meeting ; Second meeting of the Expert Group ; Third meeting of the Expert Group , if necessary ; First meeting of the Conference of the Parties . The Intergovernmental Negotiating Committee shall identify two interim co-Chairs of the Expert Group for the purpose of facilitating the first meeting of the Expert Group . The Expert Group shall at its first meeting elect , from among government representatives , officers to serve as the two co-Chairs . The secretariat of the Stockholm Convention will provide the secretariat for the Expert Group . The Expert Group shall apply , mutatis mutandis , the rules of procedure of the Intergovernmental Negotiating Committee except as otherwise provided in these terms of reference . The secretariat , in consultation with the officers of the Expert Group , shall prepare a provisional agenda for each meeting of the Group . The provisional agenda shall be communicated to all participants of the Expert Group and all interested parties at least six weeks before the start of the meeting . English shall be the working language of the Expert Group . All documents adopted by the Expert Group shall be translated into Arabic , Chinese , French , Russian , and Spanish . The Expert Group shall consider and adopt a report at each meeting to inform the Intergovernmental Negotiating Committee of the results of its discussion ; The reports shall be circulated to all participants of the Expert Group meetings and the Intergovernmental Negotiating Committee at least six weeks in advance of the Intergovernmental Negotiating Committee ; The Expert Group shall present its report on guidelines and provisional guidance for consideration by the Conference of the Parties upon entry into force of the Convention . The Expert Group shall make every effort to reach agreement by consensus among participating Governments on the guidelines on BAT and provisional guidance on BEP that it presents to the Conference of the Parties for its consideration . Should consensus not be reached , all proposals by participating Governments shall be reflected in the report to be submitted to the Conference of the Parties . Annex VIII Statements by representatives of non-governmental organizations The representative of the International POPs Elimination Network ( IPEN ) highlighted activities by IPEN , including specific cases of participation by organizations in more than 40 countries to help reduce and eliminate POPs . He encouraged Governments to involve non-governmental organizations in enabling activities and the preparation and implementation of national implementation plans . The representative of the Worldwide Fund for Nature ( WWF ) reported on its work with a number of intergovernmental organizations to establish the Africa Stockpile Programme which seeks to clean up stockpiled pesticides and pesticide contaminated waste in Africa ; to catalyse development of prevention measures ; and to provide capacity-building and institutional strengthening on important chemicals-related issues . AAnnex IX The underlined subheadings are included in the draft rules for the convenience of work of the Committee and , consistent with rules of procedure of other multilateral environmental agreements , will not be included in the draft rules of procedure to be adopted by the Conference of the Parties . Consideration may be given to staggered terms of office , where the term of office of the President runs from the beginning of the Conference of the Parties to the beginning of the next Conference of the Parties , and the term of office of the Vice-Presidents runs from the closure of the Conference of the Parties to the closure of the next Conference of the Parties . This approach would accommodate the situations where offers to host the Conference of the Parties are made intersessionally or where the host country Party changes during the intersessional period . The Committee may also wish to consider whether to stagger the terms of office of the Vice-Presidents of the Conference of the Parties to enhance continuity and expertise . The following additional rule 26 bis was suggested for further consideration by the legal drafting group : “ Unless otherwise decided by the Conference of the Parties , the present rules shall apply , mutatis mutandis , to the proceedings of any working group or committee established by the Conference of the Parties or by a subsidiary body . ” Precedents for this rule may be found in rules of procedure of Conferences of the Parties of the Convention on Biological Diversity , the Montreal Protocol and the Basel Convention . It was not included in the draft rules of procedure of the Conference of the Parties of the Rotterdam Convention . It is used to make it clear that for subsidiary bodies rule 22 ( 4 ) of the overall rules of procedure , which does not allow the President of the Conference of the Parties to vote at Conference of the Parties meetings , may not be appropriate to apply , mutatis mutandis , to the powers of Chairpersons of subsidiary bodies . The matter can also be dealt with in drafting the rules of procedure and terms of reference for individual subsidiary bodies . As precedent is divided , the Committee may wish to : a ) keep the rule here in the Conference of the Parties rules of procedure , or b ) follow the precedent of the Rotterdam Convention and remove the rule from the Conference of the Parties rules and deal with the issue of voting powers of Chairpersons of subsidiary bodies when drafting their terms of reference and rules of procedure , for example , in the current Persistent Organic Pollutant Review Committee process . There are various procedural rules for decision-making by the Conference of the Parties in the Convention where efforts to reach consensus have been exhausted and consensus could not be reached . These include variations providing for decisions by a three-fourths majority of the Parties present and voting ( see , e. g. , Convention article 20 ( 3 ) and article 21 ( 2 ) and ( 3 ) ) , and variations providing for decisions by consensus ( see , e. g. Convention articles 19(4 ) and 22 ( 5 ) and ( 6 ) ) . With respect to the Conference of the Parties decisions on which the Convention is silent as to procedure , there are various voting options that could be considered ( e. g. , consensus then two-thirds or three-fourths majority , consensus , double majorities , etc. ) . It would also be possible to provide for a single rule of decision that would apply to all such decisions ( as in the current draft formulation of this paragraph ) or to provide and specify that different types of the Conference of the Parties decisions would be subject to different rules of decision ( e. g. , some specified decisions subject to a two-thirds majority vote , while others would be subject to consensus or to some other rule of decision ) . Although this provision is well precedented in other multilateral environmental agreements , a request was made to consider different precedents from other fora . Precedents for this rule exist in the rules of procedure of Conferences of the Parties of the following multilateral environmental agreements : the Convention on Biological Diversity , the Convention to Combat Desertification , the Rotterdam Convention ( draft rules ) and the Basel Convention . One delegation raised a question about the second sentence . The legal drafting group studied the issue and noted that this sentence appears in the rules of procedure for the following multilateral environmental agreements : the Convention on Biological Diversity , the Convention to Combat Desertification , the Rotterdam Convention ( draft rules ) and the Basel Convention . Cross reference with rule 7 shall be revisited by the legal drafting group and examined in order to prevent any potential conflict with the present rule . Different views were expressed in the Committee on whether to use the United Nations scale of assessment . The legal drafting group considered that the issue was a policy question for the Committee to decide . The percentage in the square brackets is the current minimum rate of contribution on the United Nations scale of contributions . If the percentage changes by the time of the first meeting of the Conference of the Parties , the figure will be adjusted accordingly . Precedents for this figure exist in the financial rules of other multilateral environmental agreements . The percentage in the square brackets is the current maximum rate of contribution on the United Nations scale of contributions . If the percentage changes by the time of the first meeting of the Conference of the Parties , the figure will be adjusted accordingly . The legal drafting group noted that , while the majority of the financial rules for multilateral environmental agreements use the word “ due ” , the financial rules of the Convention to Combat Desertification use the word “ expected ” . The legal drafting group requests the secretariat to consult with financial experts on this provision and report back to the legal drafting group . The legal drafting group requests the secretariat to inform it on the practical operation of the present rule . Precedents for this rule and the word “ related ” are found in the financial rules for the following multilateral environmental agreements : the Convention on Biological Diversity , the Montreal Protocol , the Framework Convention on Climate Change and other agreements . Average local cost of conducting an Intergovernmental Negotiating Committee session is approximately US$ 150,000 . This includes equipment rental , paper , facility related expenses , hospitality , etc. Such as exemption register ( UNEP/POPS/INC.6/4 ) , and formats for reporting required under the Convention including those listed in document UNEP/POPS/INC.6/9 . Ref . UNEP/POPS/INC.6/6 and UNEP/POPS/INC.6/7 . This includes maintaining a current and up-to-date list of national focal points , exchange of information with these focal points , and responding to requests for assistance in technical and other matters . Ref . : Decisions INC-6/9 , INC-6/10 and INC-6/11 contained in annex I to the present report . This is a one-time charge . Alternatively , a staff member , including support costs , may be engaged for a two-year period . This also includes developing training and outreach materials , organization and conduct of as well as participation in workshops , and selected training for developing countries and countries with economies in transition . Ref . The Committee 's decision was to maintain the status quo for 2003. No decision was taken for 2004. This mandate is referred to in paragraphs 4 and 7 of resolution 1 on interim arrangements adopted at the Conference of Plenipotentiaries on the Stockholm Convention and under article 5 and annex C of the Convention . 