diff --git a/Example.hs b/Example.hs
--- a/Example.hs
+++ b/Example.hs
@@ -9,8 +9,7 @@
 
 main = do
   let m = manifest [wasmFile "../wasm/code.wasm"]
-  context <- Extism.newContext
-  plugin <- unwrap <$> Extism.pluginFromManifest context m False
+  plugin <- unwrap <$> Extism.createPluginFromManifest m False
   res <- unwrap <$> Extism.call plugin "count_vowels" (Extism.toByteString "this is a test")
   putStrLn (Extism.fromByteString res)
   Extism.free plugin
diff --git a/extism.cabal b/extism.cabal
--- a/extism.cabal
+++ b/extism.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               extism
-version:            0.2.0
+version:            0.3.0
 license:            BSD-3-Clause
 maintainer:         oss@extism.org
 author:             Extism authors
diff --git a/src/Extism.hs b/src/Extism.hs
--- a/src/Extism.hs
+++ b/src/Extism.hs
@@ -79,12 +79,24 @@
         return $ Left (ExtismError e)
       else
         return $ Right (Plugin c p))
+      
+-- | Create a 'Plugin' with its own 'Context'
+createPlugin :: B.ByteString -> Bool -> IO (Result Plugin)
+createPlugin c useWasi = do
+  ctx <- newContext
+  plugin ctx c useWasi
 
 -- | Create a 'Plugin' from a 'Manifest'
 pluginFromManifest :: Context -> Manifest -> Bool -> IO (Result Plugin)
 pluginFromManifest ctx manifest useWasi =
   let wasm = toByteString $ toString manifest in
   plugin ctx wasm useWasi
+
+-- | Create a 'Plugin' with its own 'Context' from a 'Manifest'
+createPluginFromManifest :: Manifest -> Bool -> IO (Result Plugin)
+createPluginFromManifest manifest useWasi = do
+  ctx <- newContext
+  pluginFromManifest ctx manifest useWasi
 
 -- | Update a 'Plugin' with a new WASM module
 update :: Plugin -> B.ByteString -> Bool -> IO (Result ())
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -9,45 +9,45 @@
 
 defaultManifest = manifest [wasmFile "../../wasm/code.wasm"]
 
-initPlugin :: Context -> IO Plugin
-initPlugin context =
-  Extism.pluginFromManifest context defaultManifest False >>= unwrap
+initPlugin :: Maybe Context -> IO Plugin
+initPlugin Nothing =
+  Extism.createPluginFromManifest defaultManifest False >>= unwrap
+initPlugin (Just ctx) =
+  Extism.pluginFromManifest ctx defaultManifest False >>= unwrap
 
 pluginFunctionExists = do
-  withContext (\ctx -> do
-    p <- initPlugin ctx
-    exists <- functionExists p "count_vowels"
-    assertBool "function exists" exists
-    exists' <- functionExists p "function_doesnt_exist"
-    assertBool "function doesn't exist" (not exists'))
+  p <- initPlugin Nothing
+  exists <- functionExists p "count_vowels"
+  assertBool "function exists" exists
+  exists' <- functionExists p "function_doesnt_exist"
+  assertBool "function doesn't exist" (not exists')
 
 checkCallResult p = do
-    res <- call p "count_vowels" (toByteString "this is a test") >>= unwrap
-    assertEqual "count vowels output" "{\"count\": 4}" (fromByteString res)
+  res <- call p "count_vowels" (toByteString "this is a test") >>= unwrap
+  assertEqual "count vowels output" "{\"count\": 4}" (fromByteString res)
 
 pluginCall = do
-  withContext (\ctx -> do
-    p <- initPlugin ctx
-    checkCallResult p)
+  p <- initPlugin Nothing
+  checkCallResult p
 
 pluginMultiple = do
-  withContext (\ctx -> do
-    p <- initPlugin ctx
+  withContext(\ctx -> do
+    p <- initPlugin (Just ctx)
     checkCallResult p
-    q <- initPlugin ctx
-    r <- initPlugin ctx
+    q <- initPlugin (Just ctx)
+    r <- initPlugin (Just ctx)
     checkCallResult q
     checkCallResult r)
 
 pluginUpdate = do
   withContext (\ctx -> do
-    p <- initPlugin ctx
+    p <- initPlugin (Just ctx)
     updateManifest p defaultManifest True >>= unwrap
     checkCallResult p)
 
 pluginConfig = do
   withContext (\ctx -> do
-    p <- initPlugin ctx
+    p <- initPlugin (Just ctx)
     b <- setConfig p [("a", Just "1"), ("b", Just "2"), ("c", Just "3"), ("d", Nothing)]
     assertBool "set config" b)
 
