diff --git a/adclick.php b/adclick.php
index 0d24ab4926ef3eb04b40c357dd486a140084f9e7..694e8d169e4f3d06758cd00c2d584520d4569af4 100644
--- a/adclick.php
+++ b/adclick.php
@@ -38,6 +38,7 @@ $vms->ptc->setCurrentRunningAd( $art, $kampdaten->id, $tan );
     <body>
       <script>
         var notified = false;
+        var VmsPtc = new zPtc();
         var campaign_data = <?php echo json_encode(array('earnings' => $kampdaten->verdienst, 'wait_time' => $kampdaten->aufendhalt, 'ad_type' => $kampdaten->werbeart, 'tan' => $kampdaten->tan)); ?>;
 
         function notify()
diff --git a/content/verdienen/forcedbanner.php b/content/verdienen/forcedbanner.php
index 3bf2cbb1774992b71dd36890529580b4cd901eb3..e1a46956477faecbb344cf9ce775193f7d819c6d 100644
--- a/content/verdienen/forcedbanner.php
+++ b/content/verdienen/forcedbanner.php
@@ -13,11 +13,31 @@ head ('Klickbanner');
 </script>
 
 <script>
+var VmsPtc = new zPtc();
+
 $( document )
 .ready(
     function()
     {
 
+        window.addEventListener("message",
+            function(event)
+            {
+                if ( pageconfig['domain'] != event.origin )
+                {
+                    return;
+                }
+                var art = event.data['art'],
+                    tan = event.data['tan'],
+                    action = event.data['action'];
+                       
+                if( 'adcheck' == action )
+                {
+                    VmsPtc.setAdWindowOpened( art, tan, true );
+                }   
+            }   
+        );
+
         function displayAds(data, status)
         {   
             var useData = jQuery.parseJSON( data );
@@ -28,9 +48,9 @@ $( document )
             }   
         }
 
-        $( "#loadAds_btn").on('click', function(e) { loadAds( 'forcedbanner', 'getNewPtcData', displayAds ) } );
+        $( "#loadAds_btn").on('click', function(e) { VmsPtc.loadAds( 'forcedbanner', 'getNewPtcData', displayAds ) } );
 
-            loadAds( 'forcedbanner', 'getNewPtcData', displayAds );
+            VmsPtc.loadAds( 'forcedbanner', 'getNewPtcData', displayAds );
 
         /*
         * gets executed on click on ad
@@ -52,7 +72,7 @@ $( document )
                 )
                 {
                     $(elem).remove();
-                    openAdWindow( art, tan, sec, use_frame );
+                    VmsPtc.openAdWindow( art, tan, sec, use_frame );
                 }
             }
         );
diff --git a/ext/js/frame_ad.js b/ext/js/frame_ad.js
index 9aa419720b098608eb1c05bceee929450ee1783f..3c792fb7baeb69b08159c854569e103b54d4593b 100644
--- a/ext/js/frame_ad.js
+++ b/ext/js/frame_ad.js
@@ -1,3 +1,5 @@
+// requires var VmsPtc = new zPtc();
+
 notify();
 
 function use_frame_cll( secstatus, data )
@@ -21,14 +23,14 @@ function use_frame_cll( secstatus, data )
     }
 }
 
-startAdCountdown( campaign_data['ad_type'], campaign_data['tan'], campaign_data['wait_time'], use_frame_cll );
+VmsPtc.startAdCountdown( campaign_data['ad_type'], campaign_data['tan'], campaign_data['wait_time'], use_frame_cll );
 
 Visibility.change(
     function (e, state)
     {
         if( 'hidden' == state )
         {
-            invalidateAd( campaign_data['ad_type'], campaign_data['tan'] );
+            VmsPtc.invalidateAd( campaign_data['ad_type'], campaign_data['tan'] );
         }
 
     }
diff --git a/ext/js/ptc.js b/ext/js/ptc.js
index 3277d072307d8a4cc33f2aa8eb4329bf28ec9a35..da5fe1a403f537e99b6c8f23a28e792f38618588 100644
--- a/ext/js/ptc.js
+++ b/ext/js/ptc.js
@@ -1,31 +1,22 @@
+class zPtc {
 
-        var adFenster = new Array();
-
-        window.addEventListener("message", function(event)
-            {
-                if ( pageconfig['domain'] != event.origin )
-                {
-                    return;
-                }
-                var art = event.data['art'],
-                    tan = event.data['tan'],
-                    action = event.data['action'];
-                
-                if( 'adcheck' == action )
-                {
-                    adFenster[art][tan]['opened'] = true;
+        constructor()
+        {
+            this.adFenster = new Array();
+        }
 
-                }
-            }   
-        );
+        setAdWindowOpened( art, tan, ostatus )
+        {
+            this.adFenster[art][tan]['opened'] = true;
+        }
 
-        function checkAdOk( art, tan, use_frame )
+        checkAdOk( art, tan, use_frame )
         {
-            if( 0 !== use_frame || (false == adFenster[art][tan]['checked'] && false == adFenster[art][tan]['window'].closed) )
+            if( 0 !== use_frame || (false == this.adFenster[art][tan]['checked'] && false == this.adFenster[art][tan]['window'].closed) )
             {
                 var pdata = window.btoa(art) + '-' + window.btoa(tan)
                 if( 0 == use_frame )
-                    adFenster[art][tan]['checked'] = true;
+                    this.adFenster[art][tan]['checked'] = true;
                     
                 $.post( "ext/ap/ads.php",
                     {
@@ -47,10 +38,10 @@
         /*
         * if u do something wrong, sorry no matter which ad was active, invalidate 
         */
-        function invalidateAd( art, tan )
+        invalidateAd( art, tan )
         {
-            if(  undefined !== adFenster[art] )
-                adFenster[art][tan]['checked'] = true;
+            if(  undefined !== this.adFenster[art] )
+                this.adFenster[art][tan]['checked'] = true;
 
             var pdata = window.btoa(art) + '-' + window.btoa(tan)
             $.post( "ext/ap/ads.php",
@@ -61,43 +52,41 @@
                 {
                     try
                     {
-                        if( undefined != adFenster[art][tan]['checked'] )
+                        if( undefined != this.adFenster[art][tan]['checked'] )
                             window.open(pageconfig['domain']+'/adcheck.php?data='+pdata, art+'-'+tan, "height=120,width=200");
                     }
                     catch(e) { } // wurscht
                 }
             );
-
-
         }
 
-        async function startAdCountdown( art, tan, sec, use_frame )
+        async startAdCountdown( art, tan, sec, use_frame )
         {
             var sec_done = -1;
             let timer = setInterval( () =>
                 {
                     if( 0 == use_frame )
                     {
-                        if( true == adFenster[art][tan]['checked'] )
+                        if( true == this.adFenster[art][tan]['checked'] )
                         {
                             clearInterval(timer);
                         } else {
                             if(  document.hasFocus() )
                             {
-                                invalidateAd( art, tan );
+                                this.invalidateAd( art, tan );
                                 clearInterval(timer);
                             }
                             try
                             {
-                                if ( adFenster[art][tan]['window'].closed )
+                                if ( this.adFenster[art][tan]['window'].closed )
                                 {
-                                    invalidateAd( art, tan );
+                                    this.invalidateAd( art, tan );
                                     clearInterval(timer);
                                 }
                             }
                             catch (e)
                             {
-                                invalidateAd( art, tan );
+                                this.invalidateAd( art, tan );
                                 clearInterval(timer);
                             }
                         }
@@ -106,7 +95,7 @@
                     {
                         if( sec_done >= sec )
                         {
-                            checkAdOk( art, tan, use_frame );
+                            this.checkAdOk( art, tan, use_frame );
                             clearInterval(timer);
                         }
                         sec_done++;
@@ -118,7 +107,7 @@
             if( 0 == use_frame )
             {
                 await sleep(sec * 1000);
-                checkAdOk( art, tan, 0 );
+                this.checkAdOk( art, tan, 0 );
             }
         }
 
@@ -126,32 +115,32 @@
         /*
         * communicates with ad window, placing detection of actual click
         */
-        function openAdWindow( art, tan, sec, use_frame )
+        openAdWindow( art, tan, sec, use_frame )
         {
-            if ( 'undefined' == typeof adFenster[art] || (! adFenster[art] instanceof Array ) )
+            if ( 'undefined' == typeof this.adFenster[art] || (! this.adFenster[art] instanceof Array ) )
             {
-                adFenster[art] = new Array();
+                this.adFenster[art] = new Array();
             }
 
-            if ( 'undefined' == typeof adFenster[art][tan] || (! adFenster[art][tan] instanceof Array ) )
+            if ( 'undefined' == typeof this.adFenster[art][tan] || (! this.adFenster[art][tan] instanceof Array ) )
             {
-                adFenster[art][tan] = new Array();
+                this.adFenster[art][tan] = new Array();
             }
 
-            if( ( 'undefined' == adFenster[art][tan]['window'] || null == adFenster[art][tan]['window'] ) || adFenster[art][tan]['window'].closed )
+            if( ( 'undefined' == typeof this.adFenster[art][tan]['window'] || null == this.adFenster[art][tan]['window'] ) || this.adFenster[art][tan]['window'].closed )
             {
                 var data = window.btoa(art) + '-' + window.btoa(tan);
-                adFenster[art][tan]['window'] = window.open( pageconfig['domain'] + '/adclick.php?data='+data, "_blank" );
+                this.adFenster[art][tan]['window'] = window.open( pageconfig['domain'] + '/adclick.php?data='+data, "_blank" );
 
-                adFenster[art][tan]['window'].focus();
-                adFenster[art][tan]['opened'] = false;
-                adFenster[art][tan]['checked']= false;
+                this.adFenster[art][tan]['window'].focus();
+                this.adFenster[art][tan]['opened'] = false;
+                this.adFenster[art][tan]['checked']= false;
 
                 if( 0 == use_frame )
                 {
-                    adFenster[art][tan]['window'].onbeforeunload = function()
+                    this.adFenster[art][tan]['window'].onbeforeunload = function()
                     {
-                        startAdCountdown( art, tan, sec, use_frame );
+                        this.startAdCountdown( art, tan, sec, use_frame );
                     }
                 }
             }
@@ -161,7 +150,7 @@
         /*
         * gets executed first, loads available ads and prepares the bootstrap <ul>-list for display
         */
-        function loadAds( ad_type, ad_cat, fn)
+        loadAds( ad_type, ad_cat, fn)
         {
             $.post( "ext/ap/ads.php",
                 {
@@ -171,3 +160,4 @@
                 fn
             );
         }
+}